Как получить событие прерывания соединения со стороны клиента в функции aws-lambda, которая запускает php-скрипт?

#php #amazon-web-services #aws-lambda #aws-api-gateway

#php #amazon-web-services #aws-lambda #aws-api-gateway

Вопрос:

Я успешно запускаю php код в aws-lambda функции, которая инициализируется шлюзом aws api и выполняется во время nodejs выполнения.
Я хочу зафиксировать, сколько времени клиент провел на моей странице.
Логика захвата времени отлично работает на моем сервере, но я не могу заставить ее работать на aws-lambda .
Пожалуйста, кто-нибудь может мне помочь? Как я могу получить уведомление об отключении клиента в моем php-коде?

Для прерывания соединения в php использовался следующий код :

 ignore_user_abort( true );

while ( 1 )
        {
            ob_flush();
            flush();
            echo "1";

            if ( connection_aborted() )
            {
                Log::info('connection aborted detected');
                $end_time1 = microtime( true );
                break;
            }
            else
            {
                $end_time1 = microtime( true );
                $second = $end_time1 - $start_time;
                if ( $second >= 25 )
                {
                    break;
                }
            }
            // Sleep
            usleep( 300000 );
        }
  

Предположим, что всем переменным php заданы соответствующие значения.
Я просто не могу заставить условие if if ( connection_aborted() ) быть истинным, когда клиент закрывает соединение, закрыв браузер или любым другим способом.

Или есть какой-либо способ узнать, что API gateway отключен со стороны клиента?

Примечание: приведенный выше код отлично работает на моем локальном сервере, а также на сервере stage, но он не работает с aws-lambda функцией.

Ответ №1:

Это не то, что может сделать Lambda, потому что условие невозможно обнаружить в среде выполнения Lambda из-за разделения, встроенного в Lambda.

Когда вызывается лямбда-функция, клиент (браузер) фактически не подключен к контейнеру, в котором выполняется функция. Он подключен к сервису Lambda, который использовал отдельное подключение к контейнеру для вызова функции.

Если клиент закрывает соединение, функция все равно выполняется до завершения, но ответ отбрасывается службой, поскольку некому его вернуть.

flush() и ob_flush() почти наверняка не работают, потому что Lambda — это строго запрос / ответ. Весь ответ возвращается по завершении выполнения — до этого ничего не возвращается, поэтому нечего сбрасывать, пока функция все еще выполняется.

Если это действительно важная возможность, рассмотрите возможность использования веб-сокетов API Gateway, которые запускают функции Lambda при открытии соединений и снова при закрытии. Это необычный вариант использования для этой функции, но это позволило бы избежать затрат на длительно работающие лямбда-функции (которые в любом случае нельзя использовать).

Комментарии:

1. спасибо за ваш ответ. Есть ли какой-либо другой способ, который handler.js может помочь?

2. Что такое handler.js ? Вы говорите о вашей лямбда-оболочке Node, или библиотеке, или …?

3. Нет. Вся среда выполнения Lambda не знает о клиентском подключении.