0

Google Application Engine の PHP 環境で Smarty を使用して PHP アプリケーションを移植する必要があります。

開発ガイドラインの見直し:

「App Engine アプリケーションは次のことができません。

ファイルシステムに書き込みます。PHP アプリケーションは、Google Cloud Storage を使用して永続ファイルを保存できます。ファイルシステムからの読み取りが許可され、アプリケーションと共にアップロードされたすべてのアプリケーション ファイルが利用可能です。」

この制限は、コンパイルされた smarty テンプレートに適用されますか? コンパイルによってファイル システムに書き込まれるためです。

ローカルで GAE を起動してみましたが、うまくいきましたが、運用環境にまだアクセスできないため、デプロイを試すことができません。

誰かがそれについてニュースを持っていますか?提案?回避策?

4

3 に答える 3

1

Google App Engine のドキュメントに記載されているように、APC 拡張機能が有効になっているため、次のように smarty のキャッシュ マネージャーとして使用できます: http://www.smarty.net/forums/viewtopic.php?t=16809

于 2013-07-22T12:28:17.343 に答える
0

テンプレートをデプロイする前にプリコンパイルできます - アイデアは、すべてのコンパイル済みファイルを一度に作成するスクリプトを用意することです - 実行する前に毎回実行する必要があります。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 がコンパイル済みファイル名をどのように作成しているかを把握できます。

于 2016-07-28T12:12:35.017 に答える