Почитал Ваши ответы... еще раз оценил ситуацию... Не совсем уж так все просто.
В самом деле, если бы большой сниппет выполняется без параметров - то можно кешировать результат в глобальную переменную с именем равным имени сниппета.
Но ситуация такова, что сниппет выполняется с параметрами (которые, суть, различные варианты условия where в sql-запросе). Так что получается совсем не просто кешировать вызовы одного того же сниппета с резными параметрами. Уж очень много наплодится переменных в $GLOBALS.
Еще, оказывается, бывают хостинги, c отключенной опцией register globals. То есть, получаем риск написать php-код, непереносимый на другой хостинг.
Но, как бы то ни было,
резюмирую решение, навеянное Вашими ответами:
1)Решение кешировать или не кешировать результаты работы большого сниппета для каждого его вызова из маленького сниппета принимается идивидуально для каждого случая.
2)В каждый маленьком сниппет передаеюся дополнительный параметр: &UseCacheVar=’GlobalVaName’. Ели переменная неинициализирована результат не кешируется. Если инициализирована, то маленький сниппет выполняет следующие действия.
3)Проверяет опцию register globals. Если запрещено - то работаем как раньше.
4)Если register globals разрешено, то проверяется существование глобальной переменной с именем, переданным в параметре &UseCacheVar=’GlobalVaName’. Если переменная существует, то вместо выполнения SQL-запроса читается ее значение.
5)Если переменная не существует, то выполняется запрос, его значение сохраняется в глобальную переменную с таким именем.
6)Далее результат обрабатывается, как ранее.
Вот пример сниппета mini1, переписанного с учетом данных требований:
В сниппете анализируется параметр &UseCacheVar, в котором передается имя глобальной переменной - кеша, который надо проверить.
mini1=
<&php
( isset($UseCacheVar) ) ? $UseCacheVar: $UseCacheVar= "";
if(ini_get('register_globals')!=1 || $UseCacheVar==""):
//если запрещено register globals, или не используем кэширование, то все как раньше
echo substr($modx->runSnippet('bigsnippet'),1, 14);
return;
endif;
if (isset($GLOBALS[$UseCacheVar])):
//если есть в кэше - читаем оттуда
$str=$GLOBALS[$UseCacheVar'];
echo substr ($str,1, 14);
return;
else:
// если нет в кеше - то сначала вычисляем и кладем
$str=$modx->runSnippet('bigsnippet');
$GLOBALS[$UseCacheVar']=$str;
//потом, как обычно
echo substr ($str,1, 14);
endif;
?>
Всем ответившим
большое спасибо.