Использование функций запуска программ

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

Они могут быть полезны при создании веб-интерфейса в системе, взаимодействующей с пользователем через командную строку. Такие команды были использованы, например,для создания интерфейса диспетчера почтовой рассылки ezmlm. Мы воспользуемся ими позже, когда дойдем до исследования учебных примеров.

Существует четыре основных способа выполнения команд на веб-сервере. Все они очень похожи, тем не менее, им присущи и небольшие различия.

  1. exec() — имеет следующий прототип:
    string exec (string command [, array result [, int return_value] ])
    В качестве аргумента передается командная строка, которую нужно выполнить, например:
    exec("ls -la");
    У функции exec() нет непосредственно выводных данных.
    Она возвращает последнюю строку результата выполнения команды.
    Если передать ей в качестве параметра переменную result, то после выполнения в ней будет содержаться массив всех строк результата выполнения команды.
    Если передать еще и переменную return_code, в нее будет помещен код возврата.
  2. passthru() —имеет следующий прототип:
    void passthru (string command [, int return_value] )
    Функция passthru() просто передает свои выходные данные в браузер. Это может оказаться полезным в случае бинарных данных, например, изображения в каком-нибудь формате.
    Никакого значения не возвращается.
    Параметры функции означают то же, что и в функции exec().
  3. system() —имеет следующий прототип:
    string system (string command [, int return_value])
    Данная функция передает в браузер выходные данные команды. Она пытается передать выходные данные каждой строки (если PHP выполняется как серверный модуль), что отличает ее от функции passthru().
    Она возвращает последнюю строку выходных данных (при успешном выполнении) или false при неудаче.
    Смысл параметров такой же, как и для других функций.
  4. Обратные кавычки — это оператор выполнения команды.
    У них нет непосредственных выходных данных. Результат выполнения команды возвращается в виде строки, которую затем можно отобразить на экране либо использовать как-то по другому.

Если у вас более сложные запросы, то можно также воспользоваться функциями 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() для отмены всех аргументов, которые нужно передать команде оболочки.

Взаимодействие с окружением: функции getenv() и putenv()

В завершении рассмотрим, как в 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 в безопасном режиме пользователи смогут изменять только те переменные окружения, префиксы которых перечислены в этой директиве.




  • Другие |
назадвверхвперед
Rambler's Top100