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 );
?>?php
Результатом выполнения данного примера будет что-то подобное:
Вернёт статус 0 и значение: Array ( [0] => cmb )
Примечания
Если вы собираетесь передавать функции пользовательские данные, используйте функции escapeshellarg() или escapeshellcmd() для того, чтобы пользователи не смогли обмануть систему, запустив произвольную команду.
Замечание:
Если вы собираетесь использовать эту функцию в программе, работающей в качестве демона, убедитесь, что стандартный вывод функции направлен в файл или другой поток, в противном случае PHP зависнет вплоть до конца выполнения программы.
Замечание:
В Windows функция exec() стартует cmd.exe для запуска команды. Если вы хотите запустить внешнюю программу без запуска cmd.exe, то используйте функцию proc_open() с установленной опцией bypass_shell .
Смотрите также
- system() — Выполнить внешнюю программу и отобразить вывод
- passthru() — Выполнить внешнюю программу и отобразить необработанный вывод
- escapeshellcmd() — Экранировать метасимволы командной строки
- pcntl_exec() — Запустить указанную программу в области текущего процесса
- Оператор исполнения
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 ;
>
>
?>
Как запустить PHP-скрипт от обычного пользователя с помощью Cron
Cron — мощная утилита для планирования заданий на основе времени в Unix-подобных операционных системах, включая Linux. Он работает как демон и может использоваться для планирования заданий, таких как команды или сценарии оболочки, для выполнения резервного копирования, планирования обновлений и многого другого, которые периодически и автоматически запускаются в фоновом режиме в определенное время, даты или интервалы.
Одним из ограничений cron является то, что он предполагает, что система будет работать вечно; поэтому он подходит для серверов, отличных от настольных компьютеров. Кроме того, вы можете запланировать задачу на заданное или более позднее время, используя команды «at» или «batch»: но задача запускается только один раз (она не повторяется).
В этой статье мы объясним, как разрешить обычному системному пользователю запускать или выполнять PHP-скрипт через планировщик заданий cron в Linux.
Вы можете планировать задания с помощью программы crontab (CRON TABle). У каждого пользователя может быть свой собственный файл crontab, состоящий из шести полей для определения задания:
- Минута — принимает значения от 0 до 59.
- Час — принимает значения от 0 до 23.
- День месяца – сохраняет значения в диапазоне от 1 до 31.
- Месяц года – сохраняет значения от 1 до 12 или январь-декабрь, вы можете использовать первые три буквы названия каждого месяца, например, январь или июнь.
- День недели — содержит значения от 0 до 6 или вс-сб. Здесь также можно использовать первые три буквы названия каждого дня, т. е. вс или ср.
- Команда — команда, которую нужно выполнить.
Чтобы создать или отредактировать записи в собственном файле crontab, введите:
И чтобы просмотреть все ваши записи crontab, введите эту команду (которая просто напечатает файл crontab в стандартный вывод):
Однако, если вы являетесь системным администратором и хотите выполнить сценарий PHP от имени другого пользователя, вам необходимо запланировать его в файле /etc/crontab или в файле crontab пользователя root, которые поддерживают дополнительное поле для указания Имя пользователя:
И запланируйте выполнение своего PHP-скрипта следующим образом: укажите имя пользователя после раздела времени.
0 0 * * * tecmint /usr/bin/php -f /var/www/test_site/cronjobs/backup.php
Приведенная выше запись запускает скрипт /var/www/test_site/cronjobs/backup.php каждый день в полночь от имени пользователя tecmint.
Если вы хотите автоматически выполнять вышеуказанный скрипт каждые десять минут, добавьте следующую запись в файл crontab.
*/10 * * * * tecmint /usr/bin/php -f /var/www/test_site/cronjobs/backup.php
В приведенном выше примере */10 * * * * указывает, когда должно произойти задание. На первом рисунке показаны минуты — в этом сценарии каждые \десять\ минут. Остальные цифры показывают, соответственно, час, день, месяц и день недели.
Вы также можете прочитать следующие статьи по теме.
- Использование сценариев оболочки для автоматизации задач обслуживания системы Linux
- 12 полезных способов использования командной строки PHP, которые должен знать каждый пользователь Linux
- Как запускать PHP-коды в терминале Linux
- 30 полезных команд Linux для системных администраторов
Вот и все! Мы надеемся, что вы найдете эту статью полезной. Если у вас есть какие-либо вопросы или дополнительные идеи, которыми вы можете поделиться по этой теме, используйте форму комментариев ниже.