查看服务器 PHP 错误日志发现,某种类型的 PHP 通知出现频率最高,这与 Smarty 有关。我发现了一个似乎描述相同错误的问题,但实际上没有答案。
通知如下(有不同的变量声明为未定义):
PHP Notice: Undefined variable: is_admin in /usr/share/php/Smarty/sysplugins/smarty_internal_data.php on line 291
我想知道我怎么可能调试这个,因为没有提供数据(如模板名称)。
下面我会给你一些代码的想法(你可以在这里详细阅读,因为它都是开源的)。
因此,在名为 的文件中创建了一个全局 smarty 对象header.php
,并且在同一个文件中进一步设置了一些全局 smarty 变量,包括上面通知中的变量:
//init Smarty
require_once('Smarty.class.php');
$smarty = new Smarty();
...
$smarty->assign('is_admin', is_admin() ? 1 : 0);
然后header.php
将其包含在需要通过调用显示一些 HTML 的每个文件中$smarty->display(...)
。所以我假设在该$smarty
对象存在的任何文件中,该对象都有一个名为 is_admin 的变量。然而,情况似乎并非如此。
此外,关于未设置变量的“正常”Smarty 警告看起来不同:
PHP Notice: Undefined index: sent_id in /var/www/smarty_dir/templates_c/a5aab2c66c44442365a39981ba9be18e0a1f11ad.file.history.tpl.cache.php on line 123
有任何想法吗?
更新。 我阅读了一些日志,发现当用户进入页面并获得 302 HTTP 状态时似乎会出现此类警告。这可能是由于以下代码(它放置在 smarty 构造函数调用之后但在分配变量之前:
//cookie check
if (!is_logged() && isset($_COOKIE['auth'])) {
if ($user_id = check_auth_cookie()) {
if (user_login('', '', $user_id, $_COOKIE['auth'])) {
header("Location:".$_SERVER['REQUEST_URI']);
return;
}
}
}
所以我想我应该$smarty
在这个块之后移动初始化,它可能会有所帮助。我仍然很好奇它与这个问题的关系。