smarty和PHP Google Application Engine兼容性

时间:2013-07-22 12:12:01

标签: php smarty

我需要在PHP环境中使用Smarty为PHP Application Engine移植PHP应用程序。

审核开发指南:

“App Engine应用程序不能:

写入文件系统。 PHP应用程序可以使用Google Cloud Storage存储持久性文件。允许从文件系统读取,并且随应用程序一起上传的所有应用程序文件都可用。“

此限制是否适用于已编译的智能模板?因为编译会将它们写在文件系统上。

我尝试在本地启动GAE并且它可以工作,但我无法尝试部署,因为我还没有访问生产环境。

有人的新闻吗?建议?解决办法:

3 个答案:

答案 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如何编译文件名。