0

内部メモリを設定するオプションについて知っています

ini_set("memory_limit","30M");

しかし、データをクエリするためのより良いアプローチがあるかどうか知りたいですか?

さらに1000レコードを照会する必要があるかどうかを確認するWHILELOOPがあります。オフセットを開始レコード番号として使用し、制限を返されるレコードとして使用して、データ要求に一致するすべてのレコードを検索します。エラーが発生する前に、レコードで約100Kに達しました。

テスト中に、「致命的なエラー:許可されたメモリサイズ...」エラーが発生することがわかりました。上記のini_set()を設定してメモリを増やすことで読みましたが、もっとうまくコーディングできるかどうか知りたいですか?

WHILE LOOPで以下のコードを実行するたびに、メモリ使用量が非常に大きくなります。設定を解除しても($ curl)。次のcURLクエリの前に結果を解析した後、$result変数と$curl変数の設定を解除できれば、削減できると思います。

function getRequest($url,$user,$pwd) {

    $curl = curl_init();

    curl_setopt($curl, CURLOPT_VERBOSE, 1);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 2);
    curl_setopt($curl, CURLOPT_HEADER, 0);
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_USERPWD, "$user:$pwd");
    curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    curl_setopt($curl, CURLOPT_ENCODING, '');
    curl_setopt($curl, CURLOPT_URL, $url);

    $result = curl_exec($curl);

    $httpResponseCode = (int)curl_getinfo($curl, CURLINFO_HTTP_CODE);

    switch ($httpResponseCode) {
        case 500:
            // Send problem email
            break;
        case 200:
            // GET was good
            break;
        default:
            // Send problem email
            break;
    }    
    curl_close($curl);
    return $result;
} 

WHILE LOOP(スリムバージョン)

while($queryFlag) { // $queryFlag is TRUE

        // Check if we have more records to query, if not set $queryFlag to FALSE

        // Build cURL URL

        echo "Before Call Memory Usage: ".memory_get_usage()."\n";
        $resultXML  = getRequest($query,$user,$pass);
        echo "After Call Memory Usage: ".memory_get_usage()."\n";

        $results        = new ParseXMLConfig((string)$resultXML); // This is basically a class for $this->xml = simplexml_load_string($xml);

        // Loop through results and keep what  I'm looking for
        foreach($results as $resultsKey => $resultsData) {
            if(preg_match('|^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$|i', $resultsData)) {
                $resultsArr["$resultsData"] = $resultsData;
            }
        }

    }

いくつかのメモリ番号

  • 呼び出しメモリ使用量の前:1819736
  • 呼び出し後のメモリ使用量:2285344
  • 必要なデータを保持する
  • 不要なデータをダンプする
  • 次のLOOP反復
  • 呼び出しメモリ使用量の前:2084128
  • 呼び出し後のメモリ使用量:2574952
4

2 に答える 2

0

に間違ったキーを使用していると思います。キーと値の両方と同じ文字列を使用しています。$resultsArr

変更してみてください

$resultsArr["$resultsData"] = $resultsData

$resultsArr[$resultsKey] = $resultsData
于 2010-08-26T19:02:04.647 に答える
0

解決済み:

ini_set("memory_limit","30M");
于 2010-08-31T15:09:01.560 に答える