Websocket ZMQ + PHP 5.6.8 + Apache 2.4 + Symfony2 на Windows 7 64-bit

Различные операционные системы приходится использовать во время разработки на PHP с использованием Symfony2.
Windows установлен по причине моей devops направленности. Иногда надо и Photoshop или Illustrator запустить и много-много всего.
Web стал весьма динамичным в последнее время и Web 3.0 претендует на то, чтобы графический интерфейс был наименее прожорлив.
Как например в Microsoft пошла мода на Metro-дизайн. Эволюция web приводит к тому, что на самом деле важно потребителю: информация.
Поэтому веб-сайты постепенно научились не загружать излишних растровых элементов дизайна и не перезагружая страницу целиком, делать некоторые обновления на ней.
Вначале это был AJAX с XHR запросами на HTTP. После обезжиривание привело к появлению WebSocket, который работает во всех браузерах с поддержкой HTML5.

Выгодное отличие WebSocket заключается в том, что браузер устанавливает соединение с серверной стороной и не разрывает его.
Браузер постоянно ожидает каких-то новостей от сервера, чтобы моментально отреагировать и обновить пришедшую информацию на странице.
Так например, в проектах вроде аукционов, спортивных обозревателей, GPS-трекинга, много где требуется автоматическое обновление информации на странице.
Бывало делаешь ставку на ebay, а о том, что она перебита не узнаешь пока не обновишь страницу. А если счёт идёт на секунды и миллисекунды, то и вовсе перезагрузка всей страницы может сильно задержать.

На текущем проекте (Пациент Мессенджер) потребовался функционал динамически обновляющий страницу пациента у врача, на которой даты назначения посещений врача выводятся на календаре.
Если ассистент доктора меняет любую дату, доктор должен знать об этом незамедлительно, чтобы не отредактировать уже отредактированную дату и вообще чтобы быть в курсе последних изменений (без перезагрузки страницы).

Для реализации такой динамики я использовал на проекте ZeroMQ 4.0.4 в качестве websocket реализации и PHP + Apache + Symfony как веб-сервер.
Понятное дело, что на серверах типа Debian или Ubuntu, почти любой пакет устанавливается одной-двумя строчками из командной строки.
В Windows всегда всё не так просто. Если в Linux вы набрали apt-get install php5, то вам поставится нужной версии. В Windows же целый зоопарк версий под x86 и x64, Thread Safe и Non Thread Safe. И как не запутаться в них.
По своей излюбленной привычке идти по граблям и всегда качая самые передовые версии, я иду по ним уверенно с привычной болью. Я из тех, кто постоянно в зависимостях прописывает dev-master.
Естественно я уже прошёл ошибки и готов поделиться с Вами ими. Основная моя ошибка в том, что я пошёл по последним версиям и захотел использовать x64 версии (64-битные).
Возможно, на момент прочтения статьи – этот баг исправлен. Но учитывая мою ограниченную компетентность веб-разработками, я не могу запустить Microsoft Visual Studio и скомпилировать для php нужный dll самостоятельно. Вот и получается, что приходится выкручиваться подбирая магическое сочетание версий, на которых не будет ошибок.

И представьте, вы склеиваете ZMQ и PHP, и ловите ошибку.

Warning: stream_select(): cannot represent a stream of type ZMQ_FD as a select()able descriptor

И думаете, что наверное вы не те библиотеки подложили в PHP или какую-то не ту версию ZMQ поставили. Копаете в этом направлении.
А оказывается, что нужно сам PHP ставить 32-битный.

Привожу ниже версии, на которых всё завелось без ошибок.
Со страницы http://zeromq.org/distro:microsoft-windows
скачиваем ZMQ 4.0.4 и php-5.6.8-nts-Win32-VC11-x86.zip.

Вообще-то мне следовало использовать протокол WAMPv2 с авторизацией, но к сожалению я не осилил Thruway реализацию websocket-ов и использую старый проверенный способ RatchetPHP + ZMQ.

Пока что из соображений не значительного веса библиотеки AutobahnJS v1 по сравнению с AutobahnJS v2.

Скоро будет статья про то, как мне наконец-таки удалось запустить веб-сокеты на ThruwayBundle. 😉 Если будет время заняться им.