include и ob_get_clean()

smike

Новичок
include и ob_get_clean()

На хостинге:
PHP Version 5.2.3
FreeBSD 6.2-STABLE
Apache/1.3.37
Server API: CGI

На тестовой машине:
PHP Version 5.1.2
FreeBSD 5.5-RELEASE
Server API Apache
Apache/1.3.34

Пример скрипта
PHP:
function showPage()
{
    global $_var;
    $var=array();
    $tpl='/home/host/data/www/host.com/mods/sys/admin/skins/default/tpl.page.php';
    $var['text']='Hello';
    $_var['body']=sys::рarseTpl($tpl,$var);
}
Код функции sys::рarseTpl()
PHP:
class sys
{
    function parseTpl($tpl,$var)
    {
         ob_start();
         require($tpl);
         return ob_get_clean();
    }
}

На тестовой машине везде отрабатывает нормально.
У хостера отрабатывает не всегда, иногда выдает ошибку:

Warning: sys::require(/home/host/data/www/host.com/mods/sys/admin/skins/default/tpl.page.php) [function.sys-require]: failed to open stream: No such file or directory in /usr/home/host/data/www/host.com/mods/sys/include/lib.sys.php on line 330

Fatal error: sys::require() [function.require]: Failed opening required '/home/host/data/www/host.com/mods/sys/admin/skins/default/tpl.page.php' (include_path='.:/usr/local/share/pear') in /usr/home/host/data/www/host.com/mods/sys/include/lib.sys.php on line 330


т.е. у хостера при вызове функции sys::parseTpl() один скрипт отрабатывает, другой аналогичный скрипт выдает ошибку которую я привел выше. Причем в разных случаях функция sys::parseTpl() не может проинклудить разные файлы шаблонов. Т.е. при вызове sys::parseTpl() из одного скрипта шаблон tpl.page.php инклудится, при вызове из другого нет, при вызове из третьего скрипта не инкулдится шаблон tpl.menu.php который инклудится из четвертого. Вот такая чертовщина.

Хостер посоветовал модифицировать код sys::parseTpl()
вместо:
PHP:
return ob_get_clean();
написать:
PHP:
$ret = ob_get_clean();
return $ret;
Я внес изменения на локальной машине и на хостинге, ошибка исчезла, но при очередном обновлении php-файлов сайта появилась опять, но уже при вызове sys::parseTpl() из других скриптов.

Если кто сталкивался с подобной проблемой пожалуйста подскажите в чем дело. Так как я никак не могу понять закономерность возникновения данной ошибки.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Это к чему было?
Если кто сталкивался с подобной проблемой пожалуйста подскажите в чем дело.
никто не стыкался

Так как я никак не могу понять закономерность возникновения данной ошибки.
закономерность одна и Вы её сами назвали.

ри очередном обновлении php-файлов сайта
 

smike

Новичок
Автор оригинала: Mr_Max
никто не стыкался
Вы хотели сказать что Вы не стыкались.


закономерность одна и Вы её сами назвали.
Код функции sys::parseTpl не изменился, на локальной машине тот-же код работает нормально, где тут закономерность?
 

Zetruger

ivan.chistyakov.name
а какая разница между

return ob_get_clean();

и

$ret = ob_get_clean();
return $ret;

???

по моему никакой, а значит и помочь тебе оно не могло не коим образом
 

smike

Новичок
Автор оригинала: Zetruger
а какая разница между

return ob_get_clean();

и

$ret = ob_get_clean();
return $ret;

???

по моему никакой, а значит и помочь тебе оно не могло не коим образом
Хостер(17:36:02 29/08/2007)
так нормально работает?

smike (17:36:26 29/08/2007)
ага спасибо :) а в чем трабл был?


Хостер (17:36:38 29/08/2007)
это не фича, это бага.


Хостер (17:36:44 29/08/2007)
$ret = ob_get_clean();
return $ret;



Хостер (17:36:59 29/08/2007)
было

return ob_get_clean();



Хостер (17:37:21 29/08/2007)
я такую багу когда то 2 дня ловил.


smike (17:37:40 29/08/2007)
это с какой версии бага?


Хостер (17:38:40 29/08/2007)
с 5.1.6 по 5.2.3 наблюдаю местами
 

smike

Новичок
Автор оригинала: Mr_Max
smike
вообще при чём здесь
ob_get_clean

Если ошибка в
Я как раз и пытаюсь это понять :).
Тем не менее замена
PHP:
return ob_get_clean();
на
PHP:
$ret = ob_get_clean();
return $ret;
один раз помогла
 

ustas

