
Раздел содержит инструкции по ручной доводке Drupal CMS до нас удовлетворяющего состояния. Настройка, модификация, расширение Drupal от Виталия и Юлии Сергеевых.
Устарело! Написано еще для drupal 4.7.1, но такой подход можно использовать и для drupal 5.x, надо понимать что будут побочные эффекты, на виртуальных хостингах возможны проблемы с правами доступа к файлам кеша.
С кешированием в друпал почти всё хорошо, во всяком случае на порядок лучше, чем в у многих. Но есть что добавить. В Drupal, по умолчанию, не рассчитывается полезный http заголовок ответа content-length. Здесь указанно как это исправить.
в файле bootstrap.inc:
после строк
header("Last-Modified: $date");
header("ETag: $etag");
добавить
header("Cache-Control: must-revalidate");
и перед строками
print $cache->data;
bootstrap_invoke_all('exit');
exit();
добавить
header("Content-Length: ".strlen($cache->data));
Если вас не очень устраивает производительность Drupal при обслуживании мало динамичного контента, то следующий совет может вам пригодиться. Drupal имеет свою систему кэширования, но есть несколько случаев, когда лучше бывает подумать о каком-нибудь еще более эффективном способе кэширования. Например, как в моём случае, вы не представляете зачем писать на PHP4, когда уже более двух лет есть PHP5. Вам нужно всё то, чего нет в четвёрке, и вас особенно огорчает отсутствие PHP5 на хостинге. Компилируем PHP5 как cgi, и работаем дальше (подыскивая новый нормальный хостинг). А проблему недостаточно быстрого отклика с сервера, можно частично решить слегка модифицировав стандартный механизм кэширования друпала и дописав несколько строк в htaccess (чтобы не было тупого copy/paste, додумывайтесь сами каких строк, могу только подсказать, что использовать надо mod_rewrite - или посмотрите в конец страници).
в файле common.inc:
function page_set_cache() {
global $user, $base_root;
//Vitaliy's code
if (!$user->uid && $_SERVER['REQUEST_METHOD'] == 'GET') {
// This will fail in some cases, see page_get_cache() for the explanation.
if ($data = ob_get_contents()) {
header('WriteCache: true');
if ($CROOT == NULL){
$CROOT = $_SERVER['DOCUMENT_ROOT'].'/cache';
}
if (request_uri() == '/' or request_uri() == ''){
file_put_contents($CROOT.'/index.html',$data."\n<!-- Cache hit ".date("F j, Y, g:i a")." -->");
//file_put_contents($GZIPCROOT.'index.html.gz',$out);
} else {
makedirs(request_uri(),$CROOT);
htmlcache(request_uri(),$CROOT,$data);
//$this->gzipcache($url,$GZIPCROOT,$out);
}
...
//Vitaliy's code
function makedirs($url,$CROOT){
$parts = explode('/',$url);
$path = '';
foreach ($parts as $part){
$path.='/'.$part;
if(!file_exists($CROOT.$path)){
mkdir($CROOT.$path);
}
};
}
//Vitaliy's code
function htmlcache($url,$CROOT,$out){
file_put_contents($CROOT.'/'.$url.'/index.html',$out."\n<!-- Cache hit ".date("F j, Y, g:i a")." -->");
}
(дописано по заявке анонима)
в htaccess писать, что-нибудь вроде внизу приведенного, или что-нибудь по лучше
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{REQUEST_URI} ^(.*)/$
RewriteCond /какой-то/путь/.cache%1/index.html -f
RewriteRule ^(.*)/$ /.cache%1/index.html [L] RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/?$ /index.php?virtualurl=$1 [QSA]
а в htaccess что
а в htaccess что писать?
Что-нибудь
дописал в статью
В этой статье
В этой статье не описывается, к сожалению, зачем делаются подобные изменения и к чему они приведут...
Спасибо,
Спасибо, интересно.
Пожелание - указывать версию Drupal.