2014-02-14 2 views
9

Я тестировал веб-порты PHP с помощью Ratchet, и все отлично работало до тех пор, пока ZMQSocket :: send вдруг не повесился без видимых причин.ZMQ hanging - ZMQSocket :: send

$context = new ZMQContext(); 
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'notify'); 
$res = $socket->send(json_encode($entryData)); //Hangs here. 

Обратите внимание, что я могу использовать ZMQ :: MODE_NOBLOCK, и это остановит повешение, но это не решает проблему. т. е. клиент все еще ничего не получает. Я также перезагрузил свою коробку, что не устраняет проблему.

  • Ubuntu 12.04.1 LTS
  • PHP Version 5.3.10 - FPM/(& CLI для толкающего сервера)
  • ZMQ расширение версия 1.1.2
  • libzmq версия 2.1.11

Обновление: Я, казалось, исправили проблему, изменив мой код:

$context = new ZMQContext(); 
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'notify'); 
$socket->setSockOpt(ZMQ::SOCKOPT_LINGER, 30); //ADDED 
$socket->connect("tcp://localhost:5557"); //ADDED 
$res = $socket->send(json_encode($entryData)); 

Теперь вопрос в том, почему он повесился в первую очередь, когда он работал нормально около часа или двух? Есть ли что-то, что мне нужно искать?

+0

В дополнение к моему ответу, вы, кажется, используете довольно старую версию 0mq. – JSON

+0

вы также можете показать код для другой стороны? – flup

+0

Возможный дубликат: http://stackoverflow.com/questions/9040208/zeromq-push-socket-causes-client-to-not-terminate-when-no-process-is-listening – flup

ответ

1

Во-первых, я не уверен, что это правильный ответ, но я играл с php-zmq в течение нескольких дней, и у меня было несколько проблем. Ваш вопрос привел меня к прозрению, которое, вероятно, решит мои проблемы, и я подозреваю, что ваши могут быть связаны.

С моей последней проблемой php-zmq я тестировал время в оба конца между моим ноутбуком и моим VPS, используя метод отключения в zguide. Все, что я сделал, это изменить копию сценария tripping.php на моем ноутбуке, добавив URL-адрес моего VPS, чтобы он подключался к тому же сценарию, который удаленно запускался на VPS. Я работал синхронный раздел в длинном цикле while, а секция async использовала тот же цикл.

Я заметил, что только один «клиент» смог подключиться одновременно, выполняя синхронный цикл, пытающийся подключить несколько клиентов с моего ноутбука, или один из моего ноутбука, и один с другого сервера и т. Д. один из них мог подключаться одновременно, периодом. Я также заметил в разделе async, что мои сообщения в секунду снижались со 100 сообщений в секунду до примерно 2 секунд на сообщение, как только сообщения начали поступать на моем ноутбуке. Мой ноутбук может легко выполнять 10+ HTTP-запросов в секунду, используя cURL, поэтому 2 секунды на сообщение не связаны с сетью.

Я был разработчиком PHP-расширений и ядром PHP-хакера в течение 6 лет, и раньше я сталкивался с такими проблемами. Я уверен, что это проблема параллелизма между пользовательским пространством PHP и внутренними потоками Zeromq. Другими словами, потоки IO Zeromq отправляют команды в основной поток Zeromq, но основной поток zeromq выполняется в PHP через движок Zend и связан с тем же самым основным поведением, что и другие методы и функции PHP. Я не уверен, что если мы сможем ожидать того же самого поведения в php-zmq, что и в czmq или других привязках zeromq, из-за этого PHP очень синхронный по своей природе, а zeromq является асинхронным. Мой опыт был положительным в большинстве случаев при использовании неблокирующих шаблонов в php-zmq.

Редактировать: выявить возможную проблему - Zeromq обрабатывает все IO асинхронно в отдельных потоках. Поведение блокировки (например, req/rep) создается путем обмена сообщениями между потоками ввода-вывода и основным потоком, а не фактическим блокированием/синхронным IO. Это обмен сообщениями и синхронизация между потоками, которые, как я думаю, могут ошибочно работать в PHP. «Неблокирующие» модели Zeromq, похоже, работают нормально.Блокирующие шаблоны работают, но отображают странное поведение в этих удаленных случаях.

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