Реклама на сайте Advertise with us

Проблема с fsockopen (php)

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:



С нами с 25.03.04
Сообщения: 1229
Рейтинг: 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 раз

0
 

Genuine Quality

С нами с 28.08.05
Сообщения: 652
Рейтинг: 910

Ссылка на сообщениеДобавлено: 02/11/05 в 19:32       Ответить с цитатойцитата 

возможно timeout слишком маленький, я пхп не рублю, но в яве так делаю: открываю сокет с таймаутом 100-500, если ответа нет, валится exception, что собственно и говорит что ответа от прокси нету.

3
 



С нами с 25.03.04
Сообщения: 1229
Рейтинг: 411

Ссылка на сообщениеДобавлено: 02/11/05 в 19:53       Ответить с цитатойцитата 

Этот set_time_limit(0) или это fsockopen($proxy_port[0],$proxy_port[1],$errno,$errstr,10) ?

Вот тестю сейчас... Поставил там где десяточка (в fsockopen) единичку, и дело пошло... но только чекаются самые-самые быстрые, то есть которые успели ответить за 1 сек. и в результате остается меньше 10%, хотя все прокси только что локально чекнул .

0
 



С нами с 19.11.03
Сообщения: 3973
Рейтинг: 2362

Ссылка на сообщениеДобавлено: 02/11/05 в 20:14       Ответить с цитатойцитата 

Ты как сабж запускаешь?
Проверено опытным путем , что скрипт может дублить и по 5 минут (независимо от таймаута) на одном запросе(дисконекты, не находит роуты,медленный коннект и т.п.) ,ты удостоверился что он умер ? icon_smile.gif
Блокировку не трогай,она там не причем(она не спасет).

Цитата:

set_time_limit(0) или это fsockopen($proxy_port[0],$proxy_port[1],$errno,$errstr,10)


нет это разные вещи.

3
 



С нами с 25.03.04
Сообщения: 1229
Рейтинг: 411

Ссылка на сообщениеДобавлено: 02/11/05 в 20:34       Ответить с цитатойцитата 

xreload писал:
Ты как сабж запускаешь?

Пока ручками, потом в крон на каждые 2-3 часа.

xreload писал:

Проверено опытным путем , что скрипт может дублить и по 5 минут (независимо от таймаута) на одном запросе(дисконекты, не находит роуты,медленный коннект и т.п.) ,ты удостоверился что он умер ?

Дублить - это как? От слова дубль? то есть два? Два чего может скрипт?

А как ещё умираю скрипты?
Вот: чекнул проксю, написал точку, flush() "<br>";
Значит пишет пишет точки, раз и просто остановился, как будто die(); написано... попробую запускать скрипт каждые 15 минут. или и этого мало?

0
 



С нами с 19.11.03
Сообщения: 3973
Рейтинг: 2362

Ссылка на сообщениеДобавлено: 02/11/05 в 21:10       Ответить с цитатойцитата 

1)надеюсь ?
Код:

error_reporting(E_ALL);

2)крайне рекомендовал бы запустить в shell , через php cli .

3)дублить в смысле тормозить icon_smile.gif, т.е. встречаются такие адреса на которых скрипт может задуматся серьезно.
Поставь опции :
Код:

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 минут не меньше.
Если не поможет , то стучи в аську icon_smile.gif

3
 



С нами с 25.03.04
Сообщения: 1229
Рейтинг: 411

Ссылка на сообщениеДобавлено: 02/11/05 в 21:31       Ответить с цитатойцитата 

Так, вроде нашел ошибку... Она в выборе софта для поставленной задачи.
Скрипт, то ли сервер, то ли канал, при больших данных просто напросто захлебывается...

Может кто подскажет способ решения проблемы? Примерное тз: необходимо через 400 проксей обойти 3к урлов, и проверить на изменения, мой скрипт легко при 10-12 проксях чекает 100 урлов, максимум что я из него выжал это 1.7к запросов. потом опять смерть

