Files
crm.clientright.ru/crm_extensions/file_storage/api/long_poll_events.php

69 lines
1.9 KiB
PHP
Raw Normal View History

<?php
/**
* Long Polling API для синхронизации файлов
*
* Ждет до 30 секунд, пока не появятся события
*/
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
// Отключаем буферизацию
while (ob_get_level()) {
ob_end_clean();
}
// Увеличиваем время выполнения
set_time_limit(35); // 30 сек ожидание + 5 сек запас
$eventsFile = '/tmp/crm_sse_events.json';
$timeout = 30; // Максимальное время ожидания в секундах
$checkInterval = 0.5; // Интервал проверки в секундах
$startTime = time();
$events = [];
// Ждем события или таймаута
while (time() - $startTime < $timeout) {
// Проверяем события с блокировкой
$fp = @fopen($eventsFile, 'c+');
if ($fp && flock($fp, LOCK_EX)) {
$content = stream_get_contents($fp);
if (!empty($content)) {
$events = json_decode($content, true) ?: [];
// Если есть события - очищаем файл и отправляем
if (!empty($events)) {
ftruncate($fp, 0);
flock($fp, LOCK_UN);
fclose($fp);
break; // Выходим из цикла
}
}
flock($fp, LOCK_UN);
fclose($fp);
}
// Пауза перед следующей проверкой
usleep($checkInterval * 1000000);
// Проверяем, не отключился ли клиент
if (connection_aborted()) {
exit;
}
}
// Отправляем ответ
echo json_encode([
'status' => 'success',
'events' => $events,
'timestamp' => time(),
'waited' => time() - $startTime
]);
?>