ThinkPHP5 ブラウザが閉じられ、php スクリプトの実行が継続される

現在、スケジュールされたタスクは、 Mipu ブログでの記事の定期的な公開、スパム メッセージの定期的なクリーンアップ、電子メールの定期的な送信、 Mipu エージェントによるテキスト メッセージのリマインダーの送信など、Web サイトの必須要件です。

現在の Web サイトのほとんどは PHP 動的言語を使用して開発されています。PHP には Java や .Net などの AppServer の概念はなく、http プロトコルはステートレス プロトコルです。PHP はユーザーによってトリガーされて呼び出されるだけで、自動的に実行されます。常駐メモリがなければ、接続が長いスケジュールされたタスクを実装することは一般に不可能です。

では、PHP でスケジュールされたタスクを実装する必要がある場合、どのような方法があるのでしょうか? Mipu Blog のこの記事には、いくつかの解決策がまとめられています。

1.単純・直接・無謀タイプ

<?php
    ignore\_user\_abort();                // 关掉浏览器,PHP脚本也可以继续执行.
    set\_time\_limit(0);                  // 通过set\_time\_limit(0)可以让程序无限制的执行下去
    ini\_set('memory\_limit','1024M');    // 设置内存限制
    $interval = 60\*30;                  // 每隔半小时运行
    do{
      // ToDo mimvp task
      sleep($interval);                 // 等待5分钟
    }
    while(true);
?>

**欠点:** 一度起動すると、PHP ホストを終了しない限り制御できないため、ハッカーでない限り、この方法は通常お勧めできません。

2. シンプルで制御可能

  
<?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 mimvp task
  sleep($interval);     // 等待5分钟
}
while(true);

config.php を変更してプログラムを停止するにはreturn 0 ,、 config.php ファイルと特別なフォームを操作し、構成用の HTML ページを通じていくつかの変数を設定することが考えられます。

**短所:** システムリソースを占有し、長時間実行すると予期せぬ危険が潜む可能性があります。たとえば、メモリ管理、誰かが悪意を持って設定ファイルを変更した場合などです。

3. 簡易改良型

<?php
    $time \= 15;
    $url \= "http://".$\_SERVER\['HTTP\_HOST'\].$\_SERVER\['REQUEST\_URI'\];
 
    //  ToDo mimvp task
 
    sleep($time);
    file\_get\_contents($url);
?>

php スクリプトはしばらくスリープし、駅伝のように自身にアクセスして実行を続けます。

これにより、各 PHP スクリプトの実行時間が長くなりすぎず、制限がなくなりますtime_out

php ファイルの各サイクルは独立して実行されるため、この方法ではtime_out制限は回避されますが、プロセスを終了できるように、上記のように制御コード cofig.php を追加することをお勧めします。

4. 自分で整理する

ignore\_user\_abort();
//即使Client断开(如关掉浏览器),PHP脚本也可以继续执行.
set\_time\_limit(0);
//执行时间为无限制,php默认的执行时间是30秒,通过set\_time\_limit(0)可以让程序无限制的执行下去
$time = 15;
    $url \= "http://".$\_SERVER\['HTTP\_HOST'\].$\_SERVER\['REQUEST\_URI'\];
 
    //  ToDo mimvp task
 
    sleep($time);
    file\_get\_contents($url);

この記事はhttps://www.cnblogs.com/Im-Victor/p/15901857.htmlからの転載です。権利侵害がある場合は、削除のためにご連絡ください。

おすすめ

転載: blog.csdn.net/qq_35606400/article/details/130211679