как вариант:
оставить все как есть, но на десяти разных серверах, 10
скриптов берут данные с одного места, делят их, и обрабатывают отдельно, складывают результат, где взяли. технически реально, но геморно как-то...

Сильно ли поможет покупка мощного дорогого сервера? ксенончика на 3гц и с 2 гб мозгов с мощным каналом.

может софтинка под серверные оси какие есть? если нет, то какова стоимость такого сис программинга?

0
 



С нами с 25.03.04
Сообщения: 1229
Рейтинг: 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 Респект.

0
 

Genuine Quality

С нами с 28.08.05
Сообщения: 652
Рейтинг: 910

Ссылка на сообщениеДобавлено: 02/11/05 в 23:24       Ответить с цитатойцитата 

adfire писал:

Может кто подскажет способ решения проблемы? Примерное тз: необходимо через 400 проксей обойти 3к урлов, и проверить на изменения, мой скрипт легко при 10-12 проксях чекает 100 урлов, максимум что я из него выжал это 1.7к запросов. потом опять смерть
как вариант:
оставить все как есть, но на десяти разных серверах, 10
скриптов берут данные с одного места, делят их, и обрабатывают отдельно, складывают результат, где взяли. технически реально, но геморно как-то...


я писал примерно такой же софт, все работает отлично, если использовать многопоточность. проверка сокета может обходиться в 500мс, на каждый сокет создается отдельный поток, т.к. основное время потока - ожидание ответа от сокета, то никаких проблем с перфомансом не будет даже на домашнем компе. в итоге - 100 проксей тестаются за пару-десяток секунд.

3
 

Genuine Quality

С нами с 28.08.05
Сообщения: 652
Рейтинг: 910

Ссылка на сообщениеДобавлено: 03/11/05 в 00:10       Ответить с цитатойцитата 

вообще стукни мне, если не спеху, помогу.

3
 



С нами с 25.03.04
Сообщения: 1229
Рейтинг: 411

Ссылка на сообщениеДобавлено: 03/11/05 в 01:23       Ответить с цитатойцитата 

Simplex писал:
я писал примерно такой же софт, все работает отлично, если использовать многопоточность. проверка сокета может обходиться в 500мс, на каждый сокет создается отдельный поток, т.к. основное время потока - ожидание ответа от сокета, то никаких проблем с перфомансом не будет даже на домашнем компе. в итоге - 100 проксей тестаются за пару-десяток секунд.


А на чем писал? На яве? Или может все таки под юникс?

0
 

Genuine Quality

С нами с 28.08.05
Сообщения: 652
Рейтинг: 910

Ссылка на сообщениеДобавлено: 03/11/05 в 01:42       Ответить с цитатойцитата 

adfire писал:
А на чем писал? На яве? Или может все таки под юникс?


хм... а ява под юниксом не работает? icon_eek.gif

3
 



С нами с 25.03.04
Сообщения: 1229
Рейтинг: 411

Ссылка на сообщениеДобавлено: 03/11/05 в 02:14       Ответить с цитатойцитата 

Simplex писал:
хм... а ява под юниксом не работает?

Что-то перепутал с VB в экселе каком нибудь =)

0
 



С нами с 25.03.04
Сообщения: 1229
Рейтинг: 411

Ссылка на сообщениеДобавлено: 03/11/05 в 02:23       Ответить с цитатойцитата 

И все равно мне интересно, почему при проверке 100 урлов через 5 проксей все замечательно, а при 800 урлах и 7 проксях все глохнет на 115 урле... то есть на 805 запросе... плюс минус конечно..

0
 



С нами с 16.04.05
Сообщения: 754
Рейтинг: 352

Ссылка на сообщениеДобавлено: 03/11/05 в 03:45       Ответить с цитатойцитата 

Стукинсь в асю - дам рабочий код, и подскажу насчёт многопоточности и траблов. 307-032-118.

3
 



С нами с 25.03.04
Сообщения: 1229
Рейтинг: 411

Ссылка на сообщениеДобавлено: 03/11/05 в 03:57       Ответить с цитатойцитата 


