Мне любопытно, как PHP обрабатывает переменные в памяти? Если у меня есть 100 констант или переменных, которые содержат значения, относящиеся к моему приложению, а не для каждого пользователя, такие как имя сайта, номер версии, такие вещи, которые все пользователи имеют одинаковое значение.
Будет ли PHP помещать эти 100 переменных в ram 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
с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
сecho memory_get_usage(); // 85416 $_SESSION['var'] = "foo"; echo memory_get_usage(); // 85568 unset($_SESSION['var']); echo memory_get_usage(); // 85584
Если переменная просто переменная $, то да, 100 переменных будут умножены на 100 пользователей. Даже когда мы подсчитываем хранение сеанса, за время выполнения запроса эти переменные также сохраняются в памяти в $ _SESSION.
Однако, я сомневаюсь, что вам действительно нужно беспокоиться, объем пространства, занимаемого несколькими переменными, редко является проблемой; многие большие PHP-приложения будут загружать тысячи переменных для каждого запроса, а затем очищать их в конце запроса. Отпечаток PHP не слишком велик, а управление памятью больше зависит от вашего метода развертывания PHP (mod_php vs CGI / FastCGI), чем с любыми приложениями, которые вы запускаете.
Чтобы быть более конкретным, может ли ваша машина обрабатывать 100 одновременных запросов, в основном не связана с вашим PHP-скриптом, поскольку интерпретатор PHP обычно занимает гораздо больше памяти, чем сценарии, которые он запускает. Если, однако, каждый из этих сценариев загружает очень большой файл в строку (или большой набор результатов базы данных или тому подобное), тогда возможно использование памяти вашего сценария. Однако для общего случая это то, что сводится к настройке веб-сервера.
Только кодовые страницы неявно разделяются между процессами. Данные являются отдельными для процессов и объединены для потоков, если это явно не переопределено, например, через общую память SysV.