Команда PHP exec () не возвращается в функцию успеха Ajax - PullRequest
0 голосов
/ 12 февраля 2019

Резюме: у меня есть команда, которая запускается на странице PHP, вызываемая Ajax.

Последний пример PHP:

$linuxCmd = "cd ~/apps && node app.js > scr_log.log 2>&1 &";
exec($linuxCmd);

Я также пробовал:

$linuxCmd = "cd ~/apps && node app.js > scr_log.log 2>&1";
$linuxCmd = "cd ~/apps && node app.js &";
$linuxCmd = "cd ~/apps && node app.js > /dev/null 2>&1 &";
$linuxCmd = "cd ~/apps && node app.js 2>&1 /dev/null &";

И подумайте, что за прошедший день я рассмотрел все возможные комбинации этих команд.Кажется, что независимо от того, что я пробовал, функция успеха ajax на предыдущей странице не запускается.Я думал, что выполнение вышеописанного процесса в фоновом режиме позволит странице PHP вернуться к вызову ajax на странице javascript и продолжить выполнение сценариев, но не повезло.

Я также пытался добавить exit() и return() после функции exec(), но он не достигает их.

Кроме того, скрипт (app.js) запускается впетля.Он прекращается, когда значение в базе данных изменяется, так как он проверяет это каждый раз, когда запускается в цикле.У меня также есть способ убить процесс, который работает нормально и возвращается к функции успеха этого ajax-запроса, потому что он просто завершает процесс.

Другими словами, мне нужен скрипт, который я запускаю из PHP exec (), чтобы он постоянно запускался после запуска, но мне также нужна моя страница javascript внешнего интерфейса для продолжения после запуска этого процесса в серверной части.

Мне интересно, возможно ли это по какой-то причине.И если так, если есть лучший способ, чем функция exec () в PHP.Также попробовал shell_exec с парой вышеперечисленных комбинаций.

1 Ответ

0 голосов
/ 12 февраля 2019

Расширение Tilde является функцией оболочки, а не чем-то присущим Linux, поэтому ваш скрипт не должен полагаться на его работу.Даже если это не так, веб-серверы обычно работают как отдельный пользователь, у которого нет домашнего каталога.Что вы должны сделать, это использовать абсолютные пути в вашем скрипте и не пытаться записывать в каталог пользователя с пользователем веб-сервера.

<?php
$linuxCmd = "/usr/bin/node /home/user/apps/app.js > /var/log/scr_log.log 2>&1 &";
exec($linuxCmd);

Разрешение вашему веб-серверу писать в /var/log может потребовать некоторыхнастройки разрешений, но лучше положить вещи, где они принадлежат.Вы не хотите давать что-то внешнее - например, веб-сервер - разрешения на запись в чувствительное место, например домашний каталог.

Что касается того, как лучше всего выполнять команду постоянно в фоновом режиме, см.ответы на этот вопрос .В вашем коде нет ничего, что могло бы помешать успешному возвращению функции Ajax;это произойдет только в том случае, если адрес был неправильным (например, 404) или произошла ошибка (например, 500).

...