Во-первых, я не уверен, что это правильный ответ, но я играл с 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, похоже, работают нормально.Блокирующие шаблоны работают, но отображают странное поведение в этих удаленных случаях.
В дополнение к моему ответу, вы, кажется, используете довольно старую версию 0mq. – JSON
вы также можете показать код для другой стороны? – flup
Возможный дубликат: http://stackoverflow.com/questions/9040208/zeromq-push-socket-causes-client-to-not-terminate-when-no-process-is-listening – flup