PHPスクリプトをcronから実行したい。 cronをセットアップします:
*/1 * * * * php /var/www/html/cron/cron_job.php
crontab -u root -l
で確認できますが、ジョブは実行されません。次のようにコマンドラインから直接コマンドを実行しても機能しません:
<?php /var/www/html/cron/cron_job.php
Cronに関連する多くの回答を試しましたが、何も機能しませんでした。例えば:
/usr/local/bin /var/www/html/cron/cron_job.php
/usr/local/bin/php /var/www/html/cron/cron_job.php
Sudo php -f /var/www/html/cron/cron_job.php
テスト用のphpスクリプト(cron_job.php
)は次のとおりです。
php file_put_contents ('test.txt',"test content\n",FILE_APPEND);
ファイルのパーミッションはすべてOKで、ブラウザで実行するとき、または/var/www/html/cron/
でターミナルを開いてphp cron_job.php
を実行するときに機能します。
コメントで要求されているように、2> /tmp/php.log
をphp /var/www/html/cron/cron_job.php
に追加し、構文エラーのあるスクリプトを使用してメニュー端末から(php /var/www/html/cron/cron_job.php 2> /tmp/php.log
)を実行しようとすると、エラーログにエラーメッセージが表示されます。
スクリプトはほぼ確実に実行され、ファイルを作成しています。期待する場所に作成しないだけです。スクリプトでパスを使用せず、ファイル名を使用します。これは、スクリプトが実行されているディレクトリにファイルが作成されることを意味します。
だから、特定のディレクトリに移動してそこでスクリプトを実行すると、それが機能すると思うのです。ファイルは実行したディレクトリに作成されるため、表示できます。デフォルトでは、cron
は、それを実行しているユーザーのホームディレクトリで実行されます。これはルートのcrontabであるため(これは悪いアイデアです)、ファイルは/root
に作成されます。だから、チェックしてください:
Sudo ls /root/test.txt
そのため、次回は、スクリプトにファイル名だけではなくフルパスを指定します。
<?php file_put_contents ('/path/to/test.txt',"test content\n",FILE_APPEND); ?>
これで、ファイルは/path/to
に作成されます。
デフォルトでは、Cronジョブはユーザーのホームディレクトリで実行されます。スクリプトには、出力ファイルを保存するパスが指定されていませんが、スクリプトが実行されるディレクトリに保存されます。
PHPにファイルtest.txt
へのパスがありません。 @terdonの answer で説明されているように絶対値として設定するか、(適切なOriginを使用して)相対パスとして指定できます。たとえば、test.txt
shuldがcron_job.php
と同じディレクトリにある場合、スクリプトのコンテンツは次のようになります。
<?php
$path = realpath(dirname(__FILE__));
file_put_contents ("$path/" . 'test.txt',"test content\n",FILE_APPEND);
?>
または、スクリプトを変更したくない場合は、次の方法でCronジョブを変更できます。
*/1 * * * * cd /var/www/html/cron/ && php cron_job.php