PHP でスケジュールされたタスクを実装するいくつかの方法
ここ数日、PHP を使用して Web ページを定期的にクロールするサーバー アプリケーションを作成する必要があり、オンラインで解決策を検索したところ、質問に対する OSchina の回答が非常に興味深いものであることがわかりました。
いくつかの解決策が提案されています。要約は次のとおりです。
1.単純、直接的、無謀なタイプ
ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行. set_time_limit(0);// 通过set_time_limit(0)可以让程序无限制的执行下去 $interval=60*30;// 每隔半小时运行 do{ //ToDo sleep($interval);// 等待5分钟 }while(true);欠点: 一度開始すると、PHP ホストを終了しない限り制御できません。ハッカーでない限り、この方法は使用しないでください。
2. シンプルで制御可能
config.php
return 1;<!--?php return 1; ?-->cron.php
ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行. set_time_limit(0);// 通过set_time_limit(0)可以让程序无限制的执行下去 $interval=60*30;// 每隔半小时运行 do{ $run = include 'config.php'; if(!$run) die('process abort'); //ToDo sleep($interval);// 等待5分钟 }while(true);
config.php の return 0 を変更してプログラムを停止します。実行可能な方法は、config.php ファイルと特別なフォームを操作し、HTML ページを通じていくつかの変数を設定することです。
短所: システムリソースを消費し、長時間実行すると予期せぬ隠れた危険を引き起こす可能性があります。たとえば、メモリ管理の問題などです。
3. 簡易改良型
$time=15; $url="http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; /* function */ sleep($time); file_get_contents($url);PHP スクリプトのスリープは、一定時間経過後に自身にアクセスすることで実行を継続します。これにより、各 PHP スクリプトの実行時間が長くなりすぎることがなくなります。タイムアウト。
この方法では、php ファイルの各ループが独立して実行されるため、time_out 制限を回避できますが、プロセスを終了できるように、上記のように制御コードを追加するのが最善です。 4. cronTab タイプ
プログラムでは、popen を使用して、同時実行性を制御するために実行中のプロセスの数を決定します
cControlJobNum(1); while (true) { <your code> <动态sleep> } function cControlJobNum($job_limit) { $cmd = @popen("ps -ef | grep '{$_SERVER['SCRIPT_FILENAME']}' | grep -v grep | wc -l", 'r'); $num = @fread($cmd, 512); $num += 0; @pclose($cmd); if($num > $job_limit) { exit; } return true; }5. BAE または sae の cron サービスを使用します。
6. vps を購入し、crontab を使用します