Мой скрипт, назовем его execute.php, должен запустить скрипт оболочки, который находится в подпапке Scripts. Скрипт должен быть выполнен так, что его рабочий каталог – это скрипты. Как выполнить эту простую задачу в PHP?
Структура каталогов выглядит так:
execute.php Scripts/ script.sh
Либо вы exec("cd Scripts && ./script.sh")
в этот каталог в команде exec ( exec("cd Scripts && ./script.sh")
), либо вы измените рабочий каталог процесса PHP с помощью chdir()
.
Текущий рабочий каталог совпадает с текущим рабочим каталогом скрипта PHP.
Просто используйте chdir()
чтобы изменить рабочий каталог перед exec()
.
Для большего контроля над тем, как будет выполняться дочерний процесс, вы можете использовать функцию proc_open () :
$cmd = 'Scripts/script.sh'; $cwd = 'Scripts'; $spec = array( // can something more portable be passed here instead of /dev/null? 0 => array('file', '/dev/null', 'r'), 1 => array('file', '/dev/null', 'w'), 2 => array('file', '/dev/null', 'w'), ); $ph = proc_open($cmd, $spec, $pipes, $cwd); if ($ph === FALSE) { // open error } // If we are not passing /dev/null like above, we should close // our ends of any pipes to signal that we're done. Otherwise // the call to proc_close below may block indefinitely. foreach ($pipes as $pipe) { @fclose($pipe); } // will wait for the process to terminate $exit_code = proc_close($ph); if ($exit_code !== 0) { // child error }
Если вам действительно нужен ваш рабочий каталог для сценариев, попробуйте:
exec('cd /path/to/scripts; ./script.sh');
В противном случае,
exec('/path/to/scripts/script.sh');
должно быть достаточно.
Это не лучший способ.
Передача следующего в функцию exec также будет выполняться ./scripts.sh, который теперь может удалить всю систему UNIX – при запуске в пути:
exec ('cd / patto / scripts; ./script.sh');
Используйте && (только для выполнения второй команды после успешного завершения первого) вместо; (полуколока) – это похоже на нажатие клавиши ввода.