我今天在开发和重构的应用程序中遇到了一些问题。我们目前有一个巨大的“用户”对象,其中包含有关登录用户及其权限的大量信息。一切都在用户登录后立即完成,并在会话中序列化。序列化现在开始需要一些时间,而且我发现有很多__destruct脚本等等。
因此,考虑到这一点,我试图知道是否有可能让PHP在将页面提供给客户端之后执行所有这些“关闭”步骤,而不保持HTTP连接打开,因为它将显示为页面仍在加载并阻止某些客户端代码执行。
知道我在Zend上运行可能会有所帮助...... 我试图显式关闭输出缓冲区而不是等待php在脚本结束时执行它,但同样的问题仍然存在。我还关闭了会话,以确保它不是它的错,但它阻止User对象将其自身保存在__destruct的会话中。
感谢您的建议和/或解释。
PS:我知道整件事情必须重做,因为这不是一个很好的方法,但我们现在没有时间。答案 0 :(得分:1)
也许这会对你有所帮助。 http://php.net/manual/en/features.connection-handling.php
<?php
// redirecting...
ignore_user_abort(true);
header("Location: ".$redirectUrl, true);
header("Connection: close", true);
header("Content-Length: 0", true);
ob_end_flush();
flush();
fastcgi_finish_request(); // important when using php-fpm!
sleep (5); // User won't feel this sleep because he'll already be away
答案 1 :(得分:0)
存储延迟作业队列(在文件或数据库中)并使用cron任务处理它。