Асинхронная оболочка в PHP - PullRequest
191 голосов
/ 21 октября 2008

У меня есть PHP-скрипт, который должен вызывать скрипт оболочки, но не заботится о выводе. Сценарий оболочки выполняет несколько вызовов SOAP и выполняется медленно, поэтому я не хочу замедлять запрос PHP, пока он ожидает ответа. Фактически, PHP-запрос должен иметь возможность завершиться без завершения процесса оболочки.

Я изучил различные функции exec(), shell_exec(), pcntl_fork() и т. Д., Но ни одна из них, кажется, не предлагает именно то, что я хочу. (Или, если они это сделают, мне не ясно, как.) Есть предложения?

Ответы [ 13 ]

1 голос
/ 14 ноября 2008

Используйте именованный fifo.

#!/bin/sh
mkfifo trigger
while true; do
    read < trigger
    long_running_task
done

Затем, когда вы захотите запустить долгосрочное задание, просто напишите новую строку (неблокирующую в файле триггера.

Пока ваш ввод меньше PIPE_BUF и это одна операция write(), вы можете записывать аргументы в fifo и отображать их как $REPLY в скрипте.

1 голос
/ 07 ноября 2008

Вы также можете запустить скрипт PHP как демон или cronjob : #!/usr/bin/php -q

0 голосов
/ 21 декабря 2016

без очереди использования, вы можете использовать proc_open() следующим образом:

    $descriptorspec = array(
        0 => array("pipe", "r"),
        1 => array("pipe", "w"),
        2 => array("pipe", "w")    //here curaengine log all the info into stderror
    );
    $command = 'ping stackoverflow.com';
    $process = proc_open($command, $descriptorspec, $pipes);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...