Как PHP обрабатывает переменные в оперативной памяти?
Вопрос
Мне интересно, как PHP обрабатывает переменные в памяти?Если у меня есть 100 наборов констант или переменных, которые содержат значения, относящиеся к моему приложению, а не для каждого пользователя, например имя сайта, номер версии и тому подобное, которые все пользователи имеют одинаковое значение.
Будет ли PHP помещать эти 100 переменных в оперативную память 100 раз, если 100 пользователей одновременно заходят на страницу?Или оно каким-то образом сохраняет значение в ОЗУ только 1 раз, и все пользователи этим питаются?
Решение
Вы можете поэкспериментировать с memory_get_usage()
для мониторинга того, как обрабатывается память в ответ на определенные объявления.Например, я разработал следующее:
echo memory_get_usage(); // 84944
$var = "foo";
echo memory_get_usage(); // 85072
unset($var);
echo memory_get_usage(); // 85096
По сравнению с хранением в $_SESSION
:
echo memory_get_usage(); // 85416
$_SESSION['var'] = "foo";
echo memory_get_usage(); // 85568
unset($_SESSION['var']);
echo memory_get_usage(); // 85584
Другие советы
Если переменная просто $variable, то да, 100 переменных будут умножены на 100 пользователей.Даже когда мы подсчитываем хранилище сеанса, во время выполнения запроса эти переменные также сохраняются в памяти в $_SESSION.
Однако я сомневаюсь, что вам действительно стоит беспокоиться: объем места, занимаемого несколькими переменными, редко является проблемой;многие крупные PHP-приложения загружают тысячи переменных для каждого запроса, а затем очищают их в конце запроса.Размер PHP не очень велик, а управление памятью больше зависит от вашего метода развертывания PHP (mod_php против CGI/FastCGI), чем от любых приложений, которые вы запускаете.
Если быть более конкретным, то, может ли ваша машина обрабатывать 100 одновременных запросов, по большей части не связано с вашим PHP-скриптом, поскольку интерпретатор PHP обычно занимает гораздо больше памяти, чем сценарии, которые он запускает.Однако если каждый из этих сценариев загружает очень большой файл в строку (или большой набор результатов базы данных и т.п.), то возможно, что использование памяти вашим сценарием является проблемой.Однако в общем случае это зависит от настройки веб-сервера.
Между процессами неявно используются только кодовые страницы.Данные разделяются для процессов и объединяются для потоков, если это явно не переопределено, например, с помощьюОбщая память SysV.