Druzya.org
Возьмемся за руки, Друзья...
 
 
Наши Друзья

Александр Градский
Мемориальный сайт Дольфи. 
				  Светлой памяти детей,
				  погибших  1 июня 2001 года, 
				  а также всем жертвам теракта возле 
				 Тель-Авивского Дельфинариума посвящается...

Библиотека :: Компьютеры и Программирование :: Котеров Д. В. - Самоучитель PHP 4
<<-[Весь Текст]
Страница: из 287
 <<-
 
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. Проблема 
заключается в том, чтобы отрезать у имени входного файла все после точки и 
"при- 
клеить" на это мест
 
<<-[Весь Текст]
Страница: из 287
 <<-