我更新到PHP 7后,我的PHP框架面临着非常奇怪的问题。
我认为问题是塞申斯。
这是我面临的问题:当我向我的网站发送第一个请求时,它会在80毫秒内响应。 1秒后,我再次呼叫同一页面,需要大约3-4秒才能响应,1秒钟后再需要一个请求,大约需要10秒才能响应。但如果我等待20-30秒并重新调用该页面,它将在80ms内再次响应。
所以我做了一些调试,我意识到当我使用session_write_close
函数时,它总是需要80毫秒来响应并且工作得非常快。因此,如果没有session_write_close
,我的会话就会锁定,即使脚本结束,我也要等待20-30秒再次调用它以获得快速响应。由于会话的原因,持续刷新页面的响应时间越来越高。
那么为什么会这样呢?第一次我遇到这样的问题。我只向我的会话写了100kb的数据。
首先我认为这是因为我的硬盘有问题,所以我将会话路径更改为ram光盘。但响应时间没有任何变化。
我完全删除了Apache并安装了新的nginx服务器。好事对于nginx,我的第二个请求不需要10秒钟响应,但仍然需要等待1-2秒才能响应,但仍然不会像我使用session_write_close
那样快。当我在nginx上使用session_write_close
时,它的工作也很完美。
还尝试删除apache 2.2并安装apache 2.4。但没机会。
顺便说一句,它发生在我的prod服务器上。它有Apache 2.2(也尝试过2.4)和PHP 7.0.4以及非常强大的CPU和128GB内存,默认配置文件和mod_rewrite启用。 Opcache和memcache也启用了。 (我也尝试过逐个禁用和重新启用缓存,但没有任何更改)
有趣的是认为它在我的测试服务器上超高速工作,这个服务器已有10年历史,8GB内存。它有PHP 5.4。
编辑:我在我的框架上使用ob_start()
和ob_get_clean()
函数。
ob_start()
.....
.....
all requests, framework calls etc.
.....
.....
ob_get_clean();
.....
show the page to user.
编辑2: Zend的联合创始人和PHP的Ze-Suraski的共同架构师在twitter上回答了我的问题“手头无知”。所以我可以自杀:)
编辑3:我认为它是关于ob_start()
和ob_flush()
,当我删除它时,它总是会快速进入。
此致
编辑4:我将我的prod服务器降级为Php 5.6。现在它的工作正常。我不知道为什么但是Ob_
函数与PHP 7上的会话处理之间存在关系。它使我的框架变慢。我怎么知道的?当我在session_write_close()
之前使用ob_start()
时,它的速度非常快。
ob_
。