2012-05-12 2 views
0

Я написал класс PHP для клиента websocket, который позволяет вам подключаться к серверам websocket с PHP. Он работает очень хорошо, за исключением того, что он может читать только данные в бесконечном цикле. В соединении с websocket сервер или клиент могут отправлять данные всякий раз, когда захотят, столько раз, сколько захотят. К сожалению, socket_select, socket_read и socket_recv не будет блокировать, если любые данные были отправлены в другой сокет - socket_select будет немедленно вернуться, и socket_read и socket_recv возвращает пустую строку. Я попытался сделать процесс сна до тех пор, пока он не получил SIGPOLL, но это заставило его спать бесконечно. Есть ли способ узнать, что больше данных доступно в сокете после того, как данные уже получены?PHP socket_read возвращает пустую строку

+0

Не прямой ответ, но похоже, что вам следует рассмотреть подход, основанный на событиях (ну, на самом деле, это не произошло, если вы не внедрили его таким образом), например http://php.net/socket_select – Corbin

+0

@Corbin: socket_select немедленно возвращается если какие-либо данные находятся в сокете, независимо от того, читаете ли вы ее или нет. Документы разъясняют это как «проверку, если чтение не блокируется», и поскольку оба socket_read и socket_recv не будут блокировать (они возвращают пустые строки), он немедленно возвращается. – Monchoman45

ответ

0

PHP не является хорошим языком для этого, поскольку он не является асинхронным языком. Я бы предложил Node.js или что-то подобное.

Возможно, я мало знаю о PHP и веб-сайтах, но не могли бы вы просто зациклировать его, пока не нажмете SIGPOLL?

+0

Ожидание 'SIGPOLL' не сработало для меня, хотя я не уверен, что правильно его настроил - я использовал' pcntl_sigwaitinfo (array (SIGPOLL)); ', но мне нужно сначала заблокировать' SIGPOLL'? – Monchoman45

Смежные вопросы