С нами с 25.03.04
Сообщения: 1287
Рейтинг: 411
|
Добавлено: 02/11/05 в 18:15 |
Грубо говоря есть скрипт, чекалка проксей на пхп:
Код: |
<?php
set_time_limit(0);
$f_proxy=file("proxy.txt");//текст IP:порт, штук 200 наверное...
for($i=0;$i<count($f_proxy);$i++){
if(!$f_proxy[$i]) continue;
$proxy_port=explode(":",trim($f_proxy[$i]));
$fs=fsockopen($proxy_port[0],$proxy_port[1],$errno,$errstr,10) or die($errstr);
if(!$fs) {unset($f_proxy[$i]);$bad_proxies++; flush(); continue;}
/*
может тут вставить что-нибудь подобное ?
stream_set_blocking($fp, FALSE );
stream_set_timeout($fp, 10);
*/
$good_proxy_arr.=$proxy_port[0].":".trim($proxy_port[1])."\r\n";
$out_fs="GET http://google.com HTTP/1.0\r\n";
$out_fs.="HOST: google.com\r\n";
$out_fs.="Connection: close\r\n";
$out_fs.="User-Agent: MSIE 6.0\r\n";
$out_fs.="\r\n\r\n";
fputs ($fs, $out_fs);
fclose($fs);
echo ".";flush();
}
echo "<b>Total Proxies : ".count($f_proxy)."</b><br>";
echo "<b>Bad proxies : ".$bad_proxies."</b><br>";
#и тут запись в proxy.txt хороших проксей, это уже не интересно.
|
С мини чеканием одной прокси проблем никогда не возникало, но как только я прибавил скрипту поболее возможностей, не трогая этот кусок, полезли какие-то косяки... Скрипт начал отваливать в строке с fsockopen (это я определил вставив в каждую строку echo __LINE__;flush(); и собачки у меня там нету... ), причем никаких месаг, ни ошибок, просто взял и умер. Бывает проверит 10 проксей (10 точечек) бывает 2 или 3 может на первой умереть... Где косяк? тыкните пальцем... Полазил по пхпклубу
вот это предлагают юзать:stream_set_blocking и stream_set_timeout. Но не думаю что в блокировке дело...
О! Только что дошло, может сервер не дает изменить тайм лимит? Хотя на двух разных пробовал... Пойду ручками изменю...
Какие мысли?
Последний раз редактировалось: adfire (02/11/05 в 20:04), всего редактировалось 1 раз
|
|
|
|
Genuine Quality
С нами с 28.08.05
Сообщения: 652
Рейтинг: 910
|
Добавлено: 02/11/05 в 19:32 |
возможно timeout слишком маленький, я пхп не рублю, но в яве так делаю: открываю сокет с таймаутом 100-500, если ответа нет, валится exception, что собственно и говорит что ответа от прокси нету.
|
|
|
|
С нами с 25.03.04
Сообщения: 1287
Рейтинг: 411
|
Добавлено: 02/11/05 в 19:53 |
Этот set_time_limit(0) или это fsockopen($proxy_port[0],$proxy_port[1],$errno,$errstr,10) ?
Вот тестю сейчас... Поставил там где десяточка (в fsockopen) единичку, и дело пошло... но только чекаются самые-самые быстрые, то есть которые успели ответить за 1 сек. и в результате остается меньше 10%, хотя все прокси только что локально чекнул .
|
|
|
|
С нами с 19.11.03
Сообщения: 3973
Рейтинг: 2362
|
Добавлено: 02/11/05 в 20:14 |
Ты как сабж запускаешь?
Проверено опытным путем , что скрипт может дублить и по 5 минут (независимо от таймаута) на одном запросе(дисконекты, не находит роуты,медленный коннект и т.п.) ,ты удостоверился что он умер ?
Блокировку не трогай,она там не причем(она не спасет).
Цитата: |
set_time_limit(0) или это fsockopen($proxy_port[0],$proxy_port[1],$errno,$errstr,10) |
нет это разные вещи.
|
|
|
|
С нами с 25.03.04
Сообщения: 1287
Рейтинг: 411
|
Добавлено: 02/11/05 в 20:34 |
xreload писал: | Ты как сабж запускаешь? |
Пока ручками, потом в крон на каждые 2-3 часа.
xreload писал: |
Проверено опытным путем , что скрипт может дублить и по 5 минут (независимо от таймаута) на одном запросе(дисконекты, не находит роуты,медленный коннект и т.п.) ,ты удостоверился что он умер ?
|
Дублить - это как? От слова дубль? то есть два? Два чего может скрипт?
А как ещё умираю скрипты?
Вот: чекнул проксю, написал точку, flush() "<br>";
Значит пишет пишет точки, раз и просто остановился, как будто die(); написано... попробую запускать скрипт каждые 15 минут. или и этого мало?
|
|
|
|
С нами с 19.11.03
Сообщения: 3973
Рейтинг: 2362
|
Добавлено: 02/11/05 в 21:10 |
1)надеюсь ?
Код: |
error_reporting(E_ALL);
|
2)крайне рекомендовал бы запустить в shell , через php cli .
3)дублить в смысле тормозить , т.е. встречаются такие адреса на которых скрипт может задуматся серьезно.
Поставь опции :
Код: |
socket_set_option($fs,SOL_SOCKET,SO_RCVTIMEO,array("sec"=>5, "usec"=>0));
socket_set_option($fs,SOL_SOCKET,SO_SNDTIMEO,array("sec"=>5, "usec"=>0));
|
Как только задумается жди 10-15 минут не меньше.
Если не поможет , то стучи в аську
|
|
|
|
С нами с 25.03.04
Сообщения: 1287
Рейтинг: 411
|
Добавлено: 02/11/05 в 21:31 |
Так, вроде нашел ошибку... Она в выборе софта для поставленной задачи.
Скрипт, то ли сервер, то ли канал, при больших данных просто напросто захлебывается...
Может кто подскажет способ решения проблемы? Примерное тз: необходимо через 400 проксей обойти 3к урлов, и проверить на изменения, мой скрипт легко при 10-12 проксях чекает 100 урлов, максимум что я из него выжал это 1.7к запросов. потом опять смерть
как вариант:
оставить все как есть, но на десяти разных серверах, 10
скриптов берут данные с одного места, делят их, и обрабатывают отдельно, складывают результат, где взяли. технически реально, но геморно как-то...
Сильно ли поможет покупка мощного дорогого сервера? ксенончика на 3гц и с 2 гб мозгов с мощным каналом.
может софтинка под серверные оси какие есть? если нет, то какова стоимость такого сис программинга?
|
|
|
|
С нами с 25.03.04
Сообщения: 1287
Рейтинг: 411
|
Добавлено: 02/11/05 в 21:39 |
xreload писал: |
1)надеюсь ?
Код: |
error_reporting(E_ALL);
|
|
Угу, стояло сначало по умолчанию, семерочка, но в течении многочасового паринга мозгов поставил Е_АЛЛ.
xreload писал: |
3)дублить в смысле тормозить :), т.е. встречаются такие адреса на которых скрипт может задуматся серьезно.
Поставь опции :
Код: |
socket_set_option($fs,SOL_SOCKET,SO_RCVTIMEO,array("sec"=>5, "usec"=>0));
socket_set_option($fs,SOL_SOCKET,SO_SNDTIMEO,array("sec"=>5, "usec"=>0));
|
Как только задумается жди 10-15 минут не меньше.
Если не поможет , то стучи в аську :) |
О! Пойду пельменей куплю, сразу попробую поиграться с этим...
А может как нибудь можно предугадать такую лажовую проксю?
зы xreload Респект.
|
|
|
|
Genuine Quality
С нами с 28.08.05
Сообщения: 652
Рейтинг: 910
|
Добавлено: 02/11/05 в 23:24 |
adfire писал: |
Может кто подскажет способ решения проблемы? Примерное тз: необходимо через 400 проксей обойти 3к урлов, и проверить на изменения, мой скрипт легко при 10-12 проксях чекает 100 урлов, максимум что я из него выжал это 1.7к запросов. потом опять смерть
как вариант:
оставить все как есть, но на десяти разных серверах, 10
скриптов берут данные с одного места, делят их, и обрабатывают отдельно, складывают результат, где взяли. технически реально, но геморно как-то...
|
я писал примерно такой же софт, все работает отлично, если использовать многопоточность. проверка сокета может обходиться в 500мс, на каждый сокет создается отдельный поток, т.к. основное время потока - ожидание ответа от сокета, то никаких проблем с перфомансом не будет даже на домашнем компе. в итоге - 100 проксей тестаются за пару-десяток секунд.
|
|
|
|
Genuine Quality
С нами с 28.08.05
Сообщения: 652
Рейтинг: 910
|
Добавлено: 03/11/05 в 00:10 |
вообще стукни мне, если не спеху, помогу.
|
|
|
|
С нами с 25.03.04
Сообщения: 1287
Рейтинг: 411
|
Добавлено: 03/11/05 в 01:23 |
Simplex писал: | я писал примерно такой же софт, все работает отлично, если использовать многопоточность. проверка сокета может обходиться в 500мс, на каждый сокет создается отдельный поток, т.к. основное время потока - ожидание ответа от сокета, то никаких проблем с перфомансом не будет даже на домашнем компе. в итоге - 100 проксей тестаются за пару-десяток секунд. |
А на чем писал? На яве? Или может все таки под юникс?
|
|
|
|
Genuine Quality
С нами с 28.08.05
Сообщения: 652
Рейтинг: 910
|
Добавлено: 03/11/05 в 01:42 |
adfire писал: | А на чем писал? На яве? Или может все таки под юникс? |
хм... а ява под юниксом не работает?
|
|
|
|
С нами с 25.03.04
Сообщения: 1287
Рейтинг: 411
|
Добавлено: 03/11/05 в 02:14 |
Simplex писал: | хм... а ява под юниксом не работает? |
Что-то перепутал с VB в экселе каком нибудь =)
|
|
|
|
С нами с 25.03.04
Сообщения: 1287
Рейтинг: 411
|
Добавлено: 03/11/05 в 02:23 |
И все равно мне интересно, почему при проверке 100 урлов через 5 проксей все замечательно, а при 800 урлах и 7 проксях все глохнет на 115 урле... то есть на 805 запросе... плюс минус конечно..
|
|
|
|
С нами с 16.04.05
Сообщения: 754
Рейтинг: 352
|
Добавлено: 03/11/05 в 03:45 |
Стукинсь в асю - дам рабочий код, и подскажу насчёт многопоточности и траблов. 307-032-118.
|
|
|
|
С нами с 25.03.04
Сообщения: 1287
Рейтинг: 411
|
Добавлено: 03/11/05 в 03:57 |
Стучусь =), все равно не спится...
|
|
|
|
Cкриптоманьяк
С нами с 14.09.00
Сообщения: 1181
Рейтинг: 245
|
Добавлено: 03/11/05 в 16:32 |
Ваще такие вещи все-таки на сях лучше делать.
Кроме того, есть сильное подозрение, что fsockopen имеет утечку памяти.
Если все-таки на пхп - то сокеты надо не через fsockopen а через базовые функции открывать, с обязательным использованием select и неблокированых сокетов.
|
|
|
|
С нами с 01.10.03
Сообщения: 751
Рейтинг: 318
|
Добавлено: 03/11/05 в 19:13 |
может стоит сюда отпостить а не разбредаться на приваты?
тема топика очень интересная и так же как и топик стартер столкнулся с такой же проблемой
очень бы хотелось увидеть работающие примеры скриптов работающих в многопоточном режиме
|
|
|
|
С нами с 25.03.04
Сообщения: 1287
Рейтинг: 411
|
Добавлено: 03/11/05 в 20:00 |
Не в обиду Сиргею, попробовал код что он дал (с курлами), не пахает что-то... ща буду смотреть, вчера уже спать хотелось.
...
Тьфу.мой косяк...
Xrenoder писал: |
Ваще такие вещи все-таки на сях лучше делать.
Кроме того, есть сильное подозрение, что fsockopen имеет утечку памяти. |
Сори, на чем делать? На сях? А это что такое? Осях? То есть экзешником? Вот я бы такое заказал у кого-нибудь... какова стоимость? Програмка должна брать урлы из одного файла, прокси из другого, коннектится к каждому урлу через каждую проксю, примерное кол-во урлов 1к проксей 500, пхп с этим не справляется...
В тему: может на пятых версиях пхп сокетопен лучше реализован?
Xrenoder писал: |
Если все-таки на пхп - то сокеты надо не через fsockopen а через базовые функции открывать, с обязательным использованием select и неблокированых сокетов.
|
Слушай, подскажи в какую сторону копать...
socket_create
socket_bind
socket_listen
socket_accept
socket_write ?
а в чем принципиальная разница?
Последний раз редактировалось: adfire (04/11/05 в 00:18), всего редактировалось 1 раз
|
|
|
|
С нами с 19.11.03
Сообщения: 3973
Рейтинг: 2362
|
Добавлено: 03/11/05 в 20:07 |
Я тебе же писал стучи в аську , пхп там непричем , там 99% твои руки.
Товарищ Xrenoder говорит о C(C++) и в принципе он прав , хотя об утечках памяти я не слышал и не сталкивался с подобными проблемами.
|
|
|
|
С нами с 25.03.04
Сообщения: 1287
Рейтинг: 411
|
Добавлено: 03/11/05 в 20:21 |
Jam писал: | может стоит сюда отпостить а не разбредаться на приваты? тема топика очень интересная и так же как и топик стартер столкнулся с такой же проблемой очень бы хотелось увидеть работающие примеры скриптов работающих в многопоточном режиме
|
Да пока массового рабочего варианта то и нету, захлебываются даже самые оптимальные скрипты... а если многопоточность добавить вообще сервак сгорит к черту =)
Сейчас в голову пришло... А может сам php.exe падает? И/или фаер срабатывает? Я когда с компа прокси чекаю (Proxy Checker v7) от аутпоста постоянно получаю предупреждения что такой то IP мне такие то порты просканил, смотрю по логам - ip только что просканеных проксей, вне зависимости рабочая она или нет. Так вот... На сервере думаю аналогичная ситуация случается. прокси разные бываю. мало ли что они могут в ответ послать. где я не прав? или кто разовьет тему?
зы 2 Jam. это не очень простая задача... так что думаю просто так мало какой программист раз и выложит его в сеть.
|
|
|
|
С нами с 25.03.04
Сообщения: 1287
Рейтинг: 411
|
Добавлено: 03/11/05 в 20:24 |
xreload писал: | Я тебе же писал стучи в аську , пхп там непричем , там 99% твои руки.
Товарищ Xrenoder говорит о C(C++) и в принципе он прав , хотя об утечках памяти я не слышал и не сталкивался с подобными проблемами. |
через пару часов.
|
|
|
|
С нами с 16.04.05
Сообщения: 754
Рейтинг: 352
|
Добавлено: 04/11/05 в 09:45 |
Тот код с курлами работает у меня и ещё у многих. Если проблемы - значит проблемы у сервера, а не у кода. Код вот:
Код: |
<?php
$proxy_file = "proxy.lst";
$time_out = null;
function getBody($url, $proxy = ''){
global $time_out;
$ch = curl_init($url);
if ($proxy!='') curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
if ($time_out != null) curl_setopt($ch, CURLOPT_TIMEOUT, $time_out);
return curl_exec($ch);
}
function check($ip_port){
$url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'];
$url = substr($url, 0, strrpos($url, "/"));
$url .= "/test.php";
$source = getBody($url, $ip_port);
if ($source == "test_string_yes") return true; else return false;
}
$proxy_source = file_get_contents($proxy_file);
$proxy_list = preg_split("/\s+/", $proxy_source);
if (($proxy_source != '') and (count($proxy_list) == 0)) $proxy_list = array($proxy_source);
foreach ($proxy_list as $key => $value) {
$result = check($value);
echo $value." - ";
if ($result) echo "Ok"; else {
echo "Bad";
unset($proxy_list[$key]);
}
echo "<br>\r\n"; flush();
}
$source = implode("\r\n", $proxy_list);
$fp = fopen($proxy_file, "w");
fwrite($fp, $source);
fclose($fp);
?>
|
Отдельное НО: он пингует test.php, который должен находится в той-же папке что и сам скрипт, а сама папка должна находится в руте сервера (http://server.com/proxy/test например). test.php должен выдавать test_string_yes.
|
|
|
|
С нами с 16.04.05
Сообщения: 754
Рейтинг: 352
|
Добавлено: 04/11/05 в 09:47 |
Если код встаёт на каком-то домене, то нужно изменить таймаут с null на например 10.
|
|
|
|
С нами с 25.03.04
Сообщения: 1287
Рейтинг: 411
|
Добавлено: 04/11/05 в 13:32 |
Sirgey писал: | Тот код с курлами работает у меня и ещё у многих. Если проблемы - значит проблемы у сервера, а не у кода. Код вот:
|
Я уже написал что это мой косяк.
|
|
|
|