2017-01-05 5 views
3

Caseдата время Carbon отличается

Использование Middleware, Session & Carbon, чтобы проверить, если session/shopping cart создается longer than 20 minutes ago поэтому сеанс может быть промыты. (Маршруты сгруппированы внутри промежуточного слоя)

Текущие данные выполняется на Ферме, но одни и те же проблемы возникают на мой живой сайт, который выполняется на сервере Digital Ocean

class CheckCart 
{ 
    public function handle($request, Closure $next) 
    { 
     // Defining current timestamp 
     $now = Carbon::now(); 

     // created_at from the session 
     $created_at = $request->session()->get('created_at'); 

     // If the cart count is == 1, & created_at is null -> put created at date in session 
     if (Cart::count() == 1 && $created_at == null) { 
      $request->session()->put('created_at', $now); 
     } 

     // If created at date + 20 minutes is earlier than current time, flush (empty) session 
     if ($created_at != null) { 
      if ($created_at->addMinutes(20) < $now) { 
       $request->session()->flush(); 
      } 
     } 
     return $next($request); 
    } 
} 

задачи

  • Local time из моего Macbook является 2017-01-06 00:00
  • Carbon::now() является 2017-01-05 23:25
  • created_at временные метки (который был в конечном счете установлен Carbon::now()) является 2017-01-06 03:20

Как эти временные метки могут отличаться так много, и особенно, как может created_at который определяется Carbon::now() в какой-то момент быть менее 7 часов спустя?

  • Все часовые пояса являются Europe/Amsterdam

image with code & timestamps

+0

Вы используете это в Homestead или какой-либо другой VM? Или просто используя сервер Valet/PHP – jackel414

+0

, как «Carbon :: now()» сравнивается с значением, которое вы получаете при запуске «date» в командной строке Homestead? Ваша временная метка VM отличается от временной метки вашего macbook и, следовательно, может быть не такой – jackel414

ответ

1

Проблема с $created_at->addMinutes(20). Каждый раз, когда ваш код запускается (с обновлением, запросом или чем-то еще), он добавляет 20 минут к значению сеанса. Тогда есть также проблема, о которой упоминалось в комментариях о том, что время Homestead отличается от вашей реальной машины.

Чтобы решить проблему created_at, вам следует сделать копию этого файла, выполнив: $created_at->copy()->addMinutes(20). Примените этот трюк со всем своим другим кодом, где на самом деле нужна копия вместо самого объекта. Надеюсь, это поможет!