Php получить результат php exec

exec

Если параметр output указан, то массив будет заполнен строками вывода программы. Завершающие пробелы, такие как \n , не будут включены в массив. Обратите внимание, что если массив уже содержит какие-либо элементы, то exec() добавит новые элементы в конец массива. Если же вы не хотите, чтобы функция добавляла новые элементы в конец, вызовите unset() на этом массиве, прежде чем передать его в exec() .

Если аргумент result_code присутствует вместе с output , тогда статус возврата выполненной команды будет записан в этой переменной.

Возвращаемые значения

Последняя строка из результата команды. Если требуется выполнить команду и получить все данные команды без какой-либо обработки, используйте функцию passthru() .

Возвращает false в случае возникновения ошибки.

Для получения результата выполнения команды, убедитесь, что параметр output инициализирован и используется.

Ошибки

Выдаёт ошибку уровня E_WARNING , если функция exec() не может выполнить команду command .

Выбрасывает исключение ValueError , если параметр command не указан или содержит нулевые байты.

Список изменений

Версия Описание
8.0.0 Если параметр command не указан или содержит нулевые байты, функция exec() теперь выбрасывает исключение ValueError ; ранее она выдавала ошибку уровня E_WARNING и возвращала false .

Примеры

Пример #1 Пример функции exec()

// выводит имя пользователя, от имени которого запущен процесс php/httpd
// (применимо к системам с командой «whoami» в системном пути)
$output = null ;
$retval = null ;
exec ( ‘whoami’ , $output , $retval );
echo «Вернёт статус $retval и значение:\n» ;
print_r ( $output );
?>

Результатом выполнения данного примера будет что-то подобное:

Вернёт статус 0 и значение: Array ( [0] => cmb )

Примечания

Если вы собираетесь передавать функции пользовательские данные, используйте функции escapeshellarg() или escapeshellcmd() для того, чтобы пользователи не смогли обмануть систему, запустив произвольную команду.

Замечание:

Если вы собираетесь использовать эту функцию в программе, работающей в качестве демона, убедитесь, что стандартный вывод функции направлен в файл или другой поток, в противном случае PHP зависнет вплоть до конца выполнения программы.

Замечание:

В Windows функция exec() стартует cmd.exe для запуска команды. Если вы хотите запустить внешнюю программу без запуска cmd.exe, то используйте функцию proc_open() с установленной опцией bypass_shell .

Смотрите также

  • system() — Выполнить внешнюю программу и отобразить вывод
  • passthru() — Выполнить внешнюю программу и отобразить необработанный вывод
  • escapeshellcmd() — Экранировать метасимволы командной строки
  • pcntl_exec() — Запустить указанную программу в области текущего процесса
  • Оператор исполнения
Читайте также:  Php text position center

User Contributed Notes 20 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 &» );
>
>
?>

