テンプレートをデプロイする前にプリコンパイルできます - アイデアは、すべてのコンパイル済みファイルを一度に作成するスクリプトを用意することです - 実行する前に毎回実行する必要があります。appcfg.py update .
これにより、Google ストレージの使用をまったく回避できます!
これはファイル tpl リソースのみのソリューションですが、他のリソース ハンドラをサポートするように変更できます (たとえば、データベースから smarty テンプレートをロードする場合)。
Smarty テンプレート ディレクトリには相対パスが含まれている必要があり、Smarty ライブラリの _realpath の動作をオーバーライドする必要があります - 異なる環境間で同じコンパイル済みファイル名を持つために。
これはディレクトリ内のすべての Smarty テンプレート ファイルをビルドする build.php です。app/Templates
require_once('libs/Smarty/libs/Smarty.class.php');
class SmartyCompileDir extends Smarty {
public function _realpath($path, $realpath = null) {
return $path;
}
}
$smarty = new SmartyCompileDir;
$smarty->setCompileDir(__DIR__ . "/template_c");
// Template dir must be relative
$smarty->setTemplateDir("app/Templates");
// make sure the escape html is enabled only if enabled in production!
$smarty->setEscapeHtml(false);
// empty compile directory
foreach (glob(__DIR__ . "/template_c/*.php") as $filename) {
if (is_file($filename)) {
unlink($filename);
}
}
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator("app/Templates", FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS), RecursiveIteratorIterator::CHILD_FIRST) as $value) {
if ($value->isFile()) {
$file = (string)$value;
$_smarty = clone $smarty;
$_smarty->force_compile = true;
$_tpl = new $smarty->template_class($file, $_smarty);
$_tpl->caching = Smarty::CACHING_OFF;
$_tpl->source = Smarty_Template_Source::load($_tpl);
if ($_tpl->mustCompile()) {
$_tpl->compileTemplateSource();
echo ' compiled ' . $file . "\n";
flush();
} else {
echo ' ' . $file . ' is up to date' . "\n";
flush();
}
}
}
ビルドが完了したら、すべてのテンプレートをコンパイルする必要があります。それらをチェックアウトすると、ファイルのヘッダーに相対パスが含まれている必要があります。7c3fc31b70e264e4d45f4ba59da830015ed4025f_0.file.index.tpl.php
/* Smarty version 3.1.29, created on 2016-07-28 13:52:49
from "app/Templates/controls/column-tags.tpl" */
次に、このようにアプリで Smarty を初期化します
require_once(LIBS_DIR . "/Smarty/libs/Smarty.class.php");
class SmartyCompileDir extends \Smarty {
// this is to resolve all ../ to relative path - if you use smarty include function with relative path containing ..
public function _realpath($path, $realpath = null) {
$parts = explode('/', $path);
foreach($parts as $part) {
if ($part == '.') {
continue;
} if ($part == '..') {
array_pop($result);
} else {
$result[] = $part;
}
}
return (implode('/', $result));
}
}
$smarty = new SmartyCompileDir();
// relative path so we work fully from pre-compiled version
$smarty->setTemplateDir("app/Templates");
$smarty->setCompileDir(__DIR__ . "/template_c");
// do not check file modification time
$smarty->setCompileCheck(false);
// this must be set same as in the build script
$smarty->setEscapeHtml(false);
$smarty->display("index.tpl");
template_c ディレクトリを使用してアプリを GAE にデプロイします。
デバッグの場合、関数 populateCompiledFilepath をチェックSmarty/libs/sysplugins/smarty_template_compiled.php
して、Smarty がコンパイル済みファイル名をどのように作成しているかを把握できます。