繁体   English   中英

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

[英]Apache2 server/website stops responding while download is in progress

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

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

$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个子代)。 服务器通过一条未测量的1Gbps线路连接。 我想不出任何硬件瓶颈。

我想念什么? 我很高兴回答任何问题...

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

因此,当您的下载正在运行时,会话数据文件始终保持打开状态,并且阻止任何其他脚本访问同一会话-它们只需要等待,直到再次释放文件锁即可。

为了防止这种情况,可以使用session_write_close 它告诉PHP当前脚本是通过处理会话数据完成的,因此可以将会话内容立即写入数据文件,并释放文件锁,以便其他脚本可以再次访问它。

(显然,此时您需要完成会话数据操作;之后,您将无法在同一脚本中再次更改会话内容。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM