ホームページ >バックエンド開発 >PHPチュートリアル >PHP におけるスケジュールされたタスクの実装原理の分析
この記事では、PHP でのスケジュールされたタスクの実装原理を紹介します。必要な方は参照してください。
PHP マニュアルに従って、いくつかの関連知識を簡単に紹介します。接続処理:
PHP 内部では、システムが接続ステータスを維持しており、そのステータスには 3 つの状況が考えられます: 0 - NORMAL (正常)
1 - ABORTED (異常終了)
2・ TIMEOUT(タイムアウト)
NORMAL状態でPHPスクリプトが正常に動作している場合、接続は有効です。リモート クライアントが切断されると、ABORTED ステータス フラグがオンになります。リモート クライアント接続の中断は、通常、ユーザーが [STOP] ボタンをクリックしたことによって発生します。接続時間が PHP の制限時間を超えると、TIMEOUT ステータス フラグがオンになります。
クライアントが切断されたときにスクリプトを終了する必要があるかどうかを決定できます。リモート ブラウザがスクリプトの出力を受け入れない場合でも、スクリプトを完全に実行すると便利な場合があります。デフォルトでは、リモート クライアント接続が失われたときにスクリプトが終了します。この処理は、php.ini のignore_user_abort によって、または Apache .conf 設定の対応する "php_valueignore_user_abort" およびignore_user_abort() 関数によって制御できます。 PHP がユーザーの中断を無視するように指示されていない場合、 register_shutdown_function() によってシャットダウン トリガー関数が設定されない限り、スクリプトは中断されます。このクローズ トリガー関数により、リモート ユーザーが STOP ボタンをクリックし、スクリプトがデータを再度出力しようとすると、PHP は接続が中断されたことを検出し、クローズ トリガー関数を呼び出します。
スクリプトは、組み込みのスクリプト タイマーによって中断される場合もあります。デフォルトのタイムアウト制限は 30 秒です。この値は、php.ini で max_execution_time を設定するか、Apache .conf 設定の対応する「php_value max_execution_time」パラメータまたは set_time_limit() 関数を設定することで変更できます。カウンタがタイムアウトすると、上記の接続中断状況と同様にスクリプトが終了し、事前に登録されたシャットダウン トリガー関数もこの時点で実行されます。シャットダウン トリガー関数では、connection_status() 関数を呼び出すことで、タイムアウトによってシャットダウン トリガー関数が呼び出されたかどうかを確認できます。タイムアウトによりシャットダウントリガー関数が呼び出された場合、関数は 2 を返します。
注意すべき点は、ABORTED 状態と TIMEOUT 状態が同時に有効になる可能性があることです。これは、PHP にユーザー終了アクションを無視するように指示する場合に可能です。 PHP はユーザーが切断されたことを認識しますが、スクリプトはまだ実行中です。実行時間制限に達すると、スクリプトは終了し、設定されたシャットダウン トリガー関数も実行されます。この時点で、関数 connection_status() が 3 を返すことがわかります。
2. 関連関数:
intignore_user_abort ( [bool settings] ) この関数は、クライアントの切断によってスクリプトが中止されるかどうかを設定し、前の設定を返します。引数なしで呼び出すと、現在の設定を変更せず、現在の設定のみを返すことができます。
int connection_aborted ( void )
クライアントが切断された場合に TRUE を返します。
int connection_status ( void )
接続を返します。ステータス ビットフィールド
特定のファイルを定期的に更新するには、プログラムを自動的に実行する必要があります。ignore_user_abort() と crontab という 2 つのメソッドを見つけました。
ignore_user_abort() 関数は set_time_limit(0) と組み合わせられています。 sleep($interval)、つまり、プログラムを自動的に実行して更新できます。次に例を示します。
ignore_user_abort(); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行. set_time_limit(0); // 执行时间为无限制,php默认的执行时间是30秒,通过set_time_limit(0)可以让程序无限制的执行下去 $interval=60*5; // 每隔5分钟运行 do{ $fp = fopen('test.txt','a'); fwrite($fp,'test'); fclose($fp); sleep($interval); // 等待5分钟 }while(true);
Linux には、crontab コマンドというより簡単な方法があります。
crontab コマンドの機能は、特定の時間間隔でいくつかのコマンドの実行をスケジュールすることです。
crontab 使用方法: crontab [ -e | -l | -r ] ファイル名 -e: タスクの編集 -l: タスク情報の表示 -r: 実行予定タスク情報の削除 crontab 形式:
* * * * * コマンド
時間、日、月、週ごとに実行するコマンド
crontab 例:
*/5 * * * * lynx //www.php.cn
5 分ごとにアクセス www .php.cn
0 8 * * * lynx //www.php.cn
0 にアクセスしてください 10 6 * 8 時に 1 ~ 5毎朝 lynx //www.php.cn
0 5 7 8 * lynx //www.php .cn
8 月 7 日の午前 5 時に www.php.cn にアクセスしてください。
上記にはいくつかの特別な意味があります。
「*」は値の範囲内のすべての数値を表し、「/」はすべての意味を表します。「*/5」 「」は 5 単位ごとを意味し、「-」は特定の数値から特定の数値までを意味し、「,」は複数の離散的な数値を区切ります。
上記がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。
関連する推奨事項:
PHP による疑似静的インジェクションの分析PHP のスコープ解決演算子 (: :) を使用する# #############################以上がPHP におけるスケジュールされたタスクの実装原理の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。