ホームページ  >  記事  >  バックエンド開発  >  スケジュールされたタスクの PHP の例

スケジュールされたタスクの PHP の例

零下一度
零下一度オリジナル
2017-06-23 14:34:441778ブラウズ

同社が使用する予定のタスクはおおよそ次のとおりです:

*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testOne >/dev/null 2>&1*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testTwo >/dev/null 2>&1

出力と標準エラーが空のデバイスにリダイレクトされることがわかります。これには特定の理由があります。いくつかの情報を確認したので、ここに説明します。

1. SSH 経由でサーバーにログインします。
2. 次のコードで新しい php ファイル test.php を作成します。

<?php
sleep(50);
echo "aaa\n";
file_put_contents("/tmp/test.txt",time());?>

3. 次のコマンドを使用して、 test.php プログラム

$ php test.php &amp;

/tmp/test.txt ファイルの内容を 1497613738 として表示します

4. 次に、次のコマンドを再度実行します。コマンドの実行後、すぐに exit コマンドを使用してログアウトします

$ php test.php &amp;

5 次に、ssh 経由でサーバーにログインし、/tmp/test.txt ファイルの内容がまだ 1497613738 であることを確認します。これは、test.phpを2回目に実行したときに、file_put_contents関数が実行されなかったか、正常に実行されなかったことを意味します。

6 file_put_contents関数は実行されません。

7 理由:
ログアウトして再度ログインすると EIO エラーが発生するのはなぜですか?これは Linux セッション処理に関連しています。
ユーザーが ssh 経由でサーバーにログインすると、セッションが開始されます。セッションが開始されると、標準入力 (stdin)、標準出力 (stdout)、および標準エラー (stderr) が対応する端末 (pty) に接続されます。

ユーザーがログインすると、標準出力がターミナルに反映されます。標準出力のファイルハンドルは1です。したがって、phpのecho("aaan")

により、システムコールwrite(1, "aaan", 4)が実行され、ターミナルにaaanが書き込まれます。

ユーザーがログアウトするとセッションは終了します。セッションの終了時に、ターミナルで開いているすべてのファイル ハンドルを読み取りおよび書き込みできないように変更します。

ユーザーがログアウトしてから write(1, "aaan", 4) を実行すると、EIO エラーが報告されます。端末ハンドルが書き込み可能ではなくなったためです。 EIO エラーが発生すると、プロセスは終了します。

解決策

方法 1:
リダイレクト記号 & を使用して、標準出力をホールにリダイレクトします。

正常情况下的追踪:
strace -p


方法 2: nohup を使用します。

Process 1475 attached
restart_syscall(<... resuming interrupted call ...>) = 0write(1, "aaa\n", 4aaa
)                    = 4lstat("/tmp/test.txt", 0x7ffe792ebe90)  = -1 ENOENT (No such file or directory)
lstat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=65536, ...}) = 0open("/tmp/test.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3fstat(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0lseek(3, 0, SEEK_CUR)                   = 0write(3, "1497614186", 10)              = 10close(3)                                = 0munmap(0x7f4840239000, 528384)          = 0close(2)                                = 0close(1)                                = 0munmap(0x7f4847510000, 4096)            = 0close(0)                                = 0munmap(0x7f4847511000, 4096)            = 0sched_getaffinity(1475, 128, {ffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) = 128sched_setaffinity(0, 128, {ffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) = 0munmap(0x7f48404c8000, 2119936)         = 0munmap(0x7f48406ce000, 2345056)         = 0munmap(0x7f4840b39000, 2162536)         = 0munmap(0x7f484090b000, 2282472)         = 0munmap(0x7f4840d49000, 323584)          = 0exit_group(0)                           = ?
+++ exited with 0 +++[1]+  Done                    php test.php
手順:

プロセスを実行していて、アカウントからログアウトしてもプロセスが終了しないと思われる場合は、 nohup コマンドを使用できます。

このコマンドは、アカウントからログアウトした後、またはターミナルを閉じた後も、対応するプロセスを実行し続けることができます。 nohup は電話を切らない (n ohang up) という意味です。

弊社では最初の方法を採用しています。 /dev/
null
2 >&

1 &の説明は別記事をご覧ください

以上がスケジュールされたタスクの PHP の例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。