crontabを使用しないPHPバックグラウンドスクリプトの実行

ここで私を困惑させて、PHPでデーモンを作成しました。 つまり cron'aを使用せずに、特定のアクションを実行するために、ランダムな時間(常にランダム)に指定された時間内に指定された回数だけ実行されるスクリプト。



それ以前は気にしませんでしたが、タスクを設定した後、ブラウザからphpスクリプトを呼び出すことは不可能だと考え始めました...タスクが設定されたため、実行する必要がありました



最初の考えは、スクリプトの実行時間制限を無効にすることです。 ホスティング業者によって禁止されています。



2番目の考えは、javascriptを使用してajaxリクエストを定期的に(少なくとも1秒間に1回)繰り返すことです。 -それは不可能です(顧客の要求)。



実際、ブラウザーを開いてはならず、クラウンを使用してはならず、スクリプトはユーザーとは無関係に無期限に機能する必要があることが判明しました。 当然、彼は少なくともシステムをロードする必要があります。



1.タバコ、夜、グーグル、ドック、本、マニュアルのパック....

後藤1 ...



出力は次のとおりです。

Task_1:

指定された回数と時間に基づいて、スクリプトランタイムジェネレーターを実装します。 これらの時間をどこかに保管してください。



Task_2:

ブラウザを閉じた後に作業する



Task_3:

スクリプト実行時間制限の終了後にクラッシュしないでください



Task_4:

適切なタイミングでいくつかのアクションを実行します。



だから...

構成に初期データを書き込みます。



session_start(); //   $num_starts = 120; //       $hours = 1; //  ,       $num_starts . $time_sec = $hours*3600; //      $time_to_start = array(); // ,     ignore_user_abort(1); //     
      
      







次に、起動時間の生成に役立つ関数を作成します。

その中で、0から元の間隔の秒数までの乱数を生成します。

 /****** * @desc    . */ function add_time2start() { global $time_sec, $time_to_start; $new_time = time()+rand(0, $time_sec); if (!in_array($new_time, $time_to_start)) { //       -  $time_to_start[] = $new_time; } else { add_time2start(); //      -  . } }
      
      







次に、起動時間の配列を生成してセッションに書き込みます。 早い時間が最初になるように、昇順で配列を事前に並べ替えます(タイムマシンを作成することができませんでした)。



 $k = 1; if ($_SESSION["num_st"] == "" || $_SESSION["num_st"][$num_starts-1] < time()) { // ,            . do { add_time2start($k); $k++; } while ($k < = $num_starts); sort($time_to_start, SORT_NUMERIC); $_SESSION["num_st"] = $time_to_start; }
      
      







サーバーで設定された最大実行時間に注意を払わずに、スクリプトを機能させる必要があります。

原則は次のとおりです。

1)スクリプトの開始時間を決定します。

2)設定された制限時間を決定します。

3)サイクルを開始し、内部で現在の時間を計算してスクリプトの合計時間を計算し、現在の時間を開始時間の配列の値と比較し、一致する場合は指定されたアクションを実行します(exec.phpファイルにあります)。 ソケットを使用してファイルを実行します。

4)スクリプトが許可されている最大値に近づくまでサイクルを繰り返します。 設定-最大時間まで5秒が残るまで。



だから...私たちは時間通りに初期データを考慮します:



 $start_time = microtime(); //     $start_array = explode(" ",$start_time); //     $start_time = $start_array[1]; //     $max_exec = ini_get("max_execution_time"); //     
      
      





実際には、サイクル。 コード内のコメント。



 do{ $nowtime = time(); //   ////          ...... if (in_array($nowtime, $_SESSION["num_st"])) { //         $http = fsockopen('test.ru',80); ///            fputs($http, "GET http://test.ru/exec.php?".session_name()."=".session_id()."&nowtime=$nowtime HTTP/1.0\r\n"); fputs($http, "Host: test.ru\r\n"); fputs($http, "\r\n"); fclose($http); } ////    //     ,       $now_time = microtime(); $now_array = explode(" ",$now_time); $now_time = $now_array[1]; //       $exec_time = $now_time - $start_time+$exec_time; ///    usleep(1000000); // ,    .     . if (file_exists("stop.txt")) exit; //  ,      //  5 ,   . } while($exec_time < ($max_exec - 5));
      
      







さて、許可された時間が終了したら、サイクルを終了し、他のプロセスで同じスクリプトを安全に実行します(5秒で正しくなります)



 //           $http = fsockopen('test.ru',80); fputs($http, "GET http://test.ru/index.php?".session_name()."=".session_id()."&bu=$max_exec HTTP/1.0\r\n"); fputs($http, "Host: test.ru\r\n"); fputs($http, "\r\n"); fclose($http);
      
      







実際、準備ができています。

さらに、私はそれらのアクションを実行するのに多くの問題を抱えていました。そこで、与えられたリンク上のリンクを検索するロボットを書かなければなりませんでした。



すべてを終えると、便利なアプリケーションに戸惑いました...サービスとして使用できます。 彼は、ネットワーク上の何かを監視し、たとえばメールで通知することができます。 クローンは必要ありません。



スクリプトはまだ最適化できます-リビジョンで動作しませんでした。

ちなみに、これは私が自分自身を引き離すことができなかったものです。最初にスクリプトを実行するには、ブラウザを開く必要があります。



All Articles