Чем закешировать фрагмент кода в выводе тизера?

Главные вкладки

Аватар пользователя meloff meloff 3 сентября 2013 в 23:50

На моем сайте перекрыт вывод тизера. В момент генерации срабатывает кусок кода, который отправляет curl запрос по ссылке и возвращает либо размер файла, либо сообщение о том, что файл не найден. Когда на странице 20 тизеров, время загрузки получается крайне большим, т.к. скрипту каждый раз приходится пинговать 20 ссылок. А если, в теории, все 20 ссылок не будут доступны, то страничка будет грузиться 20 секунд, судя по параметру CURLOPT_TIMEOUT, 1. Поставил буст, для анонимов работает хорошо - страничка отдается мгновенно, но вот для зарегенных разница в скорости загрузки колоссальна. Собственно отсюда вопрос - как можно это дело закешировать?

Комментарии

Аватар пользователя Chyvakoff Chyvakoff 4 сентября 2013 в 9:32

Добавить cck поле в ноду, в которой будешь хранить ответ пинга. При первом просмотре тизера пусть файл пингуется и в поле ответ сохраняется. В дальнейшем проверяй вначале поле.

Аватар пользователя meloff meloff 4 сентября 2013 в 22:55

"Chyvakoff" wrote:

Хм.. вариант интересный. Надо обмозговать.. Спасибо! Я так понимаю это можно сделать с помощью rules.

Сейчас пока я установил модуль authcache, он вроде как справляется с задачей. Тест Load Impact прошел вполне удачно. Но конечно лучше как-то отдельно управлять полем.

Аватар пользователя Chyvakoff Chyvakoff 5 сентября 2013 в 9:06

Можно кодом, можно и рулсами.
На событие просмотр тизера + условие что cck поле пустое
Действие-php код,в котором пингуется нужный урл и ответ сохраняется в cck поле.

Аватар пользователя meloff meloff 9 сентября 2013 в 23:49

Да, все получилось! Большое спасибо.

Как я сделал - в материале создал текстовое поле field_link_data с четырьмя значениями.

Прописал правило в rules:

Событие - "После просмотра материала" (название сбивает с толку.. кажется, что правило выполнится после вывода страницы и измененную инфу можно будет увидеть только при повторном открытии страницы, хотя это не так.. по факту правило срабатывает до вывода информации на экран, что очень хорошо)

Условие - Тип материала тратата, далее операнд OR и в нем еще 3 условия.
1 - Значение отсутствует, которое смотрит на node:field-link-data.
2 - PHP код, который сравнивает совпадает ли ссылка в ноде с ссылкой в третьем значении поля field_link_data:
<?php
$field_link = field_get_items('node', $node, 'field_link');
$field_link = $field_link[0]['url'];
$field_link_data_url = $node->field_link_data['und'][2]['value'];
if ($field_link == $field_link_data_url) { return false; }
else { return true; }
?>
3 - PHP код, который вернет true, если прошло более часа, после последнего обновления данных о ссылке:
<?php
$time_save = $node->field_link_data['und'][3]['value'];
$time_last = time() - $time_save;
if ($time_last > 3600) { return true; } else { return false; }
?>

Ну и действие, которое вызывает curl функцию check_file_url, прописанную в template.php и сохраняет данные во все четыре значения поля field-link-data, а именно - 4 символа окончания ссылки, размер файла, либо сообщение об ошибке, ссылка на файл и текущее время:
<?php
$field_link = field_get_items('node', $node, 'field_link');
$field_link = $field_link[0]['url'];
$arr_file = check_file_url($field_link);
$node->field_link_data['und'][0]['value'] = $arr_file[0];
$node->field_link_data['und'][1]['value'] = $arr_file[1];
$node->field_link_data['und'][2]['value'] = $field_link;
$node->field_link_data['und'][3]['value'] = time();

field_attach_presave('node', $node);
field_attach_update('node', $node);
?>

И в теме ноды, соответственно, у меня выводятся первые два значения. Таким образом, информация о ссылке будет пинговаться не чаще 1 раза в час, если автор изменил ссылку, то инфа обновится, и если нода новая и поле с данными пустое, то также сработает пропинговка файла по ссылке. Вроде работает. Спасибо! Smile