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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: socket_create/select/accept + CURL = очередь

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Как избавиться от очереди?
Ivalar
Отправлено: 17 Ноября, 2014 - 12:55:51
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Дек. 2011  


Помог: 0 раз(а)




Есть рабочий скрипт, где создается сокет с помощью 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 для меня как небольшое хобби, поэтому уходить дальше решения данного вопроса не хотелось бы.
 
 Top
MiksIr
Отправлено: 17 Ноября, 2014 - 13:38:07
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


Если сотня-другая в минуту, и больше не планируется, что смотрите в сторону pcntl_fork


-----
self-banned
 
 Top
Ivalar
Отправлено: 17 Ноября, 2014 - 14:17:58
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Дек. 2011  


Помог: 0 раз(а)




Сразу не сказал, но все это дело должно крутиться под Windows, поэтому pcntl_fork не подходит.
 
 Top
MiksIr
Отправлено: 17 Ноября, 2014 - 14:40:05
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


Тогда простых решений не знаю.

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

Можно попробовать этот фреймворк http://daemon[dot]io/ - но у него раньше была проблема с документацией, и не знаю, как там с windows.
(Добавление)
Или же смотреть в сторону тредов - тоже не так тривиально.
Или все же поставить до PHP какой-то сервер, который будет это разруливать сам.


-----
self-banned
 
 Top
Panoptik
Отправлено: 17 Ноября, 2014 - 14:57:20
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




делайте exec и запускайте другой скрипт в фоне с параметрами. этот процесс будет происходить асинхронно тем самым не будет задерживать выполнение текущего
(Добавление)
так же есть вариант складывать данные для отправки в хранилище, а-ля бд или файл, а другой скрипт по крону ежеминутно будет выбирать данные из очереди на отправку и делать тот же процесс не мешая сокетам


-----
Just do it
 
 Top
Ivalar
Отправлено: 17 Ноября, 2014 - 15:52:29
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Дек. 2011  


Помог: 0 раз(а)




MiksIr, фреймворк phpdaemon, судя по разделу "Installation" из документации, ставится только на NIX'ы. Код по ссылке на php.net очень похож на мой, так же два основных цикла и тройка сокетных команд create/select/accept, по сути вся разница в "оформлении".

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

Печально, но форк в данном случае являлся бы идеальным решением: родительский процесс крутит бесконечный цикл прослушки порта, а дочерние обращаются к удаленному серверу и ведут запись в сокет по известным дескрипторам, после чего убивают себя. На все меньше десятка строчек кода.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с сетью »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB