| |
tual()
Как известно, для одного и того же документа в Apache нельзя применять два
"обра-
ботчика". Иными словами, действует принцип (по крайней мере, в Apache первого
поколения): либо PHP, либо SSI (Server-Side Includes — Включения на стороне
серве-
Часть IV. Стандартные функции PHP 294
ра). Однако в PHP имеются определенные средства для "эмуляции" SSI-конструкции
include virtual.
Конструкция include virtual загружает файл, URL которого указан у нее в
параметрах, обрабатывает его нужным обработчиком и выводит в браузер.
То есть все происходит так, будто указанный URL был затребован виртуаль-
ным браузером. Большинство SSI-файлов ограничиваются использованием
этой возможности.
int virtual(string $url)
Функция virtual() представляет собой процедуру, которая может поддерживаться
только в случае, если PHP установлен как модуль Apache. Она делает то же самое,
что и SSI-инструкция . Иными словами, она гене-
рирует новый запрос серверу, обрабатываемый им обычным образом, а затем выво-
дит данные в стандартный поток вывода.
Чаще всего функция virtual() используется для запуска внешних CGI-сценариев,
написанных на другом языке программирования, или же для обработки SSI-файлов
более сложной структуры. В случае, если запускается сценарий, он должен
генериро-
вать правильные HTTP-заголовки, иначе будет выведено сообщение об ошибке. За-
метьте, что для включения обычных PHP-файлов с участками кода функция
virtual() неприменима — это выполняет оператор include.
Эмуляция функции virtual()
Функция virtual() работает только в том случае, если PHP установлен как модуль
Apache. Проблемы начинаются, если это не так, и какой-то уже готовый сценарий
интенсивно использует вызовы virtual(). Тогда мы должны будем либо переделать
сценарий, либо написать эмуляцию для функции virtual() (благо в "сценарном"
варианте PHP эта функция отсутствует, так что можно без оглядки на ключевые
слова
создать процедуру с именем virtual()). Вот как мы здесь поступим:
if(!function_exists("virtual")) {
// Условно определяемая функция
function Virtual($url)
{ //* здесь должен идти код для преобразования относительного
//* URL (заданного относительно текущего каталога) в абсолютный.
//* Мы не будем сейчас останавливаться на этом вопросе — оставим
//* его для 5-й части книги.
global $HTTP_HOST,$SERVER_PORT;
$f=@fopen("http://$HTTP_HOST:$SERVER_PORT$url","r");
if(!$f) {
Глава 21. Работа с WWW 295
echo "[an error ocurred while processing this directive: $url]";
return false;
}
// Теперь просто читаем все и выводим с помощью echo
while(($s=fread($f,10000))!="") echo $s;
fclose($f);
}
}
Обращаю ваше внимание на то, что используется не обычный fopen(), а сетевая его
разновидность, на что указывает префикс http:// в имени файла. Единственное
здесь сложное место — преобразование относительного URL в абсолютный. Но эта
задача, конечно, вполне разрешима, и мы займемся ей уже скоро — в пятой части
книги — наряду с остальными проблемами прикладного характера.
Глава 22
Основы регулярных
выражений в формате
RegEx
Часто регулярные выражения оказываются настоящим камнем преткновения для про-
граммистов, сталкивающихся с ними впервые. Это происходит потому, что такие
выражения немного сложны для запоминания и изобилуют всяческого рода специ-
альными метасимволами. Целью настоящей главы является доказательство того, что
не так все сложно, как может показаться с первого взгляда.
Начнем с примеров
На мой взгляд, проще всего разбираться с регулярными выражениями на примерах.
Так мы и поступим, если вы не против. Ведь вы не против?..
Пример первый
Наверняка вам приходилось когда-нибудь сталкиваться с такой ситуацией
(а если не приходилось, то просто представьте ее себе): программа обрабатывает
ка-
кой-то входной файл с именем и расширением, и необходимо сгенерировать выход-
ной файл, имеющий то же имя, но другое расширение. Например, файл file.in ва-
ша программа должна обработать и записать результат в file.out. Проблема
заключается в том, чтобы отрезать у имени входного файла все после точки и
"при-
клеить" на это мест
|
|