Как PHP обрабатывает переменные в оперативной памяти?


Мне любопытно, как PHP обрабатывает переменные в памяти? Если у меня установлено 100 констант или переменных, которые содержат значения, относящиеся к моему приложению, а не для каждого пользователя, такие как имя сайта, номер версии и тому подобное, которые у всех пользователей имеют одинаковое значение.

Будет ли PHP помещать эти 100 переменных в оперативную память 100 раз, если 100 пользователей одновременно заходят на страницу? Или он каким-то образом сохраняет значение в оперативной памяти только 1 раз, и все пользователи получают от этого информацию?

 3
Author: halfer, 2010-01-17

3 answers

Вы могли бы поэкспериментировать с 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
 1
Author: Sampson, 2010-01-17 06:52:35

Если переменная просто переменная $, то да, 100 переменных будут умножены на 100 пользователей. Даже когда мы подсчитываем хранилище сеансов, во время выполнения запроса эти переменные также хранятся в памяти, в $_SESSION.

Однако я сомневаюсь, что вам действительно нужно беспокоиться, объем пространства, занимаемый несколькими переменными, редко является проблемой; многие крупные PHP-приложения загружают тысячи переменных для каждого запроса, а затем очищают их в конце запрос. Объем PHP не очень велик, и управление памятью в большей степени зависит от вашего метода развертывания PHP (mod_php против CGI/FastCGI), чем от любых приложений, которые вы запускаете.

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

 2
Author: Crast, 2010-01-17 07:16:44

Между процессами неявно используются только кодовые страницы. Данные разделяются для процессов и объединяются для потоков, если это явно не переопределено, например, с помощью общей памяти SysV.

 1
Author: Ignacio Vazquez-Abrams, 2010-01-17 06:47:21