Элекомист №1
а может хостер кривой, и кривой пхп собрал, ? вот и гоняется. не задумывался?
и при чем ob get clean? ошибка вроде как в require($tpl);
проверяй пути и права на чтение, is_readable для начала, и плюнь хостеру в лицо
 

smike

Новичок
Автор оригинала: ustas
а может хостер кривой, и кривой пхп собрал, ? вот и гоняется. не задумывался?
и при чем ob get clean? ошибка вроде как в require($tpl);
проверяй пути и права на чтение, is_readable для начала, и плюнь хостеру в лицо
Если бы я не проверил права и пути я бы сюда не писал. Хостер "прямой", по крайней мере не отмораживается что проблема в моем скрипте, а не в его хостинге, а пытается помочь, так что плевать ему в лицо не за что. Где ошибка я и сам вижу, но по крайней мере одни раз фокус с ob_ помог, хотя я тоже не понимаю каким боком тут замешан ob_.
 

AmdY

Пью пиво
Команда форума
ну давай ещё я попробую сказать, что у тебя ошибка при подключении файла, судя по всему нужно не
PHP:
$tpl='/home/host/data/www/host.com/mods/sys/admin/skins/default/tpl.page.php';
..замени
$tpl='/usr/home/host/data/www/host.com/mods/sys/admin/skins/default/tpl.page.php';
 

smike

Новичок
AmdY
Огромное спасибо!
А в чем фишка, почему один и тот же файл из одного скрипта инклудился, а из другого нет если путь указывался через симлинк?
Тем более что у меня путь к корню жестко в конфиг-константе прописан, и все файлы движка успешно инклудились через симлинк...
 

dimagolov

Новичок
блин, через день на форуме No such file or directory и каждый раз или относительный путь или еще какое извращение, но тем не меннее все равно надо доказывать чем абсолютный путь лучше.
Можно где-то в FAQ прописать и правилах форума, что вопросы о скриптах с неабсолютными путями это злостное нарушение правил?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
dimagolov
не поможет
 

smike

Новичок
dimagolov
Полегче на поворотах уважаемый, я и сам всегда использую абсолютные пути. DOCUMENT_ROOT я взял из phpinfo хостера, я не подозревал что в нем есть симлинк, тем более что ранее проблем с инклюдами через симлинки у меня никогда небыло.
 

ustas

Элекомист №1
файлик "я лежу в корне, и все меня включают"
$dir = dirname(realpath(__FILE__));

if (substr(PHP_OS, 0, 3) == 'WIN') {
ini_set('include_path',$dir.';'.ini_get('include_path'));
} else {
ini_set('include_path',$dir.':'.ini_get('include_path'));
}
unset($dir);

и юзать inc..('mods/sys/admin/skins/default/tpl.page.php')

и все таки плюнь хостеру в лицо, а то в следующий раз ниче нибудет работать из за echo

а
Хостер (17:37:21 29/08/2007) я такую багу когда то 2 дня ловил. smike (17:37:40 29/08/2007) это с какой версии бага? Хостер (17:38:40 29/08/2007) с 5.1.6 по 5.2.3 наблюдаю местами
в юмор однозначно
 

dimagolov

Новичок
smike, для чего тебе вообще DOCUMENT_ROOT????? ты не знаешь пути от корня своих скриптов? те, что подключаем вообще могут лежать где угодно (и вне DOCUMENT_ROOT), лишь бы у php прав прочитать хватало.
поищи тут по faq что такое пути в скриптах и пути в сайте и чем они отличаются и для чего нужны....
 

smike

Новичок
Автор оригинала: dimagolov
smike, для чего тебе вообще DOCUMENT_ROOT????? ты не знаешь пути от корня своих скриптов?
Представь себе не знал, у меня был доступ только к ftp и phpMyAdmin, поэтому самым простым способом узнать этот путь я посчитал посмотреть значение переменной DOCUMENT_ROOT в phpinfo .
те, что подключаем вообще могут лежать где угодно (и вне DOCUMENT_ROOT), лишь бы у php прав прочитать хватало
Да ты что!!??? Я и не подозревал об этом! :D
поищи тут по faq что такое пути в скриптах и пути в сайте и чем они отличаются и для чего нужны....
В "скриптах" это надо понимать в файловой системе сервера? :D Если у меня в профиле написано "новичек", это значит лишь то что у меня не слишком много времени зависать на форумах ;).

Раз уж ты такой продвинутый гуру, что тыкаешь меня носом в FAQ может все таки объяснишь, почему при использовании симлинков в пути один и тот же файл в одном скрипте инклудился, а в другом нет? ;)
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Ребята для выяснения отношений пользуйтесь ЛС.
 
Сверху