Php exec без ожидания ответа windows
exec — Выполнить внешнюю программу
Описание
exec() выполняет команду command .
Список параметров
Команда, которая будет исполнена.
Если параметр output указан, то массив будет заполнен строками вывода программы. Завершающие пробелы, такие как \n , не будут включены в массив. Обратите внимание, что если массив уже содержит какие-либо элементы, то exec() добавит новые элементы в конец массива. Если же вы не хотите, чтобы функция добавляла новые элементы в конец, вызовите unset() на этом массиве, прежде чем передать его в exec() .
Если аргумент return_var присутствует вместе с output , тогда статус возврата выполненной команды будет записан в этой переменной.
Возвращаемые значения
Последняя строка из результата команды. Если требуется выполнить команду и получить все данные команды без какой-либо обработки, используйте функцию passthru() .
Для получения результата выполнения команды, убедитесь, что параметр output инициализирован и используется.
Примеры
Пример #1 Пример функции exec()
Примечания
Если вы собираетесь передавать функции пользовательские данные, используйте функции escapeshellarg() или escapeshellcmd() для того, чтобы пользователи не смогли обмануть систему, запустив произвольную команду.
Если вы собираетесь использовать эту функцию в программе, работающей в качестве демона, убедитесь, что стандартный вывод функции направлен в файл или другой поток, в противном случае PHP зависнет вплоть до конца выполнения программы.
В Windows функция exec() стартует cmd.exe для запуска команды. Если вы хотите запустить внешнюю программу без запуска cmd.exe, то используйте функцию proc_open() с установленной опцией bypass_shell .
Смотрите также
- system() — Выполнить внешнюю программу и отобразить вывод
- passthru() — Выполнить внешнюю программу и отобразить необработанный вывод
- escapeshellcmd() — Экранировать метасимволы командной строки
- pcntl_exec() — Запустить указанную программу в области текущего процесса
- Оператор исполнения
User Contributed Notes 16 notes
This will execute $cmd in the background (no cmd window) without PHP waiting for it to finish, on both Windows and Unix.
function execInBackground ( $cmd ) <
if ( substr ( php_uname (), 0 , 7 ) == «Windows» ) <
pclose ( popen ( «start /B » . $cmd , «r» ));
>
else <
exec ( $cmd . » > /dev/null &» );
>
>
?>
On Unix, to execute a command $cmd in the background, the one and only allowed standard output redirection syntax is «> /path/to/file &». No other valid standard output redirection syntax will allow a command to be ran in the background.
// The following will be ran in the background
exec ( $cmd . » > /path/to/file &» );
// All the following will NOT be ran in the background
exec ( $cmd . » >> /path/to/file &» );
exec ( $cmd . » &> /path/to/file &» );
exec ( $cmd . » &>> /path/to/file &» );
exec ( $cmd . » 2>&1 > /path/to/file &» );
exec ( $cmd . » 2>&1 >> /path/to/file &» );
?>
(This is for linux users only).
We know now how we can fork a process in linux with the & operator.
And by using command: nohup MY_COMMAND > /dev/null 2>&1 & echo $! we can return the pid of the process.
This small class is made so you can keep in track of your created processes ( meaning start/stop/status ).
You may use it to start a process or join an exisiting PID process.
// You may use status(), start(), and stop(). notice that start() method gets called automatically one time.
$process = new Process ( ‘ls -al’ );
// or if you got the pid, however here only the status() metod will work.
$process = new Process ();
$process . setPid ( my_pid );
?>
// Then you can start/stop/ check status of the job.
$process . stop ();
$process . start ();
if ( $process . status ()) <
echo «The process is currently running» ;
>else <
echo «The process is not running.» ;
>
?>
/* An easy way to keep in track of external processes.
* Ever wanted to execute a process in php, but you still wanted to have somewhat controll of the process ? Well.. This is a way of doing it.
* @compability: Linux only. (Windows does not work).
* @author: Peec
*/
class Process <
private $pid ;
private $command ;
public function __construct ( $cl = false ) <
if ( $cl != false ) <
$this -> command = $cl ;
$this -> runCom ();
>
>
private function runCom () <
$command = ‘nohup ‘ . $this -> command . ‘ > /dev/null 2>&1 & echo $!’ ;
exec ( $command , $op );
$this -> pid = (int) $op [ 0 ];
>
public function setPid ( $pid ) <
$this -> pid = $pid ;
>
public function getPid () <
return $this -> pid ;
>
public function status () <
$command = ‘ps -p ‘ . $this -> pid ;
exec ( $command , $op );
if (!isset( $op [ 1 ]))return false ;
else return true ;
>
public function start () <
if ( $this -> command != » ) $this -> runCom ();
else return true ;
>
public function stop () <
$command = ‘kill ‘ . $this -> pid ;
exec ( $command );
if ( $this -> status () == false )return true ;
else return false ;
>
>
?>
Как не ждать ответа консольной команды при запуске ее из php?
Добрый день
со страницы отправляется ajax запрос, на стороне сервера запускается из php команда, пусть будет ping
exec(‘ping 1.1.1.1 -c 100 >buffer &’);
План построчно при помощи ajax читать файл вывода команды и отдавать пользователю. Но не смотря на то что в конце команды стоит ‘&’. все равно php ждет когда команда выполнится полностью и на это время ‘зависает’. Как это победить? я не большой специалист в linux
Запускайте команду асинхронно.
Дмитрий: не надо руками.
И ларавел гораздо удобнее ставится из композера. Как вы его обновлять собираетесь, если руками ставить будете?
OnYourLips: вот что composer говорит при попытке установить
Your requirements could not be resolved to an installable set of packages.
Problem 1
— laravel/framework v5.3.29 requires symfony/process 3.1.* -> satisfiable by symfony/process[3.1.x-dev, v3.1.0, v3.1.0-BETA1, v3.1.0-RC1, v3.1.1, v3.1.2, v3.1.3, v3.1.4, v3.1.5, v3.1.6, v3.1.7, v3.1.8] but these conflict with your requirements or minimum-stability.
— laravel/framework v5.3.29 requires symfony/process 3.1.* -> satisfiable by symfony/process[3.1.x-dev, v3.1.0, v3.1.0-BETA1, v3.1.0-RC1, v3.1.1, v3.1.2, v3.1.3, v3.1.4, v3.1.5, v3.1.6, v3.1.7, v3.1.8] but these conflict with your requirements or minimum-stability.
— laravel/framework v5.3.29 requires symfony/process 3.1.* -> satisfiable by symfony/process[3.1.x-dev, v3.1.0, v3.1.0-BETA1, v3.1.0-RC1, v3.1.1, v3.1.2, v3.1.3, v3.1.4, v3.1.5, v3.1.6, v3.1.7, v3.1.8] but these conflict with your requirements or minimum-stability.
— Installation request for laravel/framework (locked at v5.3.29, required as 5.3.*) -> satisfiable by laravel/framework[v5.3.29].
Installation failed, reverting ./composer.json to its original content.
спасибо установил.
но все равно садомия какаято ) поставил, пробую
public function runCurrent()
<
$process = new Process(‘ping 8.8.8.8 -c 10’);
$process->start();
Команда php exec (или аналогичная), чтобы не дождаться результата
У меня есть команда, которую я хочу запустить, но я не хочу, чтобы PHP сидел и дождался результата.
Возможно ли, чтобы PHP не дождался результата. То есть просто отпустите его и перейдите к следующей команде.
Я не могу найти что-нибудь и не уверен, что это возможно. Лучшее, что я мог найти, это тот, кто запустил работу CRON, чтобы начать через минуту.
Всегда хорошо проверять документацию :
Чтобы выполнить команду, если она не повесила ваш php-скрипт во время ее запуска, запущенная вами программа не должна выводиться обратно на php. Для этого переадресуйте как stdout, так и stderr в / dev / null, а затем запустите его.
Чтобы выполнить команду и она порождена как другой процесс, который не зависит от потока apache, чтобы продолжать работать (не умрет, если кто-то отменяет страницу), запустите это:
exec(‘bash -c «exec nohup setsid your_command > /dev/null 2>&1 &»‘);
Вы можете запустить команду в фоновом режиме, добавив & в конце ее как:
Но выполнение этого только повесит ваш скрипт, потому что:
Если программа запускается с функцией exec, чтобы она продолжала работать в фоновом режиме, вывод программы должен быть перенаправлен в файл или другой выходной поток. В противном случае PHP зависнет до завершения программы.
Таким образом, вы можете перенаправить команду stdout команды в файл, если вы хотите увидеть ее позже или в /dev/null если вы хотите отменить ее как:
Хорошо, вот окончательный окончательный правильный удостоенный наград ответ 😉
Это использует wget для уведомления URL-адреса чего-либо, не ожидая.
Это использует ls для обновления журнала без ожидания.
«exec nohup setsid your_command»
nohup позволяет вашей команде продолжать, даже если запущенный процесс может завершиться первым. Если это произойдет, сигнал SIGNUP будет отправлен в команду your_command, что приведет к ее завершению (если только он не поймает этот сигнал и не проигнорирует его).