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.

Другие вопросы по тегам