(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 ;
>
>
?>

Читайте также:  Building java programs programming projects

Источник

exec

Если аргумент output присутствует, то указанный массив будет заполнен каждой строкой вывода команды. Завершающие пробелы, такие как \n , в этот массив не включаются. Обратите внимание, что если массив уже содержит некоторые элементы, exec () добавится в конец массива. Если вы не хотите, чтобы функция добавляла элементы, вызовите unset () для массива перед передачей его в exec () .

Если аргумент result_code присутствует вместе с output аргументом, то статус возврата выполненной команды будет записан в эту переменную.

Return Values

Последняя строка результата выполнения команды. Если вам нужно выполнить команду, и все данные из команды будут переданы обратно без каких-либо помех, используйте функцию passthru () .

В случае ошибки возвращает false .

Чтобы получить результат выполненной команды, обязательно установите и используйте output параметр.

Examples

Пример # 1 Exec () Пример

 // outputs the username that owns the running php/httpd process // (on a system with the "whoami" executable in the path) $output=null; $retval=null; exec('whoami', $output, $retval); echo "Returned with status $retval and output:\n"; print_r($output); ?>

Из приведенного выше примера будет выведено нечто подобное:

Returned with status 0 and output: Array ( [0] => cmb )

Notes

При разрешении передачи пользовательских данных в эту функцию используйте функции escapeshellarg () или escapeshellcmd (), чтобы пользователи не могли обманом заставить систему выполнить произвольные команды.

Note:

Если программа запускается с этой функцией,то для продолжения ее работы в фоновом режиме вывод программы должен быть перенаправлен в файл или другой выходной поток.В противном случае PHP зависает до окончания выполнения программы.

Note:

В Windows exec () сначала запустит cmd.exe для запуска команды. Если вы хотите запустить внешнюю программу без запуска cmd.exe, используйте proc_open () с bypass_shell опцией bypass_shell .

See Also

  • system () — Выполнить внешнюю программу и отобразить результат
  • passthru () — Запускает внешнюю программу и отображает необработанный вывод
  • escapeshellcmd () — Исключает метасимволы оболочки
  • pcntl_exec () — Выполняет указанную программу в текущем пространстве процесса
  • backtick operator
PHP 8.2

(PHP 4,5,7,8)метасимволы escapeshellcmd escapeshellcmd()любые символы в строке,которые могут быть использованы для обмана команды для выполнения произвольных команд.

(PHP 4 4.3.0,5,7,8)exif_imagetype Определение exif_imagetype()считывает первые байты файла и проверяет его подпись.

(PHP 4 4.2.0,5,7,8)exif_read_data Считывает заголовки из файла изображения Заголовки EXIF обычно присутствуют в изображениях JPEG/TIFF,созданных цифровыми камерами,

Источник

Получите результаты от php exec (), пока команда все еще работает?

Когда я запускаю exec из PHP следующим образом:

Результаты этого будут сохранены в $result . Но в моем текущем случае моя команда может занять несколько минут и выводит результаты по мере ее запуска. Есть ли способ получить выход во время его работы? Я знаю, что метод passthru выводит результаты как браузер, но я действительно хочу его напрямую.

Вы должны взглянуть на proc_open

После того, как поток потока не блокируется (с stream_set_blocking ), вы можете читать его, когда захотите, без блокировки вашего PHP-кода.

$result = exec('command > /path/to/file &'); 

Он будет работать в фоновом режиме, и вы можете прочитать вывод в / path / to / file

Возможно, это не лучший способ сделать это (но работал для меня):

 array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("pipe", "a") ); $pipes = array(); $process = proc_open($cmd, $descriptorspec, $pipes, null, null); echo "Start process:\n"; $str = ""; if(is_resource($process)) < do < $curStr = fgets($pipes[1]); //will wait for a end of line echo $curStr; $str .= $curStr; $arr = proc_get_status($process); >while($arr['running']); >else < echo "Unable to start process\n"; >fclose($pipes[0]); fclose($pipes[1]); fclose($pipes[2]); proc_close($process); echo "\n\n\nDone\n"; echo "Result is:\n----\n".$str."\n----\n"; ?> в  array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("pipe", "a") ); $pipes = array(); $process = proc_open($cmd, $descriptorspec, $pipes, null, null); echo "Start process:\n"; $str = ""; if(is_resource($process)) < do < $curStr = fgets($pipes[1]); //will wait for a end of line echo $curStr; $str .= $curStr; $arr = proc_get_status($process); >while($arr['running']); >else < echo "Unable to start process\n"; >fclose($pipes[0]); fclose($pipes[1]); fclose($pipes[2]); proc_close($process); echo "\n\n\nDone\n"; echo "Result is:\n----\n".$str."\n----\n"; ?> 

Если выходной аргумент присутствует, то указанный массив будет заполнен каждой строкой вывода из команды. Пронумерованные пробелы, такие как \ n, не включаются в этот массив. Обратите внимание: если массив уже содержит некоторые элементы, exec () добавит в конец массива. Если вы не хотите, чтобы функция добавляла элементы, вызовите функцию unset () в массиве, прежде чем передать ее в exec ().

Возможно, вы сможете достичь того, что вам нужно, используя passthru() сочетании с выходной буферизацией . Не уверен.

Для тех, кому это может помочь, я использовал ответ Эдди и изменил его для своих целей (вывод файла дампа MySQL без наводнения ОЗУ сервера)

$dumpCommand = "mysqldump --skip-lock-tables -u $dbuser -p$dbpasswd $dbname"; $dumpFileName = 'backup_'.$dbname.'-'.date('Ymd-Hi').'.sql'; $descriptorSpec = array( 0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("pipe", "a") ); $pipes = array(); $process = proc_open($dumpCommand, $descriptorSpec, $pipes, null, null); if(!is_resource($process)) < die('Unable to start process'); >header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.$dumpFileName.'"'); do < echo fgets($pipes[1]); // Will wait for EOL $arrStatus = proc_get_status($process); >while($arrStatus['running']); fclose($pipes[0]); fclose($pipes[1]); fclose($pipes[2]); proc_close($process); 

Источник

Оцените статью