Стучусь =), все равно не спится...

0
 

Cкриптоманьяк

С нами с 14.09.00
Сообщения: 1181
Рейтинг: 245

Ссылка на сообщениеДобавлено: 03/11/05 в 16:32       Ответить с цитатойцитата 

Ваще такие вещи все-таки на сях лучше делать.
Кроме того, есть сильное подозрение, что fsockopen имеет утечку памяти.
Если все-таки на пхп - то сокеты надо не через fsockopen а через базовые функции открывать, с обязательным использованием select и неблокированых сокетов.

3
 



С нами с 01.10.03
Сообщения: 751
Рейтинг: 318

Ссылка на сообщениеДобавлено: 03/11/05 в 19:13       Ответить с цитатойцитата 

может стоит сюда отпостить а не разбредаться на приваты?
тема топика очень интересная и так же как и топик стартер столкнулся с такой же проблемой
очень бы хотелось увидеть работающие примеры скриптов работающих в многопоточном режиме

Лучший Хостинг для CJ сайтов!

3
 



С нами с 25.03.04
Сообщения: 1229
Рейтинг: 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 раз

0
 



С нами с 19.11.03
Сообщения: 3973
Рейтинг: 2362

Ссылка на сообщениеДобавлено: 03/11/05 в 20:07       Ответить с цитатойцитата 

Я тебе же писал стучи в аську , пхп там непричем , там 99% твои руки.
Товарищ Xrenoder говорит о C(C++) и в принципе он прав , хотя об утечках памяти я не слышал и не сталкивался с подобными проблемами.

3
 



С нами с 25.03.04
Сообщения: 1229
Рейтинг: 411

Ссылка на сообщениеДобавлено: 03/11/05 в 20:21       Ответить с цитатойцитата 

Jam писал:
может стоит сюда отпостить а не разбредаться на приваты? тема топика очень интересная и так же как и топик стартер столкнулся с такой же проблемой очень бы хотелось увидеть работающие примеры скриптов работающих в многопоточном режиме

Да пока массового рабочего варианта то и нету, захлебываются даже самые оптимальные скрипты... а если многопоточность добавить вообще сервак сгорит к черту =)

Сейчас в голову пришло... А может сам php.exe падает? И/или фаер срабатывает? Я когда с компа прокси чекаю (Proxy Checker v7) от аутпоста постоянно получаю предупреждения что такой то IP мне такие то порты просканил, смотрю по логам - ip только что просканеных проксей, вне зависимости рабочая она или нет. Так вот... На сервере думаю аналогичная ситуация случается. прокси разные бываю. мало ли что они могут в ответ послать. где я не прав? или кто разовьет тему?

зы 2 Jam. это не очень простая задача... так что думаю просто так мало какой программист раз и выложит его в сеть.

0
 



С нами с 25.03.04
Сообщения: 1229
Рейтинг: 411

Ссылка на сообщениеДобавлено: 03/11/05 в 20:24       Ответить с цитатойцитата 

xreload писал:
Я тебе же писал стучи в аську , пхп там непричем , там 99% твои руки.
Товарищ Xrenoder говорит о C(C++) и в принципе он прав , хотя об утечках памяти я не слышал и не сталкивался с подобными проблемами.

через пару часов.

0
 



С нами с 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.

0
 



С нами с 16.04.05
Сообщения: 754
Рейтинг: 352

Ссылка на сообщениеДобавлено: 04/11/05 в 09:47       Ответить с цитатойцитата 

Если код встаёт на каком-то домене, то нужно изменить таймаут с null на например 10.

0
 



С нами с 25.03.04
Сообщения: 1229
Рейтинг: 411

Ссылка на сообщениеДобавлено: 04/11/05 в 13:32       Ответить с цитатойцитата 

Sirgey писал:
Тот код с курлами работает у меня и ещё у многих. Если проблемы - значит проблемы у сервера, а не у кода. Код вот:

Я уже написал что это мой косяк.

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »