Php shell_exec() и apache
Я использую интерфейс 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 не обрезает его.
Я выполняю ряд сложных статистических вычислений, которые требуют много ресурсов и занимают слишком много времени для получения какого-либо вывода, что приводит к специфическим проблемам с выполнением сценария, включая пустые страницы без причины (даже когда я увеличил максимальное выполнение сценария время) и ошибки AJAX, несмотря на то, что время ожидания увеличено. Поэтому я выполняю расчеты на стороне сервера для ряда различных фоновых процессов, каждый из которых является php-скриптом. Это также позволяет мне обновлять пользователя при выполнении этого длинного скрипта. Вопрос в том, чтобы выполнить скрипт 'controller', который контролирует ферму вычислений (это правильная терминология? Idk). Затем сценарий связывается с Push-сервером (через ZMQ) и передает данные клиентам. Первоначальный код был тяжелым AJAX, и я действительно не хотел обновлять ВСЕ его, чтобы использовать веб-сокеты, поэтому я остановился на стиле "push", используя Ratchet в качестве сервера сокетов. Это означает, что я могу сделать свой исходный вызов AJAX, чтобы начать весь процесс, а затем страница получает обновления с сервера, в одну сторону. У этого есть много преимуществ, мой фаворит в том, что коммуникация по своей сути односторонняя, что мешает мне реализовать множество функций безопасности на стороне сервера. К сожалению, для того, чтобы все это работало, сценарий Ajax-ed должен иметь возможность shell_exec-сценариев "фермы", поскольку они должны запускаться как фоновые процессы, как я столкнулся с моей проблемой. Я пробовал curl(), но он просто захватывает пустой текст, а include() просто приводит к запуску других сценариев как части сценария ajax-ed, который побеждает весь смысл. Я полагаю, что в долгосрочной перспективе я мог бы изменить сервер "push", чтобы он был полностью дуплексным, позволяя передавать исходные данные с веб-страницы прямо на асинхронный "сервер фермы" (я знаю, что ReactPHP способен на это, как и узел.js), но, как программирование сервера с сокетом n00b, я подумал, что лучше избегать этого, пока не смогу завершить рабочую модель.
Если я что-то пропустил, дайте мне знать, я ненавижу небезопасные сайты так же сильно, как и вы!
1 ответ
Хорошо, я решил это!
Проблема была связана с тем, что в системе было установлено несколько различных версий 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.