web-dev-qa-db-ja.com

php /var/www/html/*.phpは、メニューから開くターミナルで動作しませんphp * .phpは、php保持フォルダー内で開いているターミナルで動作します

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.logphp /var/www/html/cron/cron_job.phpに追加し、構文エラーのあるスクリプトを使用してメニュー端末から(php /var/www/html/cron/cron_job.php 2> /tmp/php.log)を実行しようとすると、エラーログにエラーメッセージが表示されます。

4
Naga

スクリプトはほぼ確実に実行され、ファイルを作成しています。期待する場所に作成しないだけです。スクリプトでパスを使用せず、ファイル名を使用します。これは、スクリプトが実行されているディレクトリにファイルが作成されることを意味します。

だから、特定のディレクトリに移動してそこでスクリプトを実行すると、それが機能すると思うのです。ファイルは実行したディレクトリに作成されるため、表示できます。デフォルトでは、cronは、それを実行しているユーザーのホームディレクトリで実行されます。これはルートのcrontabであるため(これは悪いアイデアです)、ファイルは/rootに作成されます。だから、チェックしてください:

Sudo ls /root/test.txt

そのため、次回は、スクリプトにファイル名だけではなくフルパスを指定します。

<?php file_put_contents  ('/path/to/test.txt',"test content\n",FILE_APPEND); ?>

これで、ファイルは/path/toに作成されます。

11
terdon

デフォルトでは、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
6
pa4080