Как в PHP создать скрипт, который будет постоянно работать и реагировать на запросы?

Как правильно обработать множественные ответы от API камеры, которые приходят с разделителями типа "--myboundary\r\n", чтобы избежать проблем с бесконечной загрузкой при использовании средств типа POSTMAN или CURL в PHP?
  • 1 марта 2024 г. 15:18
Ответы на вопрос 2
Для создания скрипта в PHP, который будет постоянно работать и реагировать на запросы, можно использовать бесконечный цикл и обработку запросов внутри него. Например, можно создать скрипт, который будет постоянно прослушивать определенный порт и обрабатывать запросы, используя функцию socket_create(), socket_bind(), socket_listen() и socket_accept().

Чтобы правильно обработать множественные ответы от API камеры с разделителями типа "--myboundary\r\n" в PHP, необходимо использовать функции работы с потоками ввода-вывода (например, fread() и fwrite()) для чтения и записи данных, разделять ответы по разделителю и обрабатывать их по отдельности.

Для избежания проблем с бесконечной загрузкой при использовании средств типа POSTMAN или CURL в PHP, необходимо правильно настроить запросы и обработку ответов. В случае использования CURL, следует установить опцию CURLOPT_TIMEOUT для ограничения времени ожидания ответа. Также можно использовать функцию curl_multi_exec() для выполнения нескольких запросов параллельно и обработки ответов.

Например, можно создать цикл, в котором выполняются запросы к API камеры с помощью CURL, обрабатывать ответы и завершать выполнение после получения определенного числа ответов или по истечении определенного времени.
Работа с потоками данных может быть сложной задачей, особенно если вы хотите обработать каждый отдельный ответ независимо. Тут без фреймворка или какой-то спец библиотеки будет тяжело. 

Но, я бы на основе этих данных вот так сделала, а вдруг прокатит?)))

<?php
$url = 'http://my-ip/cgi-bin/eventManager.cgi?action=attach&codes=[All]&heartbeat=5';

$context = stream_context_create([
    'http' => [
        'method' => 'GET',
        'header' => 'Connection: close\r\n'
    ]
]);

$resource = fopen($url, 'r', false, $context);

while (!feof($resource)) {
    $line = fgets($resource);
    if (strpos($line, '--myboundary') !== false) {
        // Начало нового ответа
        $response = '';
        while (!feof($resource)) {
            $line = fgets($resource);
            if (strpos($line, '--myboundary') !== false) {
                // Конец ответа
                break;
            }
            $response .= $line;
        }
        // Обработка ответа
        echo $response;
    }
}

fclose($resource);
?>
Похожие вопросы