PHP: деструктор по сравнению с register_shutdown_function

Это очень странно, и я не получаю те же результаты, что и вы на моей машине. Я был бы очень удивлен, если бы ab выдавал разное количество фактических запросов.

Вещи, которые я бы попробовал:

  • Написать простой сервер, используя экспресс, а не хапи. Если проблема все еще возникает, вы, по крайней мере, знаете, что это не проблема с хапи.
  • Для перехвата сетевых вызовов с помощью fiddler
    • ab -X localhost:8888 -n 100 -c 30 http://127.0.0.1:3000/test будет использоваться прокси-сервер fiddler, который затем позволит вам увидеть фактические вызовы через сетевой интерфейс. подробнее
  • wireshark , если вам нужно больше энергии и ваше чувство смелости (я бы использовал его, только если скрипач вас подвел)

Если после всего этого вы все еще находите проблему, то она сузилась до проблемы с узлом, я не уверен, что еще это может быть. Попробуйте использовать узел 8, а не 10.

12
задан Milan Babuškov 25 October 2008 в 19:18
поделиться

3 ответа

Я просто протестировал с 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
}
?>

Вот то, что я узнал:

  • нажатие Кнопки остановки в Firefox не останавливает этот сценарий
  • Если я закрыл Apache, деструктор не становится названным
  • Это останавливается, когда это достигает PHP max_execution_time, и destuctor не становится названным

Однако выполнение этого:

<?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 не настолько хорош, поскольку завершение работы функционирует.

13
ответ дан 2 December 2019 в 20:20
поделиться

На основе принципа, что необходимо закончить то, что Вы запускаете, я сказал бы, что деструктор является корректным местом для бесплатного вызова.

Деструктор назовут, когда от объекта избавятся, тогда как функция завершения работы не будет вызвана, пока выполнение сценария не заканчивается. Как отмечено Wolfie, они не обязательно произойдут при насильственной остановке сервера или сценария, но в то время, память, выделенная PHP, будет освобождена так или иначе.

Также отмеченный Wolfie, PHP освободит ресурсы сценария, когда сценарий закроется, поэтому если бы Вы только инстанцируете одного из этих объектов, затем Вы, вероятно, не заметили бы значительного различия. Однако, если Вы позже заканчиваете тем, что инстанцировали этих вещей или делаете так в цикле, затем Вы, вероятно, не хотите должными быть волноваться о внезапном скачке в использовании памяти, таким образом, ради будущей исправности, я возвращаюсь к своей исходной рекомендации; поместите его в деструктор.

2
ответ дан 2 December 2019 в 20:20
поделиться

Я думаю одна большая вещь, которую Вы пропустили, то, что вся память, которую PHP выделил во время выполнения сценария, освобождена, после того как сценарий завершается. Даже если пользователь нажимает кнопку остановки, PHP обрабатывает сценарий, пока это не закончено, отдает его демону HTTP, чтобы быть поданным посетителю (или не, в зависимости от того, насколько умный демон).

Так, явно освобождение памяти в конце выполнения сценария немного избыточно. Некоторые могли бы утверждать, что это будет хорошая вещь сделать, но это все еще избыточно.

Но по теме деструкторов класса их называют каждый раз, когда объект уничтожается, любой явно unset() или при завершении/завершении сценария.

Рекомендация разработчика, явно освобождающего память, используемую в обработке изображения, несомненно, только, убедит абсолютно, чтобы не иметь утечку памяти, поскольку битовые массивы могут напрягаться на стороне памяти вещей (высота * ширина * битовая глубина * 3 (+ 1, если у Вас есть альфа-канал)),

Удовлетворить Ваши потребности википедиста:

0
ответ дан 2 December 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: