С функциями, работающими с файловой системой, мы закончили, теперь обратимся к функциям, с помощью которых можно запускать программы на сервере.
Они могут быть полезны при создании веб-интерфейса в системе, взаимодействующей с пользователем через командную строку. Такие команды были использованы, например,для создания интерфейса диспетчера почтовой рассылки ezmlm. Мы воспользуемся ими позже, когда дойдем до исследования учебных примеров.
Существует четыре основных способа выполнения команд на веб-сервере. Все они очень похожи, тем не менее, им присущи и небольшие различия.
Если у вас более сложные запросы, то можно также воспользоваться функциями popen(), proc_open() и proc_close(), которые предназначены для создания внешних процессов и передачи данных по каналам к ним и от них.
progex.php —функции работы со статусом файла и их результаты
<?php
chdir('../../phpstroy/test/');
//// версия exec
echo '<pre>';
//unix
exec('ls -la', $result);
//windows
//exec('dir', $result);
foreach ($result as $line)
echo "$line\n";
echo '</pre>';
echo '<br><hr><br>';
////версия passthru
echo '<pre>';
//unix
passthru('ls -la');
//windows
//passthru('dir');
echo '</pre>';
echo '<br><hr><br>';
////версия system
echo '<pre>';
//unix
$result = system('ls -la');
//windows
//$result =system('dir');
echo '</pre>';
echo '<br><hr><br>';
////версия с обратными кавычками
echo '<pre>';
//unix
$result = `ls -la`;
//windows
//$result = `dir`;
echo $result;
echo '</pre>';
?>
Один из рассмотренных способов может применяться вместо сценария просмотра каталога, приведенного ранее. Обратите внимание, что в этом коде хорошо виден один из побочных эффектов использования внешних функций: код не является переносимым. Здесь вызывались команды Unix, и ясно, что данный код не сможет работать в Windows.
Если в текст команды, которую нужно выполнить, требуется включить данные, предоставляемые пользователем, ее необходимо всегда сначала пропускать через функцию escapeshellcmd(). Это не позволит пользователям преднамеренно или нечаенно выполнять команды в вашей системе. Вот пример вызова этой функции:
system(escapeshellcmd($command));
Можно также воспользоваться функцией escapeshellarg() для отмены всех аргументов, которые нужно передать команде оболочки.
В завершении рассмотрим, как в PHP можно использовать переменные окружения. Для этой цели существуют две функции: getenv(), позволяющая получать переменные окружения, и putenv(), позволяющая устанавливать значения этих переменных.
Обратите внимание, что окружение, о котором идет здесь речь — это среда на сервере, в которой выполняется PHP-сценарий.
Список всех переменных окружения для PHP можно получить с помощью вызова функции phpinfo(). Некоторые из этих переменных более полезны, другие — менее, например:
getenv("HTTP_REFERER") ;
возвратит URL-адрес страницы, с которой пользователь пришел на текущуюстраницу.
Можно также устанавливать требуемые значения переменных среды с помощью функции putenv(), например:
$home = "/home/nobody";
putenv ("HOME =$home");
Если вы системный администратор и хотите ограничить список переменных окружения, которые доступны для переустановки пользователям, можно воспользоваться директивой safe_mode_allowed_env_vars в файле php.ini. При работе PHP в безопасном режиме пользователи смогут изменять только те переменные окружения, префиксы которых перечислены в этой директиве.