ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Параллельное выполнение запросов через сокеты?
  #1  
Старый 19.09.2007, 19:18
Аватар для Darkweider
Darkweider
Участник форума
Регистрация: 08.02.2007
Сообщений: 162
Провел на форуме:
463978

Репутация: 34
По умолчанию Параллельное выполнение запросов через сокеты?

Вообщем столкнулся с такой проблемой, хочу быстрый парсер страниц написать. Как парсить страницы понял и разобрался... Проблема в том что через file_get_contents() все тормозно получается, слышал что можно параллельно информацию получать через сокеты, т.е. выполнять сразу несколько запросов в нескольким сайтам... Даже пример нашел, но не могу понять как переделать его=\ под парсер... Пожалуйста помогите разобраться уже который день думаю как переделать... Как работают незаблокориванные соксы не могу понять че-то... Пример, очень распространенный...
PHP код:
<?
// путь, где расположены скрипты
$path "http://domain.com/path/";

// число потоков
$max_threads 20;


// инициализация

$sockets = array();
$done false;

// будем работать, к примеру с набором
// ключевых слов

$keywords fopen("keywords.txt"'r');

// приступаем к многопоточной работе

while (!$done)
{
// если обнаружен файл,
// то прекращаем выполнение скрипта

if (file_exists('stop-file'))
die;

// если число запущенных потоков меньше
// разрешенного максимума
// то запускаем потоки еще

if ($max_threads count($sockets))
{

if (!
feof($keywords))
{
$buffer = array();

// читаем ключевое слово
// в реальности в этот массив можно
// положить очень много всего
// а не только одно ключевое слово…

$buffer[] = trim(fgets($keywords));

// задаем данные для запуска сокета
// request.php - это тот файл,
// которые делает “дело”

$query_url $path 'request.php';
$url_info parse_url($query_url);

$url_info[port] = ($url_info[port]) ? $url_info[port] : 80;
$url_info[path] = ($url_info[path]) ? $url_info[path] : /;
$url_info[query] = ($url_info[query]) ? ?” $url_info[query] : “”;

// пакуем данные для передачи
// в генерирующий скрипт
// использование serialize очень удобно,
// так как позволяет
// залить в request.php мегабайты данных

$request serialize($buffer);

// формируем запрос для передачи по сокету

$query “POST ” $url_info[path] . ” HTTP/1.1\r\n”;
$query $query “Content-Typetext/xml\r\n”;
$query $query “Host” $url_info[host] . \r\n”;
$query $query “Content-length” . (strlen($request)) . \r\n\r\n”;
$query $query $request;

// создаем сокет, переводим его
// в неблокирующий режим и запускаем
// обработчик запросов

$errno 0;
$error “”;

$socket fsockopen($url_info[host], $url_info[port], $errno$error30);
stream_set_blocking($socket0);
stream_set_timeout($socket3600);
fputs($socket$query);

// запоминаем запущенный сокет

$sockets[md5(time())] = $socket;
}
}

// читаем данные из сокета. формально они нам
// не нужны, но это позволяет
// отработать обработчкику запросов

reset($sockets);
while (
$socket current($sockets))
{
if (
feof($socket))
{
// убиваем сокет, который отработал

unset($sockets[key($sockets)]);
}
else
{
// читаем данные из сокета

$temp fgets($socket1000);
}

// обрабатываем следующий сокет

next($sockets);
}

// делаем небольщую задержку,
// иначе загруженность сервера
// приближается к 100 процентам

sleep(1);

// если нет активных сокетов, то можно выходить

if (count($sockets) == 0)
$done true;
}

fclose($keywords);

die;
?>
 
Ответить с цитированием

  #2  
Старый 19.09.2007, 22:04
Аватар для ant0ha
ant0ha
Участник форума
Регистрация: 22.05.2007
Сообщений: 144
Провел на форуме:
306311

Репутация: 119
По умолчанию

 
Ответить с цитированием

  #3  
Старый 19.09.2007, 22:20
Аватар для Darkweider
Darkweider
Участник форума
Регистрация: 08.02.2007
Сообщений: 162
Провел на форуме:
463978

Репутация: 34
По умолчанию

Вот еще нашел пример помогите кто-нибудь подробно разобраться неплохая может статья выйдет.... мало где нашел подробное описание.... Я конешно понимаю надо смотреть каменты и т.п. ,но все таки когда теретически понимаешь как это организуется, только тогда появлятся возможность написать что-то свое...
PHP код:
< ?php
$hosts 
= array("host1.sample.com""host2.sample.com");
$timeout 15;
$status = array();
$sockets = array();
/* Инициируем соединения ко всем хостам одновременно */
foreach ($hosts as $id => $host) {
    
$s stream_socket_client("$host:80"$errno$errstr$timeout
        
STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT);
    if (
$s) {
        
$sockets[$id] = $s;
        
$status[$id] = "in progress";
    } else {
        
$status[$id] = "failed, $errno $errstr";
    }
}
/* Теперь ожидаем результат */
while (count($sockets)) {
    
$read $write $sockets;
    
/* Вот она - магическая функция - пояснения ниже */
    
$n stream_select($read$write$e null$timeout);
    if (
$n 0) {
        
/* доступные для чтения сокеты готовы отдать нам данные 
           или попытка провалилась 
        */
        
foreach ($read as $r) {
            
$id array_search($r$sockets);
            
$data fread($r8192);
            if (
strlen($data) == 0) {
                if (
$status[$id] == "in progress") {
                    
$status[$id] = "failed to connect";
                }
                
fclose($r);
                unset(
$sockets[$id]);
            } else {
                
$status[$id] .= $data;
            }
        }
        
/* доступные для записи сокеты могут принимать 
            HTTP-запросы 
        */
        
foreach ($write as $w) {
            
$id array_search($w$sockets);
            
fwrite($w"HEAD / HTTP/1.0rnHost: "
                
$hosts[$id] .  "rnrn");
            
$status[$id] = "waiting for response";
        }
    } else {
        
/* ожидаем таймаут; подразумевается, что все сокеты, 
            ассоциированные с массивом $sockets не сработали 
        */
        
foreach ($sockets as $id => $s) {
            
$status[$id] = "timed out " $status[$id];
        }
        break;
    }
}
foreach (
$hosts as $id => $host) {
    echo 
"Host: $hostn";
    echo 
"Status: " $status[$id] . "nn";
}
?> 
Помогите расписать по блокам...Вписываю какие-нибудь сайты,запускаю и все виснет...

Последний раз редактировалось Darkweider; 19.09.2007 в 22:56..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнение команд через phpmyadmin Antiakvt Уязвимости 3 17.09.2007 06:27
Через какие почт. сервисы можно отправлять не через 25 порт Gawab Болталка 1 12.05.2007 19:13
Каким образом отправить сразу несколько запросов серверу через сокеты? beerbear PHP, PERL, MySQL, JavaScript 4 20.04.2007 23:56
Отправляем хтмл-письмо через сокеты je0n Статьи 4 07.02.2007 15:23



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