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

Я успешно выполняю код 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 отключен от клиентской стороны?

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

1 Ответ

0 голосов
/ 26 марта 2019

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

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

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

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

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

...