我有一个很奇怪的问题。我有一个运行在Apache2.4下的ubuntu服务器上的网站。该站点是用PHP编写的,并使用MySQL作为数据库。我已经意识到MySQL数据库中的小文件的“文件存储”是长files。
当我想从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个子线程)。服务器通过一条未计量的1 1Gbps线路连接。我想不出有什么硬件瓶颈。
我遗漏了什么?我很乐意回答任何问题..。
发布于 2017-10-12 13:55:45
当您使用PHP的默认基于文件的会话机制时,PHP会在任何访问该特定会话的脚本运行时锁定会话数据文件。
因此,在您的下载运行时,会话数据文件始终处于打开状态,任何其他脚本都无法访问同一个会话--它们只需等待,直到文件锁再次释放。
为了防止这种情况,可以使用session_write_close。它告诉PHP,当前脚本是通过操作会话数据来完成的,这样现在就可以将会话内容写入数据文件,释放文件锁,以便其他脚本可以再次访问它。
(现在显然需要对会话数据进行操作;之后不能在同一脚本中再次更改会话内容。)
https://stackoverflow.com/questions/46710149
复制相似问题