首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache2服务器/网站在下载过程中停止响应

Apache2服务器/网站在下载过程中停止响应
EN

Stack Overflow用户
提问于 2017-10-12 12:53:33
回答 1查看 86关注 0票数 0

我有一个很奇怪的问题。我有一个运行在Apache2.4下的ubuntu服务器上的网站。该站点是用PHP编写的,并使用MySQL作为数据库。我已经意识到MySQL数据库中的小文件的“文件存储”是长files。

当我想从MySQL数据库下载blob/文件时,我打开到数据库的PDO连接。

代码语言:javascript
复制
$sql = $pdoData->prepare("SELECT * FROM fileblob WHERE ID = ?");
$sql->execute(array($blobID));
$row = $sql->fetch();
$content = $row['data'];

然后通过"echo $content“将文件传输到浏览器。所有这些都完美无缺。然而。在下载期间,整个站点停止响应,每个新请求都会遇到超时。下载仍在进行中。

当下载到剩余的4MB时,网站重新开始运行,但速度非常慢。当它完成,网站是完全恢复正常。

MySQL数据库使用InnoDB后端,最多有500个并发连接等。

在下载期间,只有6个打开的SQL连接。磁盘使用率最高在20%左右,CPU使用率低于10% Apache也被设置为处理1k并发连接(10个线程,最大100个子线程)。服务器通过一条未计量的1 1Gbps线路连接。我想不出有什么硬件瓶颈。

我遗漏了什么?我很乐意回答任何问题..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-12 13:55:45

当您使用PHP的默认基于文件的会话机制时,PHP会在任何访问该特定会话的脚本运行时锁定会话数据文件。

因此,在您的下载运行时,会话数据文件始终处于打开状态,任何其他脚本都无法访问同一个会话--它们只需等待,直到文件锁再次释放。

为了防止这种情况,可以使用session_write_close。它告诉PHP,当前脚本是通过操作会话数据来完成的,这样现在就可以将会话内容写入数据文件,释放文件锁,以便其他脚本可以再次访问它。

(现在显然需要对会话数据进行操作;之后不能在同一脚本中再次更改会话内容。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46710149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档