我需要在PHP环境中使用Smarty为PHP Application Engine移植PHP应用程序。
审核开发指南:
“App Engine应用程序不能:
写入文件系统。 PHP应用程序可以使用Google Cloud Storage存储持久性文件。允许从文件系统读取,并且随应用程序一起上传的所有应用程序文件都可用。“
此限制是否适用于已编译的智能模板?因为编译会将它们写在文件系统上。
我尝试在本地启动GAE并且它可以工作,但我无法尝试部署,因为我还没有访问生产环境。
有人的新闻吗?建议?解决办法:
答案 0 :(得分:1)
正如谷歌应用引擎文档中所述,APC扩展已启用,因此您可以将其用作智能缓存管理器,如下所示:http://www.smarty.net/forums/viewtopic.php?t=16809
答案 1 :(得分:1)
在smarty 3演示中,我修改了index.php,添加了这2行:
$ smarty-> compile_dir =“gs:// achievotmp / compiled /”; $ smarty->的cache_dir = “GS:// achievotmp /高速缓存/”;
smarty 3演示索引在本地和GAE云中运行。 (别忘了创建存储桶,例如:achievotmp)。
答案 2 :(得分:0)
您可以在部署模板之前预先编译模板 - 我们的想法是让脚本一次创建所有已编译的文件 - 您必须在每次执行之前执行它appcfg.py update .
这样可以避免使用Google存储!
以下是文件tpl资源的解决方案 - 但是您可以修改它以便它支持其他资源处理程序(例如,从数据库加载smarty模板时)
Smarty模板目录必须包含相对路径,我们需要覆盖Smarty库中_realpath的行为 - 以便在不同的环境中拥有相同的编译文件名。
这是构建目录app/Templates
中所有Smarty模板文件的build.php
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 而已。
对于调试,你可以检查Smarty/libs/sysplugins/smarty_template_compiled.php
的函数populateCompiledFilepath来了解,Smarty如何编译文件名。