#php #caching #php-include #phpfastcache
#php #кэширование #php-включить #phpfastcache
Вопрос:
Я хотел бы включить в начало моего скрипта PHP-файл, который открывает условие IF. Затем я пишу свой скрипт, и для завершения я включаю другой PHP-файл, который закрывает условие.
Это приводит меня к ошибке «Ошибка синтаксического анализа: синтаксическая ошибка, неожиданный конец файла в …». ошибка.
Это будет лучше понять на этом простом примере :
header.php
if(aConditionalTest()) {
footer.php
} // endIf
mypage.php
include_once 'header.php';
echo 'my awesome content';
include_once 'footer.php';
К вашему сведению: я хотел бы сделать это, например :
- чтобы везде проверять, авторизован ли пользователь перед отображением содержимого
- внедрить систему кэширования веб-страниц (см. http://www.phpfastcache.com / в разделе «Пример», «Кэширование всей веб-страницы»)
Спасибо!
редактировать: более точно объясните, ПОЧЕМУ я хочу сделать это для использования phpfastcache :
http://www.phpfastcache.com / говорит :
Кэширование всей веб-страницы Кэширование PHP всей веб-страницы: вы также можете использовать phpFastCache для простого кэширования всей веб-страницы. Это простой пример, но в реальном коде вы должны разделить его на 2 файла: cache_start.php и cache_end.php . cache_start.php будет хранить начальный код до тех пор, пока ob_start(); и cache_end.php начнется с получения HTML-страницы.Затем ваш index.php будет включать в себя cache_start.php о начале и cache_end.php в конце файла.
Это именно то, что я пытаюсь сделать! Согласно приведенному ниже фрагменту кода, это приводит к ситуации, когда условие открывается в «cache_start.php » а потом закрылся в «cache_end.php «
cache_start.php
use phpFastCacheCacheManager;
$cache = CacheManager::Memcached();
$keyword_webpage = md5($_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].$_SERVER['QUERY_STRING']);
// try to get from Cache first.
$resultsItem = $cache->getItem($keyword_webpage)
if(!$resultsItem->isHit()) {
ob_start();
cache_end.php
// GET HTML WEBPAGE
$html = ob_get_contents();
$resultsItem->set($html)->expireAfter(1800);
$cache->save($resultsItem);
}
echo $resultsItem->get();
mypage.php
include_once 'cache_start.php';
// my awesome content to cache goes here...
include_once 'cache_end.php';
myotherpage.php
include_once 'cache_start.php';
// my other great content to cache goes here...
include_once 'cache_end.php';
Итак, причина, ПО которой я хочу поместить код phpfastcache в 2 отдельных файла, заключается в том, что у меня много разных PHP-страниц для кэширования, поэтому я хотел бы избежать повторения всего этого кода на каждой странице…
Надеюсь, это редактирование поможет вам лучше понять, почему я бы это сделал, даже если бы я понял, как я и опасался, что это невозможно.
Комментарии:
1. Ой… это не сработает.
2. В чем вопрос?
3. Вопрос в том, «как я могу этого добиться?» Для понимания см. Ссылку phpfastcache. Мне не удается делать то, что они советуют делать…
4. То, что вы хотите, просто невозможно . Закончено.
5. Добавление к тому, что сказали другие. Это невозможно. И, судя по ситуации, вам, вероятно, следует провести рефакторинг. Есть ли причина, по которой вам нужно условие в отдельном PHP-файле?
Ответ №1:
Попробуйте:
как я могу этого добиться?
Сделайте это злым способом и оцените все вместо включения 🙂 Нравится
eval(file_get_contents('header.php').'<?php echo "my awesome content";?>'.file_get_contents('footer.php'));
Это может быть решением, если вы хотите присоединиться к темной стороне 🙂
Примечание: в этом решении вы должны следить за глобальными переменными!!
Но, пожалуйста, обратите внимание на тот факт, что вы хотите распространить условия на отдельные файлы, что, на мой взгляд, очень, очень, очень плохая практика.
Я действительно ответил на это 8]
Комментарии:
1. Да, я согласен, это ДЕЙСТВИТЕЛЬНО плохое программирование. Это «БОЖЕ МОЙ, я бы боялся пытаться поддерживать это. Давайте выбросим этот мусор в корзину и начнем сначала » код.
2. Я не буду переходить на темную сторону … 🙂
3. @DataHerder конечно, это плохо … но 1 от меня за смелость использовать
eval()
этот способ.4. @Wh1T3h4Ck5 Я удалил это только из-за комментария OP
"how can I achieve this ?"
. Поэтому я даю прямой ответ. 🙂 О боже, нам всем здесь будет весело, когда PHP7 станет основной используемой версией PHP. 😉 Но спасибо за точку.5. @DataHerder 🙂
Ответ №2:
Я пробую это другим способом.
Единственное правило: работает только в глобальном пространстве (где еще :-))
Итак, вы хотите открыть if() cache_start.php
и закрыть его cache_end.php
. (по причинам ob_cache)
Но если условие не изменено, почему бы не выполнить условие дважды!
В каждом файле проверьте на if(condition)
!
Или настройте подобный $cach_op_started=true
параметр и проверьте его во втором if() в cache_end.php
Обе вещи должны работать на вас.
Немного забавно, что я не видел этого решения в первый раз 🙂
Последнее замечание: вы также можете использовать автоматическое добавление и добавление файлов в PHP, если хотите. Это можно настроить в php.ini. Файлы будут автоматически загружаться до и после скрипта, всегда. http://www.webdevsecrets.com/using-phps-auto_prepend_file-and-auto_append_file /
Приятного времяпрепровождения.
Комментарии:
1. @DataHerder Смотри, он живой 🙂
2. @TooLiPHoNe.NeT Второй блок кода проясняет, что первая сокращенная версия действительно была недостаточно понятной. После того, как я узнаю все, на
ob_cache
это легко ответить.3. спасибо, это очень простое решение, и оно отлично работает! Я поместил глобальное логическое значение в «начальный» включенный PHP-файл и использовал его для условий в «конечном» PHP-файле, а также в моем PHP-файле «content», который я хотел бы кэшировать… Не знаю, почему я сам об этом не подумал … 🙂
Ответ №3:
Итак, я понимаю, что проблема в том, что, когда вы не хотите, чтобы определенный пользователь видел содержимое страницы, остальная часть страницы не загружается, и это вызывает ошибку?
Если да, то почему вы просто не всегда включаете файлы и на конкретной странице устанавливаете условия для того, кто что может просматривать?
Я использую ob_start() в своем заголовке и ob_end_flush в нижнем колонтитуле, который отлично работает. а затем проверьте с помощью моих переменных СЕАНСА содержимое конкретной страницы, имеет ли зарегистрированный пользователь право просматривать содержимое, иначе отобразится сообщение типа: «Вы не авторизованы для просмотра этого содержимого»