memo

Laravelのクーロンでtimezoneがずれている原因はlaravel側だった!

さきに結論。

LaravelでDBを自動更新するクーロン設定したものの、MySQLに書き込まれる時間がずれていたので、実際にいつ実行されているのかと、書き込まれる時間を修正するべくいろいろ調べた結果、Laravelのconfig/app.phpにあるtimezoneを設定することで解決しました。

Laravelでクーロン設定したけど正しい時間に動いているのかどうか不安

Laravelは自分でコマンドをつくりKernel.phpのscheduleに書き込むことで指定した時間に実行することができます。

毎日、DBを更新するために、
app/Console/Commands/UpdateCommande.php
というコマンドファイルをつくり、

app/Console/Kernel.php
に下記のように毎日実行される処理を書きました。

$schedule->command('command:update')->daily();

これ、MySQLのテーブルでcreated_atをみると0:00になっているのですが、なんとなくずれている感じです。

コマンドラインから

$date

とやると、CentOS7の方の時間はちゃんとJSTで正しい時間が表示されます。

この時間がずれるのは、MySQLの問題なのかどうかと悩み友人に相談したところ、

「それ、phpの時間じゃね?」

ということでした。

ぐぐってみると、php.iniでphpのタイムゾーンが設定できるということで、

PHPでタイムゾーンを設定する – Qiita

まずはphp.iniの場所を確認

$php --ini

↑ -は2つ

これで、php.iniファイルの場所がわかるので、

$sudo vim /etc/php.ini

これで、php.iniファイルが編集できます。

date.timezone = "Asia/Tokyo"

これで、timezoneの設定が完了。

app/Console/Kernel.php
で、どんな時間で書き込まれるか確認するため、everyFiveMinutesにしてみます。

$schedule->command('command:update')->everyFiveMintues();

5分経ったはずなので、phpMyAdminからMySQLをチェックしたところ、まだ反映されていません。

もしかして、何か間違えたかも?と思い、

Storage/logs/laravel.log
をチェックしたところ、

[2018-05-10 09:23:01] local.ERROR: Method everyFiveMintues does not exist

なんかエラーがでています。

よくみてみると

誤り : everyFiveMintues();
正解 : everyFiveMinutes();

単純にタイプミスしていました。

今度は大丈夫だろうとおもい、phpMyAdminからMySQLをチェックしたところ、
残念ながら、タイムゾーンは変わっていません。

調べると、php.iniを反映させるにはapacheを再起動する必要がるので、

$sudo reboot

してみます。

再度、確認。でも、反映されていません。

しょうがないので、phpinfo()を表示させてみます。

NewImage

不思議なことに、date.timezoneはphp.iniの設定が反映されているのに、Default timezoneはUTCのままです。

なぜ?

もしかしたら、Laravelのせい?

とおもってぐぐったら、以下の記事を発見。

LaravelのtimezoneをJST(日本標準時)へ変更する – Qiita

まさにドンピシャ。

Config/app.php

にて、

'timezone' => 'UTC',

これがデフォルトの状態。これをAsia/Tokyoになおします。

'timezone' => 'Asia/Tokyo',

これで、再度、phpinfo();をみてみると

NewImage

おお!無事に変更された!!!

ちなみに、先程のqiitaにて、php artisan tinkerからtimezoneを確認する方法も記述されていました。

NewImage

これで多分大丈夫でしょう!