Как уменьшить виртуальную память, оптимизируя мой PHP-код?

В моем текущем коде (см. Ниже) используется 147 МБ виртуальной памяти! Мой провайдер по умолчанию выделил 100 Мбайт, и процесс был убит после запуска, что вызвало внутреннюю ошибку. Код использует 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); } ?> 

Согласно вашему последнему комментарию ..

Загрузить 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(); ?> 

Просматривая ваши вопросы, я увидел этот комментарий :

Если целью является захват домена, то использование одного из установленных сервисов является лучшим вариантом . Реализация вашего скрипта не так важна, как фактическое соединение и латентность.

Я согласен с этим комментарием.

Кроме того, вы, кажется, разместили «тот же вопрос» примерно семьсот раз :

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

Как настроить сервер для быстрого запуска PHP-скрипта?
Как я могу перекодировать мой PHP-скрипт для работы как можно быстрее?
Как запустить cURL один раз, проверить доступность домена в цикле? Помогите исправить код пожалуйста
Помогите исправить код php / api / curl, пожалуйста
Как уменьшить виртуальную память, оптимизируя мой PHP-код?
Перекрытие запросов HTTPS?
Несколько запросов https .. как?

Разве не тот факт, что вы снова и снова задаете один и тот же вопрос, скажите, что вы делаете это неправильно ?

Этот комментарий :

@mario: Привет. Я конкурирую с 2 другими компаниями за конкретные ccTLD. Они новеньки в игре, и они затягивают эти домены медленным временем (до 10 секунд после продувки). На данный момент я немного медленнее.

Я уверен, что PHP на учетной записи с общедоступным хостингом – это неправильный инструмент для использования, если вы серьезно пытаетесь победить две компании, выбирая истекшие доменные имена.

Результат каждого из 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'); 

Получение правильного дескриптора файла в обратном вызове остается проблемой для решения проблемы.

 <?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); ?>