Функция 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) {
echo "[an error ocurred while processing this directive: $url]";
return false;
}
// Теперь просто читаем все и выводим с помощью echo
while(($s=fread($f,10000))!="") echo $s;
fclose($f);
}
}
Обращаю ваше внимание на то, что используется не обычный fopen(), а сетевая его разновидность, на что указывает префикс http:// в имени файла. Единственное здесь сложное место — преобразование относительного URL в абсолютный. Но эта задача, конечно, вполне разрешима, и мы займемся ей уже скоро — в пятой части книги — наряду с остальными проблемами прикладного характера.