
なぜか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__を使って記述するほうが良さそうです。

Googleの画像検索でサイズ指定できなくなった!⇒復活させる方法
子供の頃から、指の間を毛布や布団の端でスリスリするクセが抜けないのだが
【悪用厳禁】Twitterで呟いた瞬間にアカウントロックされる危険なNGワード
Windows 10 1909から20H2のアップデートに失敗し続けるエラー原因(成功までに行った解決策全部)
METAMASKは複数PC間でアカウント共有可能! 公式に認められてる使い方です、一台のみは嘘!