我在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
函数。
这不是Lambda可以做的事情,因为由于内置于Lambda的解耦,因此无法在Lambda运行时环境中检测到这种情况。
调用Lambda函数时,客户端(浏览器)实际上并未连接到运行该函数的容器。它连接到Lambda服务,该服务使用与容器的单独连接来调用该函数。
如果客户端关闭连接,该函数仍会运行完成,但服务会放弃响应,因为没有人将其返回。
flush()
和ob_flush()
几乎肯定是无操作,因为Lambda是严格要求/回应。执行完成后返回整个响应 - 在此之前没有返回任何内容,因此在函数仍在执行时没有任何内容可以刷新。
如果这是一个非常重要的功能,请考虑使用API Gateway Web Sockets,它在打开连接时触发Lambda函数,在关闭时再次激活Lambda函数。这是该功能的一个不寻常的用例,但它可以避免长时间运行的Lambda函数(无论如何都无法使用)的费用。