Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CURL расходует много памяти! Помогите найти/исправить косяк! 
:(
    Опции темы
kanaris
Дата 29.10.2010, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 16.2.2008

Репутация: нет
Всего: -1



Всем привет!

Создал многопоточный скрипт прокси-чекер (за счет функций curl_multi_*).
Проверяет прокси, одновременно в 10-20 потоков.
Как только ответ от прокси получен, дескриптор удаляется, на его место ставится следующее прокси.

Поставил работать скрипт, работает довольно быстро. Но где-то на 950-м прокси компьютер затормозил. В диспетчере задач файл подкачки использован почти под завязку!
Трассировал хДебагом, он показывает изменения памяти максимум мегабайт на 5. Но фактически файл подкачки увеличивается в объеме мегабайт на 500-1000!

Вот скрин диспетчера:
user posted image

Сам скрипт:

Код

$test_url='http://example.com/';
$max_threads=20;

$proxylist=file_get_contents('http_proxy.txt');

$sep=explode("\n",$proxylist);
$proxylist=array();
foreach($sep as $v){
    $r=explode(':',$v);
    $proxylist[]=array(
        'host'=>$r[0],
        'port'=>$r[1]
    );
}

$chs = array();
foreach($proxylist as $v){
    $ch=curl_init();
    curl_setopt_array($ch,array(
        CURLOPT_URL=>$test_url,
        CURLOPT_HEADER=>true,
        CURLOPT_RETURNTRANSFER=>true,
        CURLOPT_FAILONERROR=>false,
        CURLOPT_PROXY=>$v['host'],
        CURLOPT_PROXYPORT=>$v['port'],
        CURLOPT_CONNECTTIMEOUT=>10,
        CURLOPT_TIMEOUT=>20,
    ));
    $chs[]=$ch;
}

$result=array();
$active_threads=array();
$active=0;
$queue_pointer=0;
$mh=curl_multi_init();

do{// выполняется, пока все не будет выполнено
    if($active<$max_threads && $queue_pointer<count($chs)){// добавить в очередь
        curl_multi_add_handle($mh,$chs[$queue_pointer]);
        $queue_pointer++;
    }
    $mrc=curl_multi_exec($mh,$active);
    //$active_threads[]=$active;
    $r=curl_multi_info_read($mh);
    if(is_array($r)){// если готов какой-нибудь контент, записать
        $content=curl_multi_getcontent($r['handle']);
        $info=curl_getinfo($r['handle']);
        //foreach($chs as $k=>$curldsc)if($curldsc==$r['handle']){curl_close($chs[$k]);unset($chs[$k]);} // ---- не помогает
        curl_multi_remove_handle($mh,$r['handle']);
        curl_close($r['handle']);

        $result[]=array(
            'content'=>$content,
            'info'=>$info,
            'code'=>$r['result'],
        );

        /*unset($r['handle']);  ---- тоже не помогает
        unset($content);
        unset($info);
        unset($r);*/
        
    }
}while(($mrc==CURLM_CALL_MULTI_PERFORM || $active) && file_get_contents('stop.txt')=='');

curl_multi_close($mh);




Как решить проблему?

Это сообщение отредактировал(а) kanaris - 16.4.2015, 21:22
PM MAIL   Вверх
masp
Дата 29.10.2010, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 22.2.2007

Репутация: нет
Всего: 2



попробуй на UNIXе   запустить,
а также читал где то unset реально не осовбождает память,
http://www.rsdn.ru/forum/web/2194680.flat.aspx
и вот ещё
http://rmcreative.ru/blog/post/utechki-pamjati-v-php
PM MAIL ICQ   Вверх
Pfailed
Дата 28.11.2010, 22:06 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: нет
Всего: 39



Может быть не складывать в массив?
Код

$result[]=array(
            'content'=>$content,
            'info'=>$info,
            'code'=>$r['result'],
        );


Не удивительно, что это может сожрать память.



--------------------
PM MAIL   Вверх
kanaris
Дата 6.12.2010, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 16.2.2008

Репутация: нет
Всего: -1



Цитата

Не удивительно, что это может сожрать память.


даже если я закоментирую это, всеравно жрет.
PM MAIL   Вверх
topy
Дата 6.12.2010, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.2.2008

Репутация: нет
Всего: 1



Как вам уже написали, попробуйте на Unix`е запустить.
Говорят, что curl.exe некорректно работает.
PM MAIL   Вверх
vfz4z
Дата 22.12.2011, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 3.6.2010

Репутация: нет
Всего: нет



дайте мне список прокси и я сам запущу этот скрипт... Очень походе что память не освобождает curl. У меня под рукой так-же несколько win серверов, так что интересно будет протестить всё это дело и сравнить результаты... Хотя вопрос наверное уже мёртв)
PM MAIL   Вверх
MuToGeN
Дата 10.1.2012, 02:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лесник
****


Профиль
Группа: Модератор
Сообщений: 4379
Регистрация: 15.8.2002
Где: Москва

Репутация: 4
Всего: 32



Хехе, знакомая задача. Когда-то делал аналогичное для одного проекта. Посетителей надо было пробивать на то, с прокся они заходят или нет.
Из собственного опыта:
1. Нормальной многопоточности в PHP нет и никогда не было, даже в CLI SAPI. Да, про pcntl знаю.
2. Если только PHP, то организовывать лучше как "мастер-слейв". Мастер запускает дочерний процесс, который принимает задачу с командной строки, куда-то отписывается о результате и успешно завершает исполнение. В этом случае ОС следит за всеми возможными косяками по утечкам памяти.
3. Если это под серьёзные промышленные нагрузки, то лучше старый-добрый C, тот же curl и pthreads. Потому что задача по большому счету не для похапе.
3.1 Если это под действительно серьезные промышленные нагрузки, то забудьте про windows.

Добавлено через 44 секунды
Чорт smile я буду смотреть на дату поста, я буду смотреть на дату поста, я буду смотреть на дату поста, я буду смотреть на дату поста -)


--------------------
Three pings for the token rings,
Five pings for the UNIX machines,
Hundred pings for the broken links,
One special ping to check them all
Through Simple Network Management Protocol!
PM MAIL ICQ   Вверх
kanaris
Дата 22.8.2012, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 16.2.2008

Репутация: нет
Всего: -1



Цитата
Хотя вопрос наверное уже мёртв) 

Цитата

Добавлено через 44 секунды
Чорт  я буду смотреть на дату поста, я буду смотреть на дату поста, я буду смотреть на дату поста, я буду смотреть на дату поста -) 


Да чо, я иногда почитываю свои старые темы, а вдруг ответили что нибудь толкового =)
Просто как правило, вопросы не решаются, поэтому идея забрасывается в дальний угол, до поры до времени. Вопросы всегда актуальны для меня...


Цитата

дайте мне список прокси и я сам запущу этот скрипт...

Прокси обычные паблик, например http://samair.ru/proxy/
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.1554 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.