Это очень странно, и я не получаю те же результаты, что и вы на моей машине. Я был бы очень удивлен, если бы ab выдавал разное количество фактических запросов.
Вещи, которые я бы попробовал:
ab -X localhost:8888 -n 100 -c 30 http://127.0.0.1:3000/test
будет использоваться прокси-сервер fiddler, который затем позволит вам увидеть фактические вызовы через сетевой интерфейс. подробнее Если после всего этого вы все еще находите проблему, то она сузилась до проблемы с узлом, я не уверен, что еще это может быть. Попробуйте использовать узел 8, а не 10.
Я просто протестировал с Apache, PHP, используемый в качестве модуля Apache. Я создал бесконечный цикл как это:
<?php
class X
{
function __destruct()
{
$fp = fopen("/var/www/htdocs/dtor.txt", "w+");
fputs($fp, "Destroyed\n");
fclose($fp);
}
};
$obj = new X();
while (true) {
// do nothing
}
?>
Вот то, что я узнал:
Однако выполнение этого:
<?php
function shutdown_func() {
$fp = fopen("/var/www/htdocs/dtor.txt", "w+");
fputs($fp, "Destroyed2\n");
fclose($fp);
}
register_shutdown_function("shutdown_func");
while (true) {
// do nothing
}
?>
shutdown_func называют. Таким образом, это означает, что класс destuctor не настолько хорош, поскольку завершение работы функционирует.
На основе принципа, что необходимо закончить то, что Вы запускаете, я сказал бы, что деструктор является корректным местом для бесплатного вызова.
Деструктор назовут, когда от объекта избавятся, тогда как функция завершения работы не будет вызвана, пока выполнение сценария не заканчивается. Как отмечено Wolfie, они не обязательно произойдут при насильственной остановке сервера или сценария, но в то время, память, выделенная PHP, будет освобождена так или иначе.
Также отмеченный Wolfie, PHP освободит ресурсы сценария, когда сценарий закроется, поэтому если бы Вы только инстанцируете одного из этих объектов, затем Вы, вероятно, не заметили бы значительного различия. Однако, если Вы позже заканчиваете тем, что инстанцировали этих вещей или делаете так в цикле, затем Вы, вероятно, не хотите должными быть волноваться о внезапном скачке в использовании памяти, таким образом, ради будущей исправности, я возвращаюсь к своей исходной рекомендации; поместите его в деструктор.
Я думаю одна большая вещь, которую Вы пропустили, то, что вся память, которую PHP выделил во время выполнения сценария, освобождена, после того как сценарий завершается. Даже если пользователь нажимает кнопку остановки, PHP обрабатывает сценарий, пока это не закончено, отдает его демону HTTP, чтобы быть поданным посетителю (или не, в зависимости от того, насколько умный демон).
Так, явно освобождение памяти в конце выполнения сценария немного избыточно. Некоторые могли бы утверждать, что это будет хорошая вещь сделать, но это все еще избыточно.
Но по теме деструкторов класса их называют каждый раз, когда объект уничтожается, любой явно unset()
или при завершении/завершении сценария.
Рекомендация разработчика, явно освобождающего память, используемую в обработке изображения, несомненно, только, убедит абсолютно, чтобы не иметь утечку памяти, поскольку битовые массивы могут напрягаться на стороне памяти вещей (высота * ширина * битовая глубина * 3 (+ 1, если у Вас есть альфа-канал)),
Удовлетворить Ваши потребности википедиста: