2010-08-26 3 views
0

Я знаю о возможности установить внутреннюю памятьPHP Curl для больших наборов данных

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

Но я хотел бы знать, если есть лучший подход для запроса данных?

У меня есть WHILE LOOP, который проверяет, нужно ли мне запрашивать еще 1000 записей. с использованием смещения в качестве стартового номера записи и лимита в качестве возвращаемых записей, я ищу все записи, соответствующие моему запросу данных. Я ударил около 100 тыс. Записей, прежде чем я получу ошибку.

Теперь во время тестирования я обнаружил, что получил ошибку «Fatal error: Allowed memory ... ...». Я прочитал, установив вышеприведенный ini_set(), чтобы увеличить объем памяти, но я хотел знать, могу ли я просто правильно его кодировать?

Каждый раз, когда я выполняю код ниже в WHILE LOOP, использование памяти становится очень большим. Даже если я отключу ($ curl). Я думаю, что это можно было бы уменьшить, если бы я смог отключить переменные $ result и $ curl после того, как я проанализировал результаты перед следующим запросом 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._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$|i', $resultsData)) { 
       $resultsArr["$resultsData"] = $resultsData; 
      } 
     } 

    } 

Некоторые номера памяти

  • Перед использованием вызова памяти: 1819736
  • После использования вызовов памяти: 2285344
  • сохранить данные I необходимо
  • d УМЗ данные мне не нужно
  • Следующая итерацию
  • Перед использованием вызова памяти: 2084128
  • После использования вызовов памяти: 2574952
+1

Можете ли вы показать нам время цикла, а также, пожалуйста? – Charles

+0

У вас установлен xdebug? Это может дать вам полезную информацию. – bogeymin

+0

WHILE LOOP в порядке, я делаю memory_get_usage() перед cURL и после вызова cURL, и здесь память становится сумасшедшей. Цикл while проверяет, нужно ли снова запрашивать запрос. если записи больше, чем последние 1000 возвращенных. Выбирает результат и толкает нужные данные в массив. Я проверил, была ли проблема с массивом, но она очень маленькая, всего лишь сто записей с минимальными данными в каждой записи. –

ответ

0

довольствовалась:

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

Я думаю вы используете неправильный ключ для $resultsArr , Вы используете ту же строку, что и ключ и значение.

Try изменения

$resultsArr["$resultsData"] = $resultsData 

в

$resultsArr[$resultsKey] = $resultsData 
+0

да, это желаемая структура массива –

Смежные вопросы