69 lines
1.9 KiB
PHP
69 lines
1.9 KiB
PHP
|
|
<?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
|
|||
|
|
]);
|
|||
|
|
?>
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|