1

私がする必要があるのは、PHP を使用して、データベースで保留中の複数の要求を処理することです。

私が現在やろうとしているのは、私のcronjobが実行されたときです。ファイル「process_a.php」を、処理が完了するのを待たずに、即座に 10 回呼び出したいと考えています (process_a.php には数分かかる場合があります)。

CURLを使用してこれを実行しようとしました。しかし、cronjob が process_a.php を呼び出すと、処理が終了して戻るのを待ってから、別の process_a.php ファイルを呼び出します。

接続を即座に閉じて、バックグラウンドで処理を続行するコードを process_a.php に入れてみました。しかし、cronjob はまだ終了するのを待っていました。

同じファイルを一度に 10 回実行したいだけです。たとえば、10 人の異なるユーザーが私の Web サイトの index.php ページをリクエストした場合のように... 何かアイデアはありますか!?

4

3 に答える 3

2

10のプロセスに分岐します。

 <?php
 for($i = 0; $i < 10;$i++){
     $pid = pcntl_fork():
     if ($pid == -1) {
          trigger_error('could not fork');
     } else if (!$pid) {
          //we are the child now
           require 'process_a.php';
     } else {
         // we are the parent, you could do something here if need be.
     }
 }

...しかし、そのprocess_a.phpは、Webサイトが実行するすべてのことを実行できるので、ページを呼び出すのではなく、ページ要求がもたらす実際の作業を実行してみませんか?そして、Webサーバーを、肥大化したスクリプトリポジトリではなくWebサーバーであり続けましょう。

于 2012-06-19T19:54:17.927 に答える
2

@Bradが語ったように、curl-multi-execはオプションである必要があります。

http://php.net/manual/en/function.curl-multi-exec.php

    <?php
//create the multiple cURL handle
$mh = curl_multi_init();

// create both cURL resources
for($i = 0; $i < 10;$i++){
     $ch[$i] = curl_init();
     curl_setopt($ch[$i], CURLOPT_URL, "http://urhost//path/to/process_a.php");
     curl_setopt($ch[$i], CURLOPT_HEADER, 0);
     curl_multi_add_handle($mh,$ch[$i]);//add the handles
}

$active = null;

//execute the handles
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

//close the handles
for($i = 0; $i < 10;$i++){
     curl_multi_remove_handle($mh, $ch[$i]);
}
curl_multi_close($mh);

?>

以下の別のスクリプトを呼び出して、このスクリプトをテストしました。

<?php 
print microtime();//Return current Unix timestamp with microseconds 
print '<br>';
?>

これが結果です。各ハンドルの実行時間はマイクロ秒単位で異なります。

0.27085300 1340214659
0.44853600 1340214659
0.46611800 1340214659
0.48201000 1340214659
0.50209400 1340214659
0.48233900 1340214659
0.52274300 1340214659
0.54757800 1340214659
0.57316900 1340214659
0.59475800 1340214659
于 2012-06-19T20:03:38.070 に答える
1

完全な cron を利用できますか、それとも php ファイルしか指定できませんか?

xargs を使用して、-P引数で 10 個のプロセスをフォークできる場合があります

seq `1 10`|xargs -n1 -P10 php /path/to/file.php
于 2012-06-19T19:54:43.333 に答える