Глобальная переменная PHP теряет значение во время веб-запроса - PullRequest
0 голосов
/ 13 сентября 2011

У меня есть служебный класс со статической функцией, которая использует глобальную переменную:

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
}

Глобальная переменная устанавливается с помощью поваренной книги шеф-повара.Все работало хорошо в приложении до недавнего изменения.Изменено выполнение кода, так что isRateLimited() вызывается дважды во время одного веб-запроса.

Отладка показала, что при первом вызове isRateLimited() устанавливается глобальная переменная, и все работает, как ожидалось.Однако во второй раз, когда вызывается isRateLimited(), глобальная переменная возвращает пустое значение (как проверено с empty()).В результате происходит второе подключение к memcached.

Глобальное значение не перезаписывается и не сбрасывается нигде в коде. Почему глобальная переменная теряет свое значение между выполнениями функции в одном и том же веб-запросе?

Для справки я попытался сослаться на глобальное использование $memcached_node = $GLOBALS["memcached_node"]; как одного из моих "последних"рвотное усилие "дартс".Поведение было таким же.

Среда

  • PHP 5.3.4 (cli) (сборка: 21 января 2011 г. 00:08:14)
  • nginx 1.0.6

Ответы [ 2 ]

1 голос
/ 13 сентября 2011
private static function isRateLimited($ip) {
    var_dump(debug_backtrace()); // or log to file - whatever suits the context
    // ...
}

Вы можете отслеживать вызов с помощью функции PHP debug_backtrace() ( подробнее здесь ).В качестве альтернативы вы можете увеличить глобальную переменную-счетчик и делать это только для nth вызова isRateLimited() для данного запроса к серверу, если вы точно знаете, какой вызов ошибочный.

0 голосов
/ 25 февраля 2017

Если бы подобная проблема существовала до того, как глобальная переменная вызова статической функции существует, внутри статической функции она пуста. Это становится пустым на глобальном ключевом слове. Но я загружал код через загрузчик для PHPunit. Без PHPunit он работал как положено.

В итоге я явно назначил переменную суперглобальной:

$GLOBALS['foo'] = $foo;
...