ホームページ  >  記事  >  バックエンド開発  >  スケジュールされたタスクの PHP 実装の原理分析

スケジュールされたタスクの PHP 実装の原理分析

黄舟
黄舟オリジナル
2017-11-14 09:37:502396ブラウズ

phpスケジュールタスクとは何かご存知ない方も多いと思いますが、日々の開発においてphpプログラムはタスクプランを実行して定期的に実行する必要があることが多いので、今日はphpスケジュールタスク原理分析を実現します!

php マニュアル に基づいて、関連する知識を簡単に紹介します:

1. 接続処理:

PHP 内部では、システムは接続ステータスを維持しており、そのステータスには 3 つの状況が考えられます。 :

  • 0 - NORMAL (正常)

  • 1 - ABORTED (異常終了)

  • 2 - TIMEOUT (タイムアウト)

PHP スクリプトが NORMAL 状態で正常に実行されると、接続は有効です。リモート クライアントが切断されると、ABORTED ステータス フラグがオンになります。リモート クライアント接続の中断は通常、ユーザーが [STOP] ボタンをクリックしたことによって発生します。接続時間が PHP の制限時間を超えると、TIMEOUT ステータス フラグがオンになります。

クライアントが切断されたときにスクリプトを終了する必要があるかどうかを決定できます。スクリプトの出力を受け入れるリモート ブラウザがない場合でも、スクリプトを完全に実行すると便利な場合があります。デフォルトでは、リモート クライアント接続が失われたときにスクリプトが終了します。

この処理は、php.ini の ignore_user_abort によって、または Apache .conf の対応する "<code>php_valueignore_user_abort" および ignore_user_abort によって実行できます。 code> settings () 関数を制御します。 ignore_user_abort 或由 Apache .conf 设置中对应的"php_value ignore_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.相关函数:

int ignore_user_abort ( [bool setting] ) 
This function sets whether a client disconnect should cause a script to be aborted. 
It will return the previous setting and can be called without an argument to not change the current setting and only return the current setting. 
int connection_aborted ( void ) 
Returns TRUE if client disconnected. 
int connection_status ( void ) 
Returns the connection status bitfield.

为了定时更新某一文件,需要程序自动运行,从网上搜到了两种方法:ignore_user_abort()crontab

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(&#39;test.txt&#39;,&#39;a&#39;); 
fwrite($fp,&#39;test&#39;); 
fclose($fp); 
sleep($interval); // 等待5分钟 
}while(true);

只要运行上面的页面,然后关掉,程序就会一直运行下去。

Linux 下有种更简单的方法,就是crontab命令

crontab命令的功能是在一定的时间间隔调度一些命令的执行。

crontab 使用方法: crontab [ -e | -l | -r ] 文件名
PHP がユーザーの中断を無視するように指示されていない場合、register_shutdown_function() によってシャットダウン トリガー関数が設定されていない限り、スクリプトは中断されます。このクローズ トリガー関数により、リモート ユーザーが STOP ボタンをクリックし、スクリプトがデータを再度出力しようとすると、PHP は接続が中断されたことを検出し、クローズ トリガー関数を呼び出します。

  • スクリプトは、組み込みのスクリプト タイマーによって中断される場合もあります。デフォルトのタイムアウト制限は 30 秒です。この値は、php.ini の max_execution_time を設定するか、 Apache .conf 設定の対応する "php_value max_execution_time" パラメータを設定することで設定できます。 code>set_time_limit( ) 関数を変更します。


    カウンターがタイムアウトになると、上記の接続中断状況と同様にスクリプトが終了し、事前に登録されたシャットダウントリガー関数もこの時に実行されます。シャットダウン トリガー関数では、 connection_status() 関数を呼び出すことで、タイムアウトによってシャットダウン トリガー関数が呼び出されたかどうかを確認できます。

  • タイムアウトによりシャットダウントリガー関数が呼び出された場合、関数は 2 を返します。

  • 注意すべき点は、 ABORTED 状態と TIMEOUT 状態が同時に有効になる可能性があることです。

  • これは、PHP にユーザー終了アクションを無視するように指示する場合に可能です。 PHP はユーザーが切断されたことを認識しますが、スクリプトはまだ実行中です。実行時間制限に達すると、スクリプトは終了し、設定されたシャットダウン トリガー関数も実行されます。この時点で、関数 connection_status() が 3 を返すことがわかります。

2. 関連関数:


* * * * * Command

特定のファイルを定期的に更新するには、プログラムを自動的に実行する必要があります。ignore_user_abort() という 2 つのメソッドがインターネットから見つかりました。 crontab

ignore_user_abort() 関数は、set_time_limit(0) および sleep($interval) とともに使用されます。プログラム更新の自動操作を実現するための例です

コードは次のとおりです:

*/5 * * * * lynx http://www.php.cn

上記のページを実行して閉じる限り、プログラムは引き続き実行されます。走る。



Linux では、より簡単な方法があります。それは、crontab コマンドです。

crontab コマンドの機能は、特定の時間間隔でいくつかのコマンドの実行をスケジュールすることです。

crontabの使用法: crontab [ -e | -l | -r ] ファイル名


-e: タスク情報を表示

-r: 実行予定タスク情報の削除

🎜crontab形式: 🎜🎜
0 8 * * * lynx http://www.php.cn
🎜時間、日、月、週単位で実行するコマンド🎜🎜🎜crontabの例: 🎜🎜
0 10 6 * 1-5 lynx http://www.php.cn
🎜5分ごとにwwwにアクセス 。 php.cn🎜🎜
0 5 7 8 * lynx http://www.php.cn
🎜毎日午前8時にwww.php.cn🎜🎜rrreee🎜にアクセスしてください🎜🎜rrreee🎜毎月6日と毎週月曜日から金曜日の午前10時にwww.php.cn🎜🎜rrreee🎜にアクセスしてください🎜www.php.cn、8 月 7 日午前 5 時🎜🎜🎜🎜 上記のいくつかの特別な意味: 🎜🎜🎜「*」は値の範囲内のすべての数値を表し、「/」はすべての意味を表し、「*/5」は「」は 5 単位ごとを意味し、「-」は特定の数値から特定の数値までを意味し、「,」は複数の離散的な数値を区切ります。 🎜🎜🎜🎜🎜概要: 🎜🎜🎜🎜この記事を学習することで、多くの友人が PHP スケジュールされたタスクの実装原理が何であるかを理解できるはずです。これがあなたの仕事に役立つことを願っています。 🎜

関連する推奨事項:

計画されたタスクの PHP の例

計画されたタスクの実装と継続的プロセスの例 fsockopen

php スケジュールされたタスク

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

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