#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 не знает о клиентском подключении.