У меня есть класс, и в этом классе у меня есть функция выключения, зарегистрированная как следующая
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
функция выключения, не вызываемая
Вы должны прочитать примечание по документации PHP о потоковых операциях и максимальном времени выполнения:
Примечание. Функция set_time_limit() и директива конфигурации max_execution_time влияют только на время выполнения самого скрипта. Любое время, затрачиваемое на активность, которое происходит вне выполнения сценария, например системные вызовы с использованием system(), потоковые операции, запросы к базе данных и т.д., Не включается при определении максимального времени выполнения сценария. Это не относится к Windows, где измеренное время реально.
Поэтому, пока ваше соединение открыто, сценарий не завершится, и ваша функция выключения не будет вызвана, потому что соединение еще не завершено.
Это может быть так, если хост, который вы пытаетесь подключить, не отвечает или если ответ идет медленно.
Если вы хотите определить тайм-аут для вашего вызова fsockopen
, вы должны определить переменную default_socket_timeout
или использовать пятый аргумент функции fsockopen (http://php.net/fsockopen)