Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: socket_create/select/accept + CURL = очередь
Форумы портала PHP.SU » » Работа с сетью » socket_create/select/accept + CURL = очередь

Страниц (1): [1]
 

1. Ivalar - 17 Ноября, 2014 - 12:55:51 - перейти к сообщению
Есть рабочий скрипт, где создается сокет с помощью socket_create() для TCP, а потом осуществляет прослушку порта через бесконечный цикл с socket_select() и socket_accept(). ВНЕЗАПНО появилась новая хотелка: после прочтения данных необходимо обратиться к PHP-файлу на другом сервере с передачей параметров через POST. Не обладая особыми знаниями, решил сделать эту хотелку с помощью CURL и сделал примерно так:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. if ($ch = curl_init()) {
  3.   curl_setopt($ch, CURLOPT_URL, 'http://localhost/test/test.php');
  4.   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  5.   curl_setopt($ch, CURLOPT_POST, 1);
  6.   curl_setopt($ch, CURLOPT_POSTFIELDS, "param=$param");
  7.   $answer = curl_exec($ch);
  8.   if ($answer === false) {
  9.     // Обработка ошибки
  10.   } else {
  11.     // Запись в сокет
  12.   }
  13.   curl_close($ch);
  14. }
  15.  

Оно работает, но... на реальном сервере к сокету будет сотня-другая обращений в минуту, а удаленный сервер не отличается особой оперативностью и ответа (его надо будет записать в сокет) придется ждать 0.5-1 сек, что в результате даст очередь. Очередь меня не устраивает и от нее нужно избавиться.

Можно ли по-простому модифицировать имеющийся код или лучше покурить мануалы (какие?) на тему каких-то (каких?) других подходов в плане работы с сокетом и/или удаленным сервером?

P. S. PHP для меня как небольшое хобби, поэтому уходить дальше решения данного вопроса не хотелось бы.
2. MiksIr - 17 Ноября, 2014 - 13:38:07 - перейти к сообщению
Если сотня-другая в минуту, и больше не планируется, что смотрите в сторону pcntl_fork
3. Ivalar - 17 Ноября, 2014 - 14:17:58 - перейти к сообщению
Сразу не сказал, но все это дело должно крутиться под Windows, поэтому pcntl_fork не подходит.
4. MiksIr - 17 Ноября, 2014 - 14:40:05 - перейти к сообщению
Тогда простых решений не знаю.

В голову приходит только писать свой мультиплексирующий сервер на базе socket_select. За отправную точку можно взять вот этот комментарий http://php.net/manual/en/functio...select.php#56241

Можно попробовать этот фреймворк http://daemon[dot]io/ - но у него раньше была проблема с документацией, и не знаю, как там с windows.
(Добавление)
Или же смотреть в сторону тредов - тоже не так тривиально.
Или все же поставить до PHP какой-то сервер, который будет это разруливать сам.
5. Panoptik - 17 Ноября, 2014 - 14:57:20 - перейти к сообщению
делайте exec и запускайте другой скрипт в фоне с параметрами. этот процесс будет происходить асинхронно тем самым не будет задерживать выполнение текущего
(Добавление)
так же есть вариант складывать данные для отправки в хранилище, а-ля бд или файл, а другой скрипт по крону ежеминутно будет выбирать данные из очереди на отправку и делать тот же процесс не мешая сокетам
6. Ivalar - 17 Ноября, 2014 - 15:52:29 - перейти к сообщению
MiksIr, фреймворк phpdaemon, судя по разделу "Installation" из документации, ставится только на NIX'ы. Код по ссылке на php.net очень похож на мой, так же два основных цикла и тройка сокетных команд create/select/accept, по сути вся разница в "оформлении".

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

Печально, но форк в данном случае являлся бы идеальным решением: родительский процесс крутит бесконечный цикл прослушки порта, а дочерние обращаются к удаленному серверу и ведут запись в сокет по известным дескрипторам, после чего убивают себя. На все меньше десятка строчек кода.

 

Powered by ExBB FM 1.0 RC1