У меня возникла какая-то проблема при запуске в приложении отладки PhpStorm.
Когда я получаю доступ к URL, где я отлаживаю свое приложение, для системы уведомлений делается дополнительный запрос источника события (SSE). Но когда отладка работает, возникает проблема, из-за которой я не могу обновить страницу, она просто загружается бесконечно — у меня нет точных точек останова, чтобы быть уверенным. Сразу после остановки сеанса отладки он загружается.
В чем дело? Можно ли как-то отключить xdebug для этого определенного URL?
Мой код для этих уведомлений выглядит так:
public function moreAction()
{
ob_start();
$maxId = $this->request->getQuery('maxId', 'int');
header('Cache-Control: no-cache');
header("Content-Type: text/event-stream\n\n");
while (1) {
$result = $this->notificationService->more($maxId);
if (count($result) > 0) {
foreach ($result as &$row) {
if (!empty($row['data'])) {
$row['data'] = json_decode($row['data'], true);
}
}
$maxId = $result[0]['id'];
echo "event: message\n";
echo "data:".json_encode($result);
echo "\n\n";
$this->doFlush();
}
sleep(5);
}
}
protected function doFlush()
{
if (!headers_sent()) {
// Disable gzip in PHP.
ini_set('zlib.output_compression', 0);
// Force disable compression in a header.
// Required for flush in some cases (Apache + mod_proxy, nginx, php-fpm).
header('Content-Encoding: none');
}
// Fill-up 4 kB buffer (should be enough in most cases).
echo str_pad('', 4 * 1024);
// Flush all buffers.
do {
$flushed = @ob_end_flush();
} while ($flushed);
@ob_flush();
flush();
}
Я столкнулся с той же проблемой при отладке SSE с использованием xdebug. Обходной путь — закрыть источник события, если он покидает страницу.
Предполагая, что вы используете JavaScript на стороне клиента, чтобы запросить источник событий, как
let eventSource = new EventSource("moreAction.php")
положить что-то вроде
$(window).on('beforeunload', function(){
eventSource.close();
});
на вашей странице.
Кстати, это не очень хорошая идея, чтобы использовать while(1)
в вашем цикле событий, так как он будет повторяться бесконечно, с точным поведением, которое вы испытываете. Время ожидания в диапазоне 30-120 с является разумным, и вы сможете продолжить отладку, даже если источник событий не закрыт. В конце концов, он автоматически переподключается.
Других решений пока нет …