なぜかcronでだけfile_put_contentsできない不思議現象に悩まされる
最初phpには以下のように記述してました。file_put_contents( "./log/1d.log", $data LOCK_EX );
でもこれではなぜかcronが実行されてもlogフォルダにファイルができない……。cronではなく手動で実行すると特にエラーも出ず、ファイルもきちんと生成される。
パーミッションも問題ない。
ではなぜか?
cronでfile_put_contentsが上手く実行できない原因は相対パス
実はめちゃくちゃシンプルな理由で、作成するファイルのパスがきちんと通ってなかったことが原因でした……!つまり使っていた相対パスでは、cronで実行した際に全然違う場所を見てしまう。
なので相対パスではなく、絶対パスを使おう!というお話なのです。
でも絶対パスだと /home/aaa/bbb.com/public_html/ みたいな感じで書かなきゃいけないし、ローカルと本番サーバーで書き方も変わってしまうので、 以下のようにphpの記述を書き換えたら、あっさりcronでログ出力が定期実行されるようになりました。
file_put_contents( __DIR__.DIRECTORY_SEPARATOR."log".DIRECTORY_SEPARATOR."1d.log", $data, LOCK_EX );
教訓:file_put_contentsは__DIR__を活用して絶対パスで書くクセを付けよう
一応解説しておくと、__DIR__はそのphp自体があるディレクトリを指す便利な定数。これ一発で同じフォルダを指定できる。なお後ろにスラッシュは付かないので注意。
今回はその一つ下にあるlogフォルダに作成したいので、そこまでのパスを後ろに追加しています。
念のため、スラッシュではなくDIRECTORY_SEPARATORも使いましょう。環境に合わせた適切な区切り文字にしてくれます。
ということで、file_put_contentsを使うときは必ず__DIR__を使って記述するほうが良さそうです。