register_shutdown_function не вызывается, когда выход произошел во внешней функции

1

У меня есть класс, и в этом классе у меня есть функция выключения, зарегистрированная как следующая

class test{
    function __construct() {
        $self = $this;
        $shutdown = function () use (&$self) {
            $self->shutdown();
        };
        register_shutdown_function($shutdown);
    }

    public function shutdown()
    {
        echo 'shutdown';
    }

    public function doThing(){
        $tools = new tools();
        $tools->loadUrl('https://google.com');
    }
}

класс инструментов

class tools {
    function loadUrl($url){
        include('url.php');
        return openUrl($url);
    }
}

url.php

function openUrl($url){
    //use the fsockopen function
}

это основная структура файлов, и я не могу ее изменить, поэтому, пожалуйста, не давайте мне ответов, включая изменение любой вещи, связанной с изменением функций или структуры

проблема, если max exc time превышает 30 секунд из-за функции в тестовом классе, она будет работать нормально, но проблема возникает, когда максимальное время fsockopen происходит в fsockopen на функции openUrl функция выключения, не вызываемая

  • 1
    как вы создаете объект тестового класса и где?
  • 0
    Функция выключения будет вызвана либо в случае фатальной ошибки, я согласен с комментарием Четана, нам нужно посмотреть, как и когда создается объект вашего теста.
Теги:

1 ответ

3
Лучший ответ

Вы должны прочитать примечание по документации PHP о потоковых операциях и максимальном времени выполнения:

Примечание. Функция set_time_limit() и директива конфигурации max_execution_time влияют только на время выполнения самого скрипта. Любое время, затрачиваемое на активность, которое происходит вне выполнения сценария, например системные вызовы с использованием system(), потоковые операции, запросы к базе данных и т.д., Не включается при определении максимального времени выполнения сценария. Это не относится к Windows, где измеренное время реально.

Поэтому, пока ваше соединение открыто, сценарий не завершится, и ваша функция выключения не будет вызвана, потому что соединение еще не завершено.

Это может быть так, если хост, который вы пытаетесь подключить, не отвечает или если ответ идет медленно.

Если вы хотите определить тайм-аут для вашего вызова fsockopen, вы должны определить переменную default_socket_timeout или использовать пятый аргумент функции fsockopen (http://php.net/fsockopen)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню