Асинхронная оболочка exec в PHP
У меня есть сценарий PHP, который должен 9X_php5 вызывать сценарий оболочки, но не заботится 9X_php5 о выводе. Сценарий оболочки выполняет несколько 9X_asynchronously вызовов SOAP и выполняется медленно, поэтому 9X_php5 я не хочу замедлять выполнение PHP-запроса, пока 9X_async он ожидает ответа. Фактически, запрос PHP 9X_shell-command должен иметь возможность завершиться без 9X_shell-script завершения процесса оболочки.
Я изучил различные 9X_php5 функции exec()
, shell_exec()
, pcntl_fork()
и т. д., но ни одна из них, похоже, не 9X_shell предлагает именно то, что я хочу. (Или, если 9X_shell-script они это сделают, мне непонятно как.) Есть 9X_php-fpm предложения?
- Возможный дубликат [php выполняет фоновый процесс] (https://stackoverflow.com/questions/45953/php-execute-a-background-pr ...
Ответ #1
Ответ на вопрос: Асинхронная оболочка exec в PHP
Если он «не заботится о выводе», нельзя 9X_asynchronously ли вызвать exec для скрипта с &
для фонового 9X_php-fpm процесса?
EDIT - включая то, что @ AdamTheHut прокомментировал 9X_asynchronously к этому сообщению, вы можете добавить это 9X_asynchronous к вызову exec
:
" > /dev/null 2>/dev/null &"
Это перенаправит и stdio
(первый >
), и 9X_php.ini stderr
(2>
) на /dev/null
и запустит их в фоновом режиме.
Есть 9X_shell-command и другие способы сделать то же самое, но 9X_asynchronous-processing это самый простой для чтения.
Альтернатива 9X_php-fpm указанному выше двойному перенаправлению:
" &> /dev/null &"
- Фоновые сценарии будут убиты при перезапуске apache ... просто помните об этом для о ...
Ответ #2
Ответ на вопрос: Асинхронная оболочка exec в PHP
Я использовал для этого at, поскольку он действительно 9X_asynchronously запускает независимый процесс.
- если пользователь, у которого вы запускаете apache (обычно `www-data`), не имеет разрешений на использование` at`, и вы не можете его настроить, вы можете попробовать использовать `<? php exec ('sudo sh -c "echo \" ...
Ответ #3
Ответ на вопрос: Асинхронная оболочка exec в PHP
Всем пользователям Windows: я нашел хороший 9X_async способ запустить асинхронный PHP-скрипт 9X_php.ini (на самом деле он работает почти со всем).
Он 9X_asynchronously основан на командах popen() и pclose(). И 9X_shell-command хорошо работает как в Windows, так и в Unix.
function execInBackground($cmd) {
if (substr(php_uname(), 0, 7) == "Windows"){
pclose(popen("start /B ". $cmd, "r"));
}
else {
exec($cmd . " > /dev/null &");
}
}
Исходный 9X_shell код от: http://php.net/manual/en/function.exec.php#86329
- @davidvalentino Правильно, и ничего страшного! Если вы хотите выполнить скрипт PHP / Pyhton / NodeJS, вам нужно фактически вызвать исполняемый файл и передать ему свой скрипт. Например: вы не доба ...
Ответ #4
Ответ на вопрос: Асинхронная оболочка exec в PHP
В Linux вы можете сделать следующее:
$cmd = 'nohup nice -n 10 php -f php/file.php > log/file.log & printf "%u" $!';
$pid = shell_exec($cmd);
Это 9X_php-frameworks выполнит команду в командной строке, а затем 9X_async просто вернет PID, который вы можете проверить 9X_shell-command на > 0, чтобы убедиться, что он работает.
Этот 9X_php-frameworks вопрос похож на: Does PHP have threading?
- Что значит "% u" $! делать именно?<p><span clas ...
Ответ #5
Ответ на вопрос: Асинхронная оболочка exec в PHP
php-execute-a-background-process есть несколько хороших предложений. Думаю, у 9X_php-fpm меня неплохой, но я пристрастен :)
Ответ #6
Ответ на вопрос: Асинхронная оболочка exec в PHP
В Linux вы можете запустить процесс в новом 9X_php-fpm независимом потоке, добавив амперсанд в 9X_php5 конце команды
mycommand -someparam somevalue &
В Windows вы можете использовать 9X_asynchronous команду DOS "запустить"
start mycommand -someparam somevalue
- В Linux родительский элемент может блокироваться до тех пор, п ...
Ответ #7
Ответ на вопрос: Асинхронная оболочка exec в PHP
правильный (!) способ сделать это -
- вилка()
- setsid()
- execve()
fork 9X_php-frameworks разветвляется, setsid сообщает текущему 9X_php процессу стать ведущим (без родителя), execve 9X_shellscript сообщает, что вызывающий процесс должен 9X_shell быть заменен вызываемым. чтобы родитель 9X_php.ini мог уйти, не затрагивая ребенка.
$pid=pcntl_fork();
if($pid==0)
{
posix_setsid();
pcntl_exec($cmd,$args,$_ENV);
// child becomes the standalone detached process
}
// parent's stuff
exit();
- Проблема с pcntl_fork() заключается в том, что вы не должны использовать его пр ...
Ответ #8
Ответ на вопрос: Асинхронная оболочка exec в PHP
Я использовал это ...
/**
* Asynchronously execute/include a PHP file. Does not record the output of the file anywhere.
* Relies on the PHP_PATH config constant.
*
* @param string $filename file to execute
* @param string $options (optional) arguments to pass to file via the command line
*/
function asyncInclude($filename, $options = '') {
exec(PHP_PATH . " -f {$filename} {$options} >> /dev/null &");
}
(где PHP_PATH
- это константа, определенная 9X_asynchronous-processing как define('PHP_PATH', '/opt/bin/php5')
или аналогичная)
Он передает аргументы 9X_php через командную строку. Чтобы прочитать 9X_php-fpm их на PHP, см. argv.
Ответ #9
Ответ на вопрос: Асинхронная оболочка exec в PHP
Я также нашел Symfony Process Component полезным для этого.
use Symfony\Component\Process\Process;
$process = new Process('ls -lsa');
// ... run process in background
$process->start();
// ... do other things
// ... if you need to wait
$process->wait();
// ... do things after the process has finished
Посмотрите, как 9X_shell-scripting это работает, в GitHub repo.
- Предупреждение: если вы не дождетесь, процесс будет остановлен, когда з ...
Ответ #10
Ответ на вопрос: Асинхронная оболочка exec в PHP
Единственный способ, который действительно 9X_shellscript работал у меня, был:
shell_exec('./myscript.php | at now & disown')
- 'disown' встроен в Bash и не работает с shell_exec() таким образом. Я попробовал `shell_exec (" / usr / local / sbin / command.sh 2> & 1> / dev / null | сейчас и отклонить ")` и все, что ...
Ответ #11
Ответ на вопрос: Асинхронная оболочка exec в PHP
Вы также можете запустить скрипт PHP как 9X_shell-command демон или cronjob: #!/usr/bin/php -q
Ответ #12
Ответ на вопрос: Асинхронная оболочка exec в PHP
Используйте именованный FIFO.
#!/bin/sh
mkfifo trigger
while true; do
read < trigger
long_running_task
done
Затем, когда 9X_shellscript вы захотите запустить длительную задачу, просто 9X_shell-command напишите новую строку (неблокирующую в файл 9X_shell-command триггера.
Если введенные вами данные меньше 9X_php PIPE_BUF
и представляют собой единственную операцию 9X_php.ini write()
, вы можете записывать аргументы в файл 9X_asynchronous-processing FIFO и отображать их как $REPLY
в скрипте.
Ответ #13
Ответ на вопрос: Асинхронная оболочка exec в PHP
без очереди использования вы можете использовать 9X_php-frameworks 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);
-
5
-
17
-
13
-
16
-
6
-
11
-
2
-
10
-
2
-
1
-
2
-
2
-
3
-
1
-
5
-
2
-
14
-
33
-
8
-
4
-
4
-
9
-
6
-
2
-
10
-
8
-
10
-
18
-
10
-
3
-
5
-
5
-
19
-
8
-
4
-
4
-
3
-
1
-
4
-
13
-
3
-
5
-
5
-
4
-
9
-
3
-
5
-
12
-
10
-
4