3

私の現在のコード (以下を参照) は、147MB の仮想メモリを使用しています! 私のプロバイダーはデフォルトで 100MB を割り当てており、プロセスが実行されると強制終了され、内部エラーが発生します。コードは curl multi を使用しており、仮想メモリを最小限に抑えながら、150 回を超える反復でループできる必要があります。以下のコードは 150 回の反復のみに設定されており、依然として内部サーバー エラーが発生します。90 回の反復では問題は発生しません。

リソースの使用量や仮想メモリを減らすためにコードを調整するにはどうすればよいですか?

ありがとう!

<?php

    function udate($format, $utimestamp = null) {
      if ($utimestamp === null)
        $utimestamp = microtime(true);
      $timestamp = floor($utimestamp);
      $milliseconds = round(($utimestamp - $timestamp) * 1000);
      return date(preg_replace('`(?<!\\\\)u`', $milliseconds, $format), $timestamp);
    }

$url = 'https://www.testdomain.com/';
$curl_arr = array();
$master = curl_multi_init();

for($i=0; $i<150; $i++)
{
    $curl_arr[$i] = curl_init();
    curl_setopt($curl_arr[$i], CURLOPT_URL, $url);
    curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl_arr[$i], CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($curl_arr[$i], CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_multi_add_handle($master, $curl_arr[$i]);
}

do {
    curl_multi_exec($master,$running);
} while($running > 0);

for($i=0; $i<150; $i++)
{
    $results = curl_multi_getcontent ($curl_arr[$i]);
    $results = explode("<br>", $results);
      echo $results[0];
      echo "<br>";
      echo $results[1];
      echo "<br>";
      echo udate('H:i:s:u');
      echo "<br><br>";
      usleep(100000);
}

?>
4

3 に答える 3

2

あなたの最後のコメントの通り..

ダウンロードしRollingCurl.phpます。

願わくば、これで API から生きた日光を十分にスパムすることができます。

<?php

$url = '________';
$fetch_count = 150;
$window_size = 5;


require("RollingCurl.php");

function request_callback($response, $info, $request) {
    list($result0, $result1) = explode("<br>", $response);
    echo "{$result0}<br>{$result1}<br>";
    //print_r($info);
    //print_r($request);
    echo "<hr>";
}


$urls = array_fill(0, $fetch_count, $url);

$rc = new RollingCurl("request_callback");
$rc->window_size = $window_size;
foreach ($urls as $url) {
    $request = new RollingCurlRequest($url);
    $rc->add($request);
}
$rc->execute();

?>

あなたの質問を見て、私はこのコメントを見ました:

目的がドメイン スナッチングである場合は、確立されたサービスのいずれかを使用することをお勧めします。スクリプトの実装は、実際の接続と待ち時間ほど重要ではありません。

私はそのコメントに同意します。

また、「同じ質問」を約700 回投稿したようです。

https://stackoverflow.com/users/558865/icer
https://stackoverflow.com/users/516277/icer

サーバーを調整して、PHP スクリプトをより速く実行するにはどうすればよいですか?
PHP スクリプトを再コーディングして、できるだけ速く実行するにはどうすればよいですか?
ループでドメインの可用性をチェックして、cURLを1回実行する方法は? コードの修正を手伝ってください
php/api/curl コードの修正を手伝ってください
PHP コードを最適化して仮想メモリを減らす方法は?
HTTPS リクエストが重複していますか?
複数の https リクエスト..方法は?

何度も同じ質問をしなければならないという事実は、あなたが間違っていることを教えてくれませんか?

あなたのこのコメント:

@mario: 乾杯。私は、特定の ccTLD をめぐって他の 2 社と競合しています。彼らはゲームに不慣れで、遅い時間 (パージ時間後最大 10 秒) でそれらのドメインをスナップアップしています。現時点では、私は少し遅いです。

期限切れのドメイン名の取得で 2 つの企業に真剣に勝とうとしている場合、共有ホスティング アカウントでの PHP の使用は不適切なツールであると確信しています。

于 2011-01-02T23:19:24.400 に答える
0
<?php

echo str_repeat(' ', 1024); //to make flush work

$url = 'http://__________/';
$fetch_count = 15;
$delay = 100000; //0.1 second
//$delay = 1000000; //1 second


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);


for ($i=0; $i<$fetch_count; $i++) {

    $start = microtime(true);

    $result = curl_exec($ch);

    list($result0, $result1) = explode("<br>", $result);
    echo "{$result0}<br>{$result1}<br>";
    flush();

    $end = microtime(true);

    $sleeping = $delay - ($end - $start);
    echo 'sleeping: ' . ($sleeping / 1000000) . ' seconds<hr />';
    usleep($sleeping);

}

curl_close($ch);

?>
于 2010-12-31T03:18:26.927 に答える
0

150 個のクエリのそれぞれの結果が PHP メモリに格納されていますが、あなたの証拠によると、これでは不十分です。唯一の結論は、メモリに 150 個のクエリを保持できないということです。メモリ バッファの代わりにファイルにストリーミングする方法を用意するか、単にクエリの数を減らして URL のリストをバッチで処理する必要があります。

ストリームを使用するにはCURLOPT_RETURNTRANSFER、0 に設定して のコールバックを実装する必要がありますCURLOPT_WRITEFUNCTION。PHP マニュアルに例があります。

http://www.php.net/manual/en/function.curl-setopt.php#98491

function on_curl_write($ch, $data)
{
  global $fh;
  $bytes = fwrite ($fh, $data, strlen($data));
  return $bytes;
}

curl_setopt ($curl_arr[$i], CURLOPT_WRITEFUNCTION, 'on_curl_write');

コールバックで正しいファイル ハンドルを取得することは、リーダーが解決する問題として残されています。

于 2010-12-31T01:47:55.210 に答える