Привет, Гость!
|
![]() |
![]() |
Учебник PHP #7
целей вашего приложения может оказаться удобнее использовать pfsockopen( ) вместо fsockopen( ).
Запуск внешних программ
Сценарии РНР также могут выполнять программы, находящиеся на сервере. Такая возможность особенно часто используется при администрировании системы через web-браузер, а также для более удобного получения сводной информации о системе.
ехес( )
Функция ехес( ) запускает заданную программу и возвращает последнюю строку ее выходных данных. Синтаксис функции ехес( ):
string exec (string команда [, string массив [, int возврат]])
Обратите внимание: функция ехес( ) только выполняет команду, не выводя результатов ее работы. Все выходные данные команды можно сохранить в необязательном параметре массив. Кроме того, если при заданном параметре массив также задается переменная возврат, последней присваивается код возврата выполненной команды.
Листинг 7.7 показывает, как использовать функцию ехес( ) для выполнения системной функции UNIX ping.
Листинг 7.7. Проверка связи с сервером с применением функции ехес( )
<?
exec("ping -с 5 www.php.net $ping);
// В Windows - exec("ping -n 5 www.php.net. $ping);
for ($i=0; $i< count($ping);$i++) :
print "<br>$ping[$i]";
endfor;
?>
Результат:
PING www.php.net (208.247.106.187): 56 data bytes
64 bytes from 208.247.106.187: icmp_seq=0 ttl=243 time=66.602 ms
64 bytes from 208.247.106.187: icmp_seq=1 ttl=243 time=55.723 ms
64 bytes from 208.247.106.187: icmp_seq=2 ttl=243 time=70.779 ms
64 bytes from 208.247.106.187: icmp_seq=3 ttl=243 time=55.339 ms
64 bytes from 208.247.106.187: icmp_seq=4 ttl=243 time=69.865 ms
-- www.php.net ping statistics --
5 packets transmitted. 5 packets received. 0% packet loss
round-trip min/avg/max/stddev - 55.339/63.662/70.779/6.783 ms
Обратные апострофы
Существует и другой способ выполнения системных команд, не требующий вызова функций, — выполняемая команда заключается в обратные апострофы (` `), а результаты ее работы отображаются в браузере. Пример:
$output = `ls`;
print "<pre>$output</pre>";
Этот фрагмент выводит в браузер содержимое каталога, в котором находится сценарий.
Внутренний параметр ping -с 5 (-п 5 в системе Windows) задает количество опросов сервера.
Если вы хотите просто вернуть неформатированные результаты выполнения команды, воспользуйтесь функцией passthru( ), описанной ниже.
passthru( )
Функция passthru( ) работает почти так же, как ехес( ), за одним исключением — она автоматически выводит результаты выполнения команды. Синтаксис функции passthru( ):
void passthru(string команда [, int возврат])
Если при вызове passthru( ) передается необязательный параметр возврат, этой переменной присваивается код возврата выполненной команды.
escapeshellcmd( )
Функция escapeshellcmd( ) экранирует все потенциально опасные символы, которые могут быть введены пользователем (например, на форме HTML), для выполнения команд exec( ), passthru( ), system( ) или рореn( ). Синтаксис:
string escapeshellcmd (string команда)
К пользовательскому вводу всегда следует относиться с определенной долей осторожности, но даже в этом случае пользователи могут вводить команды, которые будут исполняться функциями запуска системных команд. Рассмотрим следующий фрагмент:
$user_input = `rm -rf *`; // Удалить родительский каталог и все его подкаталоги
ехес($user_input); // Выполнить $user_input !!!
Если не предпринять никаких мер предосторожности, такая команда приведет к катастрофе. Впрочем, можно воспользоваться функций escapeshellcmd( ) для экранирования пользовательского ввода:
$user_input = `rm - rf *`; // Удалить родительский каталог и все его подкаталоги
ехес( escapeshellcmd($user_input)); // Экранировать опасные символы
Функция escapeshellcmd( ) экранирует символ *, предотвращая катастрофические последствия выполнения команды.
Безопасность является одним из важнейших аспектов программирования в среде Web, поэтому я посвятил целую главу этой теме и ее отношению к программированию РНР. За дополнительной информацией обращайтесь к главе 16.
Работа с файловой системой
В РНР существуют функции для просмотра и выполнения различных операций с файлами на сервере. Информация об атрибутах серверных файлов (местонахождение, владелец и привилегии) часто бывает полезной.
basename( )
Функция basename( ) выделяет имя файла из переданного полного имени. Синтаксис функции basename( ):
string basename(string полное_имя)
Выделение базового имени файла из полного имени происходит следующим образом:
$path = "/usr/local/phppower/htdocs/index.php"; $file = basename($path); // $file = "index.php"
Фактически эта функция удаляет из полного имени путь и оставляет только имя файла.
getlastmod( )
Функция getlastmod( ) возвращает дату и время последней модификации страницы, из которой вызывается функция. Синтаксис функции getlastmod( ):
int getlastmod(void)
Возвращаемое значение соответствует формату даты/времени UNIX, и для его форматирования можно воспользоваться функцией date( ). Следующий фрагмент выводит дату последней модификации страницы:
echo "Last modified: ".date( "H:i:s a". getlastmod( ) );
stat( )
Функция stat( ) возвращает индексируемый массив с подробной информацией о файле с заданным именем:
array stat(string имя_файла)
В элементах массива возвращается следующая информация:
0 Устройство
1 Индексный узел (inode)
2 Режим защиты индексного узла
3 Количество ссылок
4 Идентификатор пользователя владельца
5 Идентификатор группы владельца
6 Тип устройства индексного узла
7 Размер в байтах
8 Время последнего обращения
9 Время последней модификации
10 Время последнего изменения
11 Размер блока при вводе/выводе в файловой системе
12 Количество выделенных блоков
Таким образом, если вы хотите узнать время последнего обращения к файлу, обратитесь к элементу 8 возвращаемого массива. Рассмотрим пример:
$file - "datafile.txt";
list($dev, $inode, $inodep, $nlink, $uid, $gid, $inodev, $size, $atime, $mtime, $ctime,
$bsize) = stat($file);
print "$file is $size bytes. <br>";
print "Last access time: $atime <br>";
print "Last modification time: $mtime <br>";
Результат:
popen.php is 289 bytes.
Last access time: August 15 2000 12:00:00
Last modification time: August 15 2000 10:07:18
В этом примере я воспользовался конструкцией list () для присваивания имен каждому возвращаемому значению. Конечно, с таким же успехом можно вернуть массив, в цикле перебрать элементы и вывести всю необходимую информацию. Как видите, функция stat ( ) позволяет получить различные полезные сведения о файле.
Отображение и изменение характеристик файлов
У каждого файла в системах семейства UNIX есть три важные характеристики:
принадлежность группе;
владелец;
разрешения (permissions).
Все эти характеристики можно изменить при помощи соответствующих функций РНР. Функции, описанные в этом
Запуск внешних программ
Сценарии РНР также могут выполнять программы, находящиеся на сервере. Такая возможность особенно часто используется при администрировании системы через web-браузер, а также для более удобного получения сводной информации о системе.
ехес( )
Функция ехес( ) запускает заданную программу и возвращает последнюю строку ее выходных данных. Синтаксис функции ехес( ):
string exec (string команда [, string массив [, int возврат]])
Обратите внимание: функция ехес( ) только выполняет команду, не выводя результатов ее работы. Все выходные данные команды можно сохранить в необязательном параметре массив. Кроме того, если при заданном параметре массив также задается переменная возврат, последней присваивается код возврата выполненной команды.
Листинг 7.7 показывает, как использовать функцию ехес( ) для выполнения системной функции UNIX ping.
Листинг 7.7. Проверка связи с сервером с применением функции ехес( )
<?
exec("ping -с 5 www.php.net $ping);
// В Windows - exec("ping -n 5 www.php.net. $ping);
for ($i=0; $i< count($ping);$i++) :
print "<br>$ping[$i]";
endfor;
?>
Результат:
PING www.php.net (208.247.106.187): 56 data bytes
64 bytes from 208.247.106.187: icmp_seq=0 ttl=243 time=66.602 ms
64 bytes from 208.247.106.187: icmp_seq=1 ttl=243 time=55.723 ms
64 bytes from 208.247.106.187: icmp_seq=2 ttl=243 time=70.779 ms
64 bytes from 208.247.106.187: icmp_seq=3 ttl=243 time=55.339 ms
64 bytes from 208.247.106.187: icmp_seq=4 ttl=243 time=69.865 ms
-- www.php.net ping statistics --
5 packets transmitted. 5 packets received. 0% packet loss
round-trip min/avg/max/stddev - 55.339/63.662/70.779/6.783 ms
Обратные апострофы
Существует и другой способ выполнения системных команд, не требующий вызова функций, — выполняемая команда заключается в обратные апострофы (` `), а результаты ее работы отображаются в браузере. Пример:
$output = `ls`;
print "<pre>$output</pre>";
Этот фрагмент выводит в браузер содержимое каталога, в котором находится сценарий.
Внутренний параметр ping -с 5 (-п 5 в системе Windows) задает количество опросов сервера.
Если вы хотите просто вернуть неформатированные результаты выполнения команды, воспользуйтесь функцией passthru( ), описанной ниже.
passthru( )
Функция passthru( ) работает почти так же, как ехес( ), за одним исключением — она автоматически выводит результаты выполнения команды. Синтаксис функции passthru( ):
void passthru(string команда [, int возврат])
Если при вызове passthru( ) передается необязательный параметр возврат, этой переменной присваивается код возврата выполненной команды.
escapeshellcmd( )
Функция escapeshellcmd( ) экранирует все потенциально опасные символы, которые могут быть введены пользователем (например, на форме HTML), для выполнения команд exec( ), passthru( ), system( ) или рореn( ). Синтаксис:
string escapeshellcmd (string команда)
К пользовательскому вводу всегда следует относиться с определенной долей осторожности, но даже в этом случае пользователи могут вводить команды, которые будут исполняться функциями запуска системных команд. Рассмотрим следующий фрагмент:
$user_input = `rm -rf *`; // Удалить родительский каталог и все его подкаталоги
ехес($user_input); // Выполнить $user_input !!!
Если не предпринять никаких мер предосторожности, такая команда приведет к катастрофе. Впрочем, можно воспользоваться функций escapeshellcmd( ) для экранирования пользовательского ввода:
$user_input = `rm - rf *`; // Удалить родительский каталог и все его подкаталоги
ехес( escapeshellcmd($user_input)); // Экранировать опасные символы
Функция escapeshellcmd( ) экранирует символ *, предотвращая катастрофические последствия выполнения команды.
Безопасность является одним из важнейших аспектов программирования в среде Web, поэтому я посвятил целую главу этой теме и ее отношению к программированию РНР. За дополнительной информацией обращайтесь к главе 16.
Работа с файловой системой
В РНР существуют функции для просмотра и выполнения различных операций с файлами на сервере. Информация об атрибутах серверных файлов (местонахождение, владелец и привилегии) часто бывает полезной.
basename( )
Функция basename( ) выделяет имя файла из переданного полного имени. Синтаксис функции basename( ):
string basename(string полное_имя)
Выделение базового имени файла из полного имени происходит следующим образом:
$path = "/usr/local/phppower/htdocs/index.php"; $file = basename($path); // $file = "index.php"
Фактически эта функция удаляет из полного имени путь и оставляет только имя файла.
getlastmod( )
Функция getlastmod( ) возвращает дату и время последней модификации страницы, из которой вызывается функция. Синтаксис функции getlastmod( ):
int getlastmod(void)
Возвращаемое значение соответствует формату даты/времени UNIX, и для его форматирования можно воспользоваться функцией date( ). Следующий фрагмент выводит дату последней модификации страницы:
echo "Last modified: ".date( "H:i:s a". getlastmod( ) );
stat( )
Функция stat( ) возвращает индексируемый массив с подробной информацией о файле с заданным именем:
array stat(string имя_файла)
В элементах массива возвращается следующая информация:
0 Устройство
1 Индексный узел (inode)
2 Режим защиты индексного узла
3 Количество ссылок
4 Идентификатор пользователя владельца
5 Идентификатор группы владельца
6 Тип устройства индексного узла
7 Размер в байтах
8 Время последнего обращения
9 Время последней модификации
10 Время последнего изменения
11 Размер блока при вводе/выводе в файловой системе
12 Количество выделенных блоков
Таким образом, если вы хотите узнать время последнего обращения к файлу, обратитесь к элементу 8 возвращаемого массива. Рассмотрим пример:
$file - "datafile.txt";
list($dev, $inode, $inodep, $nlink, $uid, $gid, $inodev, $size, $atime, $mtime, $ctime,
$bsize) = stat($file);
print "$file is $size bytes. <br>";
print "Last access time: $atime <br>";
print "Last modification time: $mtime <br>";
Результат:
popen.php is 289 bytes.
Last access time: August 15 2000 12:00:00
Last modification time: August 15 2000 10:07:18
В этом примере я воспользовался конструкцией list () для присваивания имен каждому возвращаемому значению. Конечно, с таким же успехом можно вернуть массив, в цикле перебрать элементы и вывести всю необходимую информацию. Как видите, функция stat ( ) позволяет получить различные полезные сведения о файле.
Отображение и изменение характеристик файлов
У каждого файла в системах семейства UNIX есть три важные характеристики:
принадлежность группе;
владелец;
разрешения (permissions).
Все эти характеристики можно изменить при помощи соответствующих функций РНР. Функции, описанные в этом
Комментарии (0)
Скачать Java книгу»php/mysql/pdo/js
В библиотеку



