Я запускаю "push" интерфейс ZMQ через Ratche на сервере Apache, который очень хорошо работает в командной строке, взаимодействуя с моим сервером именно так, как мне хотелось бы. Вот код
//script1.php
<?php
echo exec('php script2.php');
?>
//script2.php
<?php
$entryData = array(
'category' => 'modelLmdap'
, 'job_id' => '1234'
, 'text' => ''
, 'status' => ''
);
$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'my pusher');
$socket->connect("tcp://localhost:5555");
$socket->send(json_encode($entryData));
?>
Когда я выполняю script1.php, я вижу всплывающее окно в окне моего сервера с сообщением «запрос зарегистрирован». Однако, если я попытаюсь запустить его через браузер, я получаю пустую страницу и ничего не выводю на сервер.
Я осмотрелся, это может быть связано с тем, что Apache не может запускаться из командной строки, и решение состоит в том, чтобы добавить следующее в мои sudoers (используя sudo visudo):
www-data ALL=NOPASSWD: ALL
Еще ничего! Пустая страница. Я переключил команду на exec () и получаю такую ошибку:
Неустранимая ошибка: класс 'ZMQContext' не найден в /home/username/server/qap/v2/tools/push.php в строке 8
Любые идеи?
РЕДАКТИРОВАТЬ: Меня спросили, почему я хочу все это делать, и это серьезный вопрос.
TL; DR Я не могу придумать способ выполнить другой скрипт php как службу - curl не работает локально, и include его не сокращает.
Я выполняю ряд сложных статистических вычислений, которые требуют много ресурсов и слишком много времени для получения каких-либо результатов, что приводит к специфическим проблемам с выполнением сценария, включая пустые страницы без причины (даже когда я увеличил максимальное выполнение сценария time) и ошибок AJAX, несмотря на максимальное время ожидания. Поэтому я передаю вычисления на стороне сервера ряду различных фоновых процессов, все из которых являются сценариями php. Это также позволяет мне обновлять пользователя по мере выполнения этого длинного скрипта. Рассматриваемый вызов заключается в выполнении сценария «контроллера», который управляет вычислительной фермой (это правильная терминология? Idk). Затем сценарий связывается с сервером Push (через ZMQ) и отправляет данные клиентам. Исходный код был насыщен AJAX, и мне действительно не хотелось обновлять ВСЕ его для использования веб-сокетов, поэтому я остановился на стиле типа «push» с использованием Ratchet в качестве сервера сокетов. Это означает, что я могу сделать свой исходный вызов AJAX для запуска всего процесса, а затем страница будет получать обновления с сервера в одностороннем порядке. У этого есть много преимуществ, мне больше всего нравится то, что связь по своей сути односторонняя, что избавляет меня от необходимости реализовывать множество функций безопасности на стороне сервера. К сожалению, для того, чтобы все это работало, сценарий Ajax-ed должен иметь возможность shell_exec для сценариев «фермы», поскольку они должны запускаться как фоновые процессы, и вот как я столкнулся со своей проблемой. Я пробовал curl (), но он просто захватывает чистый текст, а include () просто приводит к тому, что другие сценарии запускаются как часть сценария ajax-ed, что сводит на нет все. Я предполагаю, что в долгосрочной перспективе я мог бы изменить `` push '' сервер, чтобы он был полностью дуплексным, позволяя передавать исходные данные с веб-страницы прямо на асинхронный `` сервер фермы '' (я знаю, что ReactPHP способен на это, как и узел .js), но, как новичок в программировании серверов сокетов, я решил, что лучше избегать этого, пока я не смогу завершить рабочую модель.
Если я что-то пропустил, дайте мне знать, я ненавижу небезопасные веб-сайты так же сильно, как и вы!
Хорошо, я решил!
Проблема возникла из-за того, что в системе установлено несколько различных версий PHP (я перенес систему с домена общего хостинга на частный сервер, неся весь связанный с этим багаж). Apache использовал php5.4, а ZMQ был установлен на 5.6.
Я переименовал все папки php 5.4 в php54_old и создал ссылку на все соответствующие папки php 5.6 (sudo ln -s / etc / php56 / etc / php54). Я считаю, что это в сочетании с его разрешениями sudo (см. Выше) позволило ему работать, хотя я проверю, работает ли он без разрешений sudo, когда я развертываю сайт. По многим причинам мне неудобно, что у Apache есть разрешения sudo - тем временем я ограничил разрешения sudo для Apache только выполнением php.
РЕДАКТИРОВАТЬ: О, и я также удалил и переустановил как пакет ZMQ PEAR, так и оболочку zmq php.