multi_thread сбор данных

longer

Guest
multi_thread сбор данных

Здравствуйте,

Подскажите каким способом экономичнее с точки зрения расходования ресурсов памяти и процессора решить следующую задачу:

Пользователь запрашивает удаленный ПХП-скрипт (сервер Апач1, ПХП как модуль), который обращается с параметрами (get) через сокеты к пяти (возможно более) серверам и получает от них новости.
Формат новостей -- текстовая строка с разделителями и контрольной суммой в конце (формат не так важен).

Хотелось бы сделать, чтобы Родительский процесс запускал Дочерние процессы:
- соединение с сервером 1, прием данных в буфер1, отключение;
- соединение с сервером 2, прием данных в буфер2, отключение;
...
- соединение с сервером 5, прием данных в буфер5, отключение;
в режиме multi_thread, чтобы подвисание одного из процессов не влияло на другие.

По истечению критического времени $time_max Родительский процесс должен принудительно закрыть все активные соединения (прибить дочерние процессы, даже если данные были приняты не полностью или вообще не приняты), обработать полученный результат из буферов 1-5 и выдать пользователю сводную ленту (все, что смог собрать).

http://phpclub.ru/talk/showthread.php?threadid=42934 -- изучал, но есть вопросы.

Можно ли в решении обойтись без pcntl_fork(), т.к. It is not possible to use the function 'pcntl_fork' when PHP is used as Apache module. Не хотелось бы запускать ПХП как ЦГИ (возможно я не прав).


Что из этого:
http://detail.phpclub.net/store/sources/class.phpServerMultiTask.phps
http://pear.php.net/package/Net_Server
http://cvs.php.net/co.php/pear/Net_Server/Server.php?r=1.5
http://www.php-tools.de/site.php?file=patServer/overview.xml
больше подходит для решения моей задачи?

Решения на С, Перле не подходят -- задача ставилась для ПХП
Желательно поменьше пинать ногами, возможно я чего-то и недопонимаю, за советом ведь пришел ;)
 

Demiurg

Guest
> It is not possible to use the function 'pcntl_fork' when PHP is used as Apache module.
это откуда ?
 

longer

Guest
из комментариев в http://www.php.net/manual/ru/function.pcntl-fork.php
 

Demiurg

Guest
то есть при каждом обращении скрипт форкается на несколько ? в чем тогда выгода ?
 

neko

tеam neko
longer
[m]socket_select[/m]
[m]sockets[/m]
читать про неблокирующие сокеты

-~{}~ 20.03.05 20:32:

> http://phpclub.ru/talk/showthread.php?threadid=42934 -- изучал,
> но есть вопросы

это тебе вообще не нужно
если я правильно понял вопрос
 

longer

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

ps: мне скорее всего надо запустить не сам скрипт, а несколько раз с параметрами вспомогательный скрипт опроса сокета, но как это сделать?
 

longer

Guest
То neko
С сокетами я работал и получить данные от одного источника умею. А вот как получить из нескольких источников, независимо друг от друга (т.е. не ждать, тока все данные прийдут)? И желательно одновременно, чтобы сократить общее время запроса.
И еще... как закрыть соединение, если оно повисло? Только по таймауту?
 

neko

tеam neko
ну типа я дал уже ссылки и достаточные комментарии
что еще требуется?

-~{}~ 20.03.05 20:43:

что значит "повисло"?
повиснуть может виндоуз

я всеже настоятельно рекоммендую ознакомиться с документацией
 

longer

Guest
То neko
Упс... сорри, стормозил. Вроде понял.
Завтра проверю. Если будут вопросы -- задам.

-~{}~ 20.03.05 19:52:

neko> что значит "повисло"?
повиснуть может виндоуз

Это когда ответа от сервера приходится ждать оч-чень долго (иногда секунд по 10-15) :) Обычно это не 200 (ок).

Кстати, как в таком случае ведет себя socket_select(). параметры int tv_sec [, int tv_usec] -- это таймауты чего?
по аналогии с fsockopen() -- это время ожидания соединения?
 

neko

tеam neko
не совсем
в частности fsockopen это функция которая открывает сокет
а select проверят дескриптор возможность читать из/писать в него
соотв. и таймауты на разные действия
т.е. я думаю это очевидно, что невозможность соединиться вообще и невозможность например читать и открытого сокета это несколько разные разные вещи

вобщем rtfm
man 2 select, тоже будет не лишним
 

longer

Guest
neko> я думаю это очевидно, что невозможность соединиться вообще и невозможность например читать и открытого сокета это несколько разные вещи
согласен.

ок, не буду много спрашивать. Лучше уж нормально разберусь во всем.
 

ONK

Пассивист PHPСluba
Если кратко то делать можно так:
Открываеш параллельно на прослушивание 5 не блокирующих сокетов, запоминаеш время открытия для каждого сокета, делаеш socket_select с таймаутом в 1сек по всем 5 сокетам, проходиш по активным чтением, заносиш прочитанное в буферы для каждого сокета + проверяеш таймауты (в том числе и на не активных сокетах)...
 

neko

tеam neko
а причем тут "прослушивание"?
и что такое неактивный сокет?
 

ONK

Пассивист PHPСluba
"прослушивание" можеш заменить на "чтение". В данном случае я употребил "прослушивание" из-за необходимости ждать поступления данных.

неактивный сокет, это читаемый сокет на который за отведённый промежуток времени (1с) не поступило новых данных.
 

Screjet

Новичок
longer

Скилов для реализации нужно немало, но в идеале система будет такова:
1) клиент-сервер, где
- клиент = твой ПХП скрипт, который "запрашивает" и "получает" данные от сервера
- сервер = мультизадачный процесс, который выполняет всю полезную работу в нескольких потоках. На каком языке будет написан = неважно, главное чтобы язык поддерживал многопоточность или многозадачность ну и ф-ции sockets или конкретные ф-ции для конкретных протоколов.

Клиент очень простой: каким-то из поточных протоколов (напр. IP/UDP) посылает запрос серверу и получает результат.
Сервер посложнее:
Контрольный процесс, который контролирует рабочих "ботов". В его задачи входит получить запрос от от клиента, запустить (процесс/нить) бота и передать ему запрос,
Бот = тоже по сути контрольный процесс, котрый "переваривает" запрос, плодит нити/процессы самих "работников", "раздает задания", собирает/получает от них результаты и высылает результат (точнее пакет результатов) клиенту.
Нити/процессы выполняют всю полезную работу, т.е. коннектятся, получают инфу [, отдают результат "боту"].
 

ONK

Пассивист PHPСluba
Screjet, зачем городить монстра типа Апач для такой простой задачи? К томуже той причины по которой Апач реализует многопоточность здесь просто нет.
 

neko

tеam neko
люди которые путают многозадачность с многопоточностью подлежат сожжению заживо
 

ONK

Пассивист PHPСluba
опять придрался ... :), да я имел в виду многозадачность.
 

neko

tеam neko
дада, я про это и говорю

jfyi это слово переводится как multitasking
и абсолютно к вопросу отношения не имеет
или я что-то упустил, и господин скрежет нам уже предлагает написать для этой пустяковой проблемы многозадачную операционную систему?

ладно, что уж там... поправься еще раз
 
Сверху