PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Описание: Не могу открыть с помощью библиотекаря модуль.
Поиск в теме | Версия для печати
СЕРьГА
Отправлено: 24 Октября, 2011 - 21:40:37
Гость
Покинул форум
Сообщений всего: 81
Дата рег-ции: Апр. 2011
Помог: 0 раз(а)
Здравствуйте!) И снова я) Пытаюсь открыть с помощью библиотекаря модуль, находящийся в другом файле, но не получается. Это сценарий, в котором я использую библиотекарь:
CODE (
htmlphp ):
скопировать код в буфер обмена
<?
Uses( "files.phl" ) ; // подключаем модуль files.phl
// Все — теперь можно использовать модуль
$Content = ReadAllFile( "txt.txt" ) ; // читаем весь файл myfile.txt
$Hash = ReadKeyValFile( "keyval.txt" ) ; // читаем файл формата key=value
// ... и другие функции, которые, возможно, присутствуют в модуле
echo $Content ;
?>
а это сам библиотекарь:
CODE (
htmlphp ):
скопировать код в буфер обмена
<?
// Расширение библиотечных файлов по умолчанию
// Пути поиска библиотек. Если начинаются с точки, то поиск
// ВСЕГДА ведется относительно текущего каталога, даже если его
// сменят, в противном случае при следующем вызова Uses() будет
// выполнен перевод пути в абсолютный.
// Функция преобразует указанный относительный путь в абсолютный.
// Если путь уже является абсолютным (т. е. отсчитывается от корневого
// каталога системы), то с ним ничего не происходит, в противном случае
// используется имя текущего каталога (или заданного в $cur) с
// необходимыми преобразованиями. Существование файла с полученным полным
// именем не проверяется. Функция лишена некоторых недостатков
// встроенной в PHP realpath() и имеет по сравнению с ней несколько
// большие возможности, работая, правда, чуть медленнее.
function GetAbsPath( $name , $cur = "" ) { return abs_path( $name , $cur ) ; }
function abs_path( $name , $cur = "" )
{ // Преобразуем обратные слэши в прямые
// Сначала разбиваем путь по знакам "/"
$Path = ( $cur === "" ?getcwd ( ) : $cur ) ; // начальный каталог поиска foreach ( $Parts as $i => $s ) if ( $s != "." ) {
// Признак корневого каталога?
if ( ! $i && ( strlen ( $s ) > 1&& $s [ 1 ] == ":" || $s == "" ) ) $Path = $s ; // Ссылка на родительский каталог?
elseif ( $s == ".." ) {
// Если это уже корневой каталог, то куда спускаться?..
if ( strlen ( $Path ) > 1 && $Path [ 1 ] == ":" ) continue ; // Иначе используем dirname()
if ( $p == "/" || $p == "\\ " || $p == "." ) $Path = "" ; else $Path = $p ;
}
// Иначе просто имя очередного каталога
elseif ( $s !== "" ) $Path .= "/$s " ;
}
return ( $Path !== "" ?$Path : "/" ) ;
}
// Преобразует URL в абсолютный файловый путь.
// Т. е. если адрес начинается со слэша, то результат рассматривается
// по отношению к каталогу DOCUMENT_ROOT, а если нет — то относительно
// dirname($SCRIPT_NAME). Конечно, функция не безупречна (например, она
// не умеет обрабатывать URL, заданные Alias-директивами Apache, но в
// большинстве случаев это и не нужно.
function Url2Path( $name )
{ $curUrl = dirname ( $GLOBALS [ "SCRIPT_NAME" ] ) ; $url = abs_path( trim ( $name ) , $curUrl ) ; return getenv ( "DOCUMENT_ROOT" ) . $url ; }
// Превращает все пути в списке $INC в абсолютные, однако делает это
// не каждый раз, а только если массив изменился с момента последнего
// вызова.
function AbsolutizeINC( )
{ global $INC ;
static $PrevINC = "" ; // значение $INC при предыдущем входе
// Сначала проверяем — изменился ли $INC. Если да, то преобразуем
// все пути в массиве в относительные, иначе ничего не делаем.
// Нам это нужно только из соображений повышения производительности
// функции.
if ( $PrevINC !== $INC ) {
// Мы не можем использовать foreach, т. к. нам надо
// модифицировать массив
for ( $i = 0 ; $i < count( $INC ) ; $i ++ ) {
$v =& $INC [ $i ] ;
if ( $v [ 0 ] == "." && ( strlen ( $v ) == 1 || $v [ 1 ] == '\\' || $v [ 1 ] == '/' ) ) continue ;
$v = abs_path( $v ) ;
}
// Запоминаем текущее состояние массива
$PrevINC = $INC ;
}
}
// Загружает указанную библиотеку функций. Для поиска файла
// просматривает каталоги в массиве $INC.
function Uses( $libname )
{ global $INC ;
static $PrevINC = "" ; // значение $INC при предыдущем входе
static $LastFound = 0 ; // для ускорения работы
// Переводим все пути в $INC в относительные — вдруг вызывающая
// программа добавила что-нибудь в массив?..
AbsolutizeINC( ) ;
// Теперь просматриваем пути, начиная с того, по которому была
// найдена какая-нибудь предыдущая загруженная библиотека. Скорее
// всего, там окажется загружаемый сейчас модуль. Если нет —
// что же, просмотрим весь список...
$l = $LastFound ;
do {
// В очередном каталоге есть файл модуля?..
$dir = $INC [ $LastFound ] ;
if ( @ is_file ( $file = "$dir /$libname ." . LibExt) ) { // Сменить каталог на тот, в котором расположен модуль
// Делаем доступными для модуля все глобальные переменные
foreach ( $GLOBALS as $k => $v ) global $$k ;
// Включаем файл
$ret = include_once ( $file ) ;
// Пока не вернулись в предыдущий каталог, перевести
// добавленные (возможно?) пути в $INC в абсолютные
AbsolutizeINC( ) ;
// Вернуться
return $ret ;
}
$LastFound = ( $LastFound + 1) % count ( $INC ) ; } while ( $LastFound != $l ) ;
// Ничего не вышло — "умираем"...
die ( "Couldn't find library \" $libname \" at " . join ( ", " , $INC ) . "!" ) ; }
// Корректируем некоторые переменные окружения, которые могут иметь
// неверные значение, если PHP установлен не как модуль Apache
$GLOBALS [ "HTTP_ENV_VARS" ] [ "SCRIPT_NAME" ] =
$GLOBALS [ "SCRIPT_NAME" ] =
) ;
$GLOBALS [ "HTTP_ENV_VARS" ] [ "SCRIPT_FILENAME" ] =
$GLOBALS [ "SCRIPT_FILENAME" ] =
Url2Path( getenv ( "SCRIPT_NAME" ) )
) ;
// На всякий случай включаем максимальный контроль ошибок
// ВНИМАНИЕ! После следующего закрывающего тэга
// не должно быть НИКАКИХ ПРОБЕЛОВ! В противном случае
// сценарий, подключающий библиотекаря, будет выводить в самом
// начале своей работы этот пробел, что недопустимо при
// работе с Cookies.
}
?>
а это модуль files.phl:
CODE (
htmlphp ):
скопировать код в буфер обмена
<?
// Внимание! Так указывается дополнительный каталог для поиска модулей.
// Запись означает, что библиотекарь должен искать модули также и в
// подкаталоге OtherModules/dk текущего каталога
$INC [ ] = "OtherModules/dk" ;
// Подключение каких-то других модулей, в которых нуждается files.phl
Uses( "SomeOtherModule" ) ;
Uses( "AndOtherModuleToo" ) ;
// Константа: символы перевода строки
// Читает все содержимое файла $fname и возвращает его
function ReadAllFile( $fname )
{ $f = fopen ( $fname , "r" ) ; if ( ! $f ) return "" ; return $Cont ;
}
// Читает файл $fname, строки которого имеют формат
// ключ1=значение1
// Возвращает ассоциативный массив с указанными в файле ключами
function ReadKeyValFile( $fname )
foreach ( $Cont as $i => $st ) {
if ( ! ereg ( "^([^=]+)=(.*)" , $st , $regs ) ) continue ; }
return $Hash ;
}
?>
При запуске браузер выводит:
Fatal error: Call to undefined function Uses() in Z:\home\localhost\www\site\lib\test.php on line 3
СЕРьГА
Отправлено: 25 Октября, 2011 - 12:27:49
Гость
Покинул форум
Сообщений всего: 81
Дата рег-ции: Апр. 2011
Помог: 0 раз(а)
Viper пишет: Вам же четко написали что нет такой функции Uses()
как нет? а это?:
CODE (
htmlphp ):
скопировать код в буфер обмена
// Загружает указанную библиотеку функций. Для поиска файла
// просматривает каталоги в массиве $INC.
function Uses( $libname )
{ global $INC ;
static $PrevINC = "" ; // значение $INC при предыдущем входе
static $LastFound = 0 ; // для ускорения работы
// Переводим все пути в $INC в относительные — вдруг вызывающая
// программа добавила что-нибудь в массив?..
AbsolutizeINC( ) ;
// Теперь просматриваем пути, начиная с того, по которому была
// найдена какая-нибудь предыдущая загруженная библиотека. Скорее
// всего, там окажется загружаемый сейчас модуль. Если нет —
// что же, просмотрим весь список...
$l = $LastFound ;
do {
// В очередном каталоге есть файл модуля?..
$dir = $INC [ $LastFound ] ;
if ( @ is_file ( $file = "$dir /$libname ." . LibExt
) ) { // Сменить каталог на тот, в котором расположен модуль
// Делаем доступными для модуля все глобальные переменные
foreach ( $GLOBALS as $k => $v ) global $$k ;
// Включаем файл
$ret = include_once ( $file ) ;
// Пока не вернулись в предыдущий каталог, перевести
// добавленные (возможно?) пути в $INC в абсолютные
AbsolutizeINC( ) ;
// Вернуться
return $ret ;
}
$LastFound = ( $LastFound + 1
) % count ( $INC ) ; } while ( $LastFound != $l ) ;
// Ничего не вышло — "умираем"...
die ( "Couldn't find library \" $libname \" at " . join ( ", " , $INC ) . "!" ) ; }
// Корректируем некоторые переменные окружения, которые могут иметь
// неверные значение, если PHP установлен не как модуль Apache
$GLOBALS [ "HTTP_ENV_VARS" ] [ "SCRIPT_NAME" ] =
$GLOBALS [ "SCRIPT_NAME" ] =
) ;
$GLOBALS [ "HTTP_ENV_VARS" ] [ "SCRIPT_FILENAME" ] =
$GLOBALS [ "SCRIPT_FILENAME" ] =
Url2Path
( getenv ( "SCRIPT_NAME" ) )
) ;
// На всякий случай включаем максимальный контроль ошибок
// ВНИМАНИЕ! После следующего закрывающего тэга
// не должно быть НИКАКИХ ПРОБЕЛОВ! В противном случае
// сценарий, подключающий библиотекаря, будет выводить в самом
// начале своей работы этот пробел, что недопустимо при
// работе с Cookies.
}
СЕРьГА
Отправлено: 25 Октября, 2011 - 20:19:09
Гость
Покинул форум
Сообщений всего: 81
Дата рег-ции: Апр. 2011
Помог: 0 раз(а)
Извините, я забыл написать что подключаю эту функцию через этот обработчик:
CODE (
htmlphp ):
скопировать код в буфер обмена
<?
// Прежде всего, устанавливаем свои каталоги поиска модулей.
// Это, по нашей договоренности, — текущий в данный момент каталог.
// Проверяем, не пытается ли пользователь запустить обработчик напрямую,
// минуя Apache — например, путем набора в браузере адреса
// /lib/libhandler.php. Так как адрес, введенный пользователем,
// всегда передается в переменной окружения REQUEST_URI, то нужно
// "бить тревогу", если переданная строка адреса встречается
// в имени файла обработчика (причем в любом регистре символов).
// Мы не забыли отрезать в этой строке часть после ?, потому что
// она будет мешать при сравнении с именем файла.
// К сожалению, похоже, это единственный переносимый между операционными
// системами способ проверки легальности запуска обработчика.
$FileName = strtr ( __FILE__ , "\\ " , "/" ) ; // Выводим сообщение об ошибке
include "libhandler.err" ;
// Записываем в журнал данные о пользователе
$f = fopen ( "libhandler.log" , "a+" ) ; fputs ( $f , date ( "d.m.Y H:i.s" ) . " $REMOTE_ADDR - Access denied\n " ) ; // Завершаем работу
}
// Все в порядке — корректируем переменные окружения в соответствии
// с запрошенным пользователем адресом.
$GLOBALS [ "HTTP_ENV_VARS" ] [ "REQUEST_URI" ] =
$GLOBALS [ "REQUEST_URI" ] =
) ;
$GLOBALS [ "HTTP_ENV_VARS" ] [ "QUERY_STRING" ] =
$GLOBALS [ "QUERY_STRING" ] =
) ;
// Подключаем библиотекарь
include "librarian.phl" ;
// Здесь можно выполнить еще какие-нибудь действия...
// . . .
// Запускаем тот сценарий, который был запрошен пользователем
include $SCRIPT_FILENAME ;
?>
а в файле .htaccess я написал вот это:
CODE (
htmlphp ):
скопировать код в буфер обмена
# Сначала связываем имя обработчика с конкретным файлом.
# Знак "?" говорит серверу, что исходный URL запроса следует
# передать сценарию методом GET, т. е. через QUERY_STRING.
Action libhandler "/lib/libhandler.php?"
# Теперь уведомляем сервер, документы какого типа мы желаем
# "пропускать" через наш обработчик.
AddHandler libhandler . html . htm
Поиск в теме | Версия для печати
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Если скрипт не работает »
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
Powered by ExBB FM 1.0 RC1. InvisionExBB