如何在运行php脚本的aws-lambda函数中从客户端获取连接中止事件?

问题描述 投票:0回答:1

我在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函数。

php amazon-web-services aws-lambda aws-api-gateway
1个回答
0
投票

这不是Lambda可以做的事情,因为由于内置于Lambda的解耦,因此无法在Lambda运行时环境中检测到这种情况。

调用Lambda函数时,客户端(浏览器)实际上并未连接到运行该函数的容器。它连接到Lambda服务,该服务使用与容器的单独连接来调用该函数。

如果客户端关闭连接,该函数仍会运行完成,但服务会放弃响应,因为没有人将其返回。

flush()ob_flush()几乎肯定是无操作,因为Lambda是严格要求/回应。执行完成后返回整个响应 - 在此之前没有返回任何内容,因此在函数仍在执行时没有任何内容可以刷新。

如果这是一个非常重要的功能,请考虑使用API Gateway Web Sockets,它在打开连接时触发Lambda函数,在关闭时再次激活Lambda函数。这是该功能的一个不寻常的用例,但它可以避免长时间运行的Lambda函数(无论如何都无法使用)的费用。

© www.soinside.com 2019 - 2024. All rights reserved.