10
<?php
 while(true){
 //code goes here.....
 }
  ?>

PHP Webサーバーを作成したいのですが、このスクリプトをCurlで永久に実行するにはどうすればよいですか?

4

4 に答える 4

23

最大実行時間をinfinite(0)に設定することを忘れないでください。

意図している場合は、複数のインスタンスを実行しないようにすることをお勧めします。

ignore_user_abort(true);//if caller closes the connection (if initiating with cURL from another PHP, this allows you to end the calling PHP script without ending this one)
set_time_limit(0);

$hLock=fopen(__FILE__.".lock", "w+");
if(!flock($hLock, LOCK_EX | LOCK_NB))
    die("Already running. Exiting...");

while(true)
{

    //avoid CPU exhaustion, adjust as necessary
    usleep(2000);//0.002 seconds
}

flock($hLock, LOCK_UN);
fclose($hLock);
unlink(__FILE__.".lock");

CLIモードの場合は、ファイルを実行するだけです。

Webサーバー上の別のPHPで、次のように細かく実行する必要があるPHPを起動できます(cURLを使用する代わりに、これにより依存関係がなくなります)。

$cx=stream_context_create(
    array(
        "http"=>array(
            "timeout" => 1, //at least PHP 5.2.1
            "ignore_errors" => true
        )
    )
);
@file_get_contents("http://localhost/infinite_loop.php", false, $cx);

または、次のようにwgetを使用してLinuxcronから開始することもできます。

`* * * * * wget -O - http://localhost/infinite_loop.php`

または、次の内容を含む.batファイルを実行しているbitsadminを使用してWindowsスケジューラから開始することもできます。

bitsadmin /create infiniteloop
bitsadmin /addfile infiniteloop http://localhost/infinite_loop.php
bitsadmin /resume infiniteloop
于 2012-06-21T06:45:20.107 に答える
3

phpコードを永久に実行するには、ffが必要です。

  • set_time_limit(0);//非常に長い処理時間がかかる作業を行う場合、phpは通常どおり終了しません
  • ページをアクティブに保つためのハンドラー[通常、同じページを定期的に呼び出すようにクライアント側のスクリプトを設定することにより]を参照してくださいsetInterval()setTimeout()

編集:しかし、cronジョブを設定するので、クライアント側の処理を避けることができます。

編集:私の提案は、しばらくしてループを終了するように指示するコードがない限り、無限ループを使用しないことです。cronジョブを使用して同じページを呼び出すため、ループを無限に保つ意味がないことを忘れないでください。[編集]それ以外の場合は、@ Tiberiu-Ionuț Stanによって提案されたロックシステムが必要になるため、cronジョブが呼び出されるたびに実行できるインスタンスは1つだけです。

于 2012-06-21T06:42:34.540 に答える
1

PHPには実行時間制限があるため、デフォルトではありません。参照:http ://www.php.net/manual/en/info.configuration.php#ini.max-execution-time

値を設定するかset_time_limit、スクリプト(http://php.net/manual/en/function.set-time-limit.php)を呼び出すことで、永久に実行することができます。

ただし、PHP(HTTPリクエストによって呼び出される)は無限ループを持つように設計されていないため、これはお勧めしません。可能であれば、代わりにローカルスクリプトを使用するか、タスクを頻繁に実行するために定期的にページを要求してください。

あなたのウェブサイトが他の人によって頻繁に閲覧されている場合は、代わりにすべてのページでこれを行うことができます。

(そして、誰かがスクリプトを複数回要求した場合、スクリプトの複数のインスタンスが実行されることを想像してください)

于 2012-06-21T06:38:34.167 に答える
0

スクリプトでset_time_limit(0)を設定した場合にのみ発生させることができます。そうしないと、構成でmax_execution_timeが設定された後に実行が停止します。

また、while(true)条件を使用しているため、スクリプトは常に実行されます。

于 2012-06-21T06:41:44.440 に答える