13

現在、file_get_contents() を使用して GET データをサイトの配列に送信していますが、ページを実行すると次のエラーが発生します。

致命的なエラー: 最大実行時間の 30 秒を超えました

私が本当にスクリプトに実行させたいのは、Web ページの読み込みを開始してから終了することだけです。各 Web ページが完全に読み込まれるまで最大 5 分かかる場合がありますが、完全に読み込む必要はありません。

これが私が現在持っているものです:

        foreach($sites as $s) //Create one line to read from a wide array
        {
                file_get_contents($s['url']); // Send to the shells
        }

編集:混乱を避けるために、このスクリプトは、データを返さない他のサーバーでスクリプトを開始するために使用されています。

編集:私は今、cURL を使用してトリックを実行しようとしています。タイムアウトを 1 秒に設定して、データを送信してから停止します。これが私のコードです:

        $ch = curl_init($s['url']); //load the urls
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); //Only send the data, don't wait.
        curl_exec($ch); //Execute
        curl_close($ch); //Close it off.

オプションの設定を間違えたのかもしれません。私たちが話している間、私はいくつかのマニュアルに目を通しています。最新情報をお届けします。これまで私を助けてくれた皆さんに感謝します。

編集:ああ、問題が見つかりました。CURLOPT_TIMEOUT の代わりに CURLOPT_CONNECTTIMEOUT を使用していました。おっと。

ただし、現在、スクリプトはトリガーされていません。それぞれが ignore_user_abort(TRUE); を使用します。だから問題が理解できない

はぁ、スクラッチ。今すぐ動作します。どうもありがとう

4

6 に答える 6

6

これを解決するには多くの方法があります。

cURLとその curl_multi_* 関数を使用して、リクエストを非同期的に実行できます。または、一般的な方法で cURL を使用しますが、タイムアウト制限として 1 を使用すると、要求してタイムアウトを返しますが、要求は実行されます。

cURL がインストールされていない場合は、引き続き file_get_contents を使用できますが、 ZendX_Console_Process_Unixなどを使用してプロセスを fork (それほどクールではありませんが、機能します) することで、各リクエスト間の待機を回避できます。

于 2010-04-18T18:02:55.370 に答える
2

操作をトリガーするだけでよいことを更新してください。

file_get_contentsタイムアウトで使用してみてください。これにより、リモート スクリプトが呼び出されますが、接続は n 秒 (たとえば 1) 後に終了します。

接続が中断されても実行し続けるようにリモート スクリプトが構成されている場合 (PHP ではignore_user_abort)、動作するはずです。

やってみて。time_limitそれが機能しない場合は、外部実行可能ファイルを増やしたり、使用したりすることはできません。しかし、あなたが言っていることから-あなたはただ要求をする必要があります-これはうまくいくはずです. タイムアウトを に設定することもできますが0、私はそれを信用しません。

ここから:

<?php
$ctx = stream_context_create(array(
    'http' => array(
        'timeout' => 1
        )
    )
);
file_get_contents("http://example.com/", 0, $ctx);
?>

公平を期すために、クリスの答えにはすでにこの可能性が含まれていますcurl。タイムアウトスイッチもあります。

于 2010-04-18T16:20:13.013 に答える
2

フランコが述べたように、私はそれが取り上げられたかどうかはわかりませんが、通常のcurl関数ではなく、特にcurl_multi関数を使用したいと考えています。これにより、複数のcurlオブジェクトがcurl_multiオブジェクトにパックされ、それらが同時に実行され、到着したときに応答が返されます(または返されません)。

http://php.net/curl_multi_initの例

于 2011-03-20T12:56:20.437 に答える
1

あなたのスクリプトの背後にある意味を完全には理解していません。しかし、ここでできることは次のとおりです。

  1. 致命的なエラーをすばやく回避するには、ファイルの先頭に set_time_limit(120) を追加するだけです。これにより、スクリプトを 2 分間実行できます。もちろん、任意の数を使用でき、0 は無限です。
  2. URL を呼び出すだけで、結果を気にしない場合は、cUrl を非同期モードで使用する必要があります。この場合、URL への呼び出しは終了するまで待機しません。そして、それらすべてを非常にすばやく呼び出すことができます。

BR。

于 2010-04-18T19:13:18.057 に答える
1

それほど多くの時間を消費するのは file_get_contents() ではなく、ネットワーク接続そのものです。
GET データを多数のサイトに送信するのではなく、RSS を作成して RSS データを取得できるようにすることを検討してください。

于 2010-04-18T16:23:47.047 に答える
1

リモート ページの読み込みに最大 5 分かかる場合、file_get_contents はその 5 分間待機します。リモート スクリプトを変更してバックグラウンド プロセスにフォークし、そこで重い処理を行う方法はありますか? そうすれば、最初のヒットはほぼすぐに返され、起動期間を待つ必要がなくなります。

もう 1 つの可能性は、HEAD リクエストで問題が解決するかどうかを調べることです。HEAD はデータを返さず、ヘッダーのみを返すため、完全な出力を待たずにリモート ジョブをトリガーするだけで十分な場合があります。

于 2010-04-18T20:19:42.193 に答える