问题背景

更新game.37.com业务的smarty模板后,服务器上出现多条500报错记录。PHP错误日志中的报错如下:

[16-May-2016 15:46:01 Asia/Shanghai] PHP Fatal error: Call to undefined function content_57397470478e99_59376883() in /*/template_c/6aede77242b285842c628673e93d8bf1bd4bc6b0.file.server_list.htm.php on line 67

现象:更新模板后,首次访问报500错误,再次访问正常。

问题排查

按正常使用smarty的经验来说,更新模板后,不会导致PHP500错误。因此猜想可能是服务器的环境问题,列出特殊的配置环境排查。

在预发布环境中,优先检查加速器eAccelerator。因为eAccelerator加速器会缓存PHPopcode,有可能导致该问题。

在测试环境进行测试

调试页面:http://game.37.com/server_list_275.html
调试模板:main.htm
生成的smarty编译文件:/*/template_c/6aede77242b285842c628673e93d8bf1bd4bc6b0.file.server_list.htm.php

检查smarty的编译文件

对比更新smarty模板后的2个编辑文件,发现PHP报错原因是调用了旧模板中的函数。

PHP的异常报错信息PHP Fatal error: Call to undefined function content_573a944d7a2608_39051073() in /*/template_c/6aede77242b285842c628673e93d8bf1bd4bc6b0.file.server_list.htm.php on line 67

smarty工作原理图:


问题出在更新smarty模板后,虽然smarty生成了新的编译文件,但是旧文件的内容仍然被加速器缓存,其中包含了调用模板文件中一个函数的名称。打开加速器的命中日志,可以查看到相关的记录:


解决方案

1)配置加速器filter参数,smarty的编译文件不缓存
eaccelerator.filter="!/*/template_c/*.php"
但是要评估对性能的影响

2)更换为加速器APC
原因:现在使用的eaccelerator是1.0-dev版,并非正式发布的版本。APC来源于官方,并且能下载到stable版本。


以上就介绍了eaccelerator+PHP54导致smarty更新模板500报错,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

09-12 22:59