webman中使用smarty必须注册为容器单例,禁用缓存以防模板不更新,严格设置templates_c和cache目录权限与路径,v5+需composer安装并启用psr-4自动加载。

Webman 默认不支持 Smarty,也不能像传统 PHP-FPM 项目那样直接 require_once 后 new 一个 Smarty 实例就完事——常驻内存 + 协程环境下,未适配的模板引擎极易引发缓存错乱、目录竞争、内存泄漏甚至协程间变量污染。
Webman 中初始化 Smarty 必须注册为单例
每次请求都 new Smarty() 是危险操作:编译缓存目录(templates_c)会被多 worker 并发写入,导致 .php 编译文件内容损坏;$smarty->assign() 的内部状态也可能跨协程残留。必须在服务启动时注册为容器单例:
- 在
config/autoload/dependencies.php中添加:return [ \Smarty::class => function () { $smarty = new \Smarty(); $smarty->setTemplateDir(runtime_path('templates')); $smarty->setCompileDir(runtime_path('templates_c')); $smarty->setCacheDir(runtime_path('cache')); $smarty->setConfigDir(runtime_path('configs')); // 开发阶段务必关闭缓存,否则改了 .tpl 不生效 $smarty->caching = false; return $smarty; } ]; -
runtime_path()确保路径落在 Webman runtime 目录下,避免跨进程共享风险 - 不要用
./templates这类相对路径——Swoole worker 工作目录不可控
Smarty v5+ 需要 Composer 自动加载,不能直接 require class 文件
Smarty v5(如 v5.3.1)已完全转向 PSR-4,不再提供 Smarty.class.php 入口文件。直接 require 'libs/Smarty.class.php' 会报错 Class "Smarty" not found:
- 正确安装方式:
composer require smarty/smarty:^5.3 - 确保
vendor/autoload.php已在bootstrap/app.php中引入(Webman 默认已做) - v5+ 的命名空间是
\Smarty\Smarty,但官方 alias 了\Smarty,所以仍可用new \Smarty() - 若用 v3.x(如
v3.1.34),虽保留Smarty.class.php,但需手动处理自动加载,不推荐
模板中调用 PHP 函数需显式开启,且有协程安全风险
Smarty 默认禁用 {php} 标签和 include_php,因为它们会直接执行任意 PHP 代码,破坏模板沙箱;更关键的是,在协程中执行阻塞式函数(如 file_get_contents、curl_exec)会导致整个 worker 挂起:
- 如真需嵌入逻辑,先启用:
$smarty->allow_php_templates = true; - 但禁止在
{php}块里调用同步 I/O —— 应提前在控制器中完成数据获取,再assign()进模板 - 更安全的做法:用
registerPlugin('function', 'my_date', ...)注册无副作用的纯函数 -
{include_php file="xxx.php"}同样危险,等同于include,应彻底弃用
缓存目录权限与生命周期必须手动管理
Webman 不会自动清理 templates_c 或 cache 目录,而 Smarty v5 的编译缓存默认按文件修改时间判断是否过期——但在常驻进程中,文件系统 mtime 可能无法被及时感知,导致模板更新后仍渲染旧内容:
- 开发期强制关缓存:
$smarty->caching = false;(上面已提) - 生产环境开缓存时,必须设置
$smarty->cache_lifetime = 3600;,并配合定时脚本清理过期缓存 -
templates_c目录需确保 Webman 运行用户(如 www-data)有读写权限,Linux 下建议:chown -R www-data:www-data runtime/templates_c - 切勿将
templates_c设在/tmp或共享 NFS 路径——worker 进程间缓存文件可能互相覆盖
最难缠的不是配置步骤,而是忘记 $smarty->caching = false 导致改了模板却反复看到旧页面,或者没意识到 templates_c 权限不对而卡在白屏——这些坑往往只在部署后才暴露。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











