簡體   English   中英

PHP全局變量在Web請求期間失去價值

[英]PHP global variable loses value during web request

我有一個帶有靜態函數的實用程序類,該函數利用全局變量:

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"];來引用全局$memcached_node = $GLOBALS["memcached_node"]; 作為我的“最后一次努力”飛鏢之一。 行為是相同的。

環境

  • PHP 5.3.4(CLI)(內置:2011年1月21日00:08:14)
  • nginx 1.0.6
private static function isRateLimited($ip) {
    var_dump(debug_backtrace()); // or log to file - whatever suits the context
    // ...
}

您可以使用PHP的debug_backtrace()函數跟蹤調用( 更多信息,請 debug_backtrace() 此處 )。 另外,您可以增加一個全局計數器變量,並且僅在確定地知道哪個調用是錯誤的情況下, isRateLimited()給定服務器請求的isRateLimited()第n次調用執行此操作。

發生了類似的問題,在靜態函數調用全局變量存在之前,靜態函數內部為空。 全局關鍵字上的內容已為空。 但是我是通過引導程序為PHPunit加載代碼的。 如果沒有PHPunit,它會按預期工作。

我最終要做的是將變量明確分配為超級全局變量:

$GLOBALS['foo'] = $foo;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM