Хорошо, ваше первое утверждение, что first memory_get_usage () должно быть 0, неверно.Согласно документации PHP:
Возвращает объем памяти, в байтах, который в настоящее время выделяется для вашего скрипта PHP.
Ваш скрипт выполняется, поэтому он должен иметь некоторая выделенная ему память.Первый вызов информирует вас о том, сколько это стоит.
Ваше второе утверждение, что str_repeat () не должен использовать столько памяти, не смотрит на всю картинку.
У вас есть строка "привет"(который использует 5 байтов) повторяется 100 000 раз, всего 500 000 байтов ... минимум.Вопрос в том, как PHP выполнял это действие?Использовали ли они такой код?(псевдокод):
s = ""
for(i=0; i<100000; i++)
s += "hello"
Этот код потребует перераспределения новой строки для каждой итерации цикла for.Теперь я не могу притворяться, что говорю, что знаю, как PHP реализует str_repeat (), но вы должны быть предельно осторожны с тем, как вы используете память, чтобы уменьшить использование памяти.По внешнему виду, они не управляли памятью в этой функции так, как могли бы.
В-третьих, разница между пиковым использованием памяти и текущим использованием памяти, вероятно, связана со стеком, который был необходим для созданиявызов функции str_repeat (), а также любые локальные переменные, необходимые в этой функции.Память, вероятно, была возвращена, когда функция вернулась.
Наконец, Apache работает в другом процессе, и мы имеем дело с виртуальной памятью.Ничто из того, что делает Apache, не повлияет на результат memory_get_usage (), поскольку процессы не «разделяют» виртуальную память.