PHP全局变量在Web请求期间丢失值

时间:2011-09-13 00:09:11

标签: php global-variables

我有一个带有静态函数的实用程序类,它使用全局变量:

private static function isRateLimited($ip) {
    global $memcached_node;

    $memcache = new Memcache;
    $memcache->connect($memcached_node['host'], $memcached_node['port']) or die ("memcache failure");

    // do stuff
}

全局变量通过厨师食谱设置。在最近的变化之前,一切都在应用程序中运行良好。更改调整了代码执行,以便在单个Web请求期间调用isRateLimited()两次。

调试显示,第一次调用isRateLimited()时,全局变量已设置,一切都按预期工作。但是,第二次调用isRateLimited()时,全局变量返回一个空值(使用empty()进行测试)。结果是与memcached的第二个连接失败。

全局不会被代码中的任何其他地方覆盖或取消设置。 为什么全局变量在同一Web请求中执行函数之间会失去其值?

作为参考,我尝试将全球使用$memcached_node = $GLOBALS["memcached_node"];作为我的“最后努力”飞镖之一。行为是一样的。

环境

  • PHP 5.3.4(cli)(建于:2011年1月21日00:08:14)
  • nginx 1.0.6

2 个答案:

答案 0 :(得分:1)

private static function isRateLimited($ip) {
    var_dump(debug_backtrace()); // or log to file - whatever suits the context
    // ...
}

您可以使用PHP的debug_backtrace()函数(more info here)跟踪调用。或者,如果您明确知道哪个调用是错误的,则可以递增全局计数器变量,仅针对给定服务器请求的 nth 调用isRateLimited()执行此操作。

答案 1 :(得分:0)

有类似的问题,在静态函数调用全局变量存在之前,静态函数内部为空。它在全局关键字上变得空洞。但我正在通过bootstrap为PHPunit加载代码。没有PHPunit,它按预期工作。

我最终做的是明确地将变量指定为超级全局:

$GLOBALS['foo'] = $foo;