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

标签 php mysql web timeout apache2

我有一个非常特殊的问题。 我有一个网站,在 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 的默认基于文件的 session 机制时,PHP 会在访问该特定 session 的任何脚本运行时锁定 session 数据文件。

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

为了帮助防止这种情况,session_write_close可以使用。它告诉PHP当前脚本已完成对 session 数据的操作,因此现在可以将 session 内容写入数据文件,并释放文件锁,以便其他脚本可以再次访问它。

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

关于php - 下载过程中 Apache2 服务器/网站停止响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46710149/

相关文章:

php - 如何修复 "mysqli::real_connect(): SSL operation failed"错误?

php - 在 PHP/MySQL 中使用 TIMESTAMP 字段获取时区

php - mysql select ID 其中日期是当前日期

php - 表单、Mysql 和值

javascript - 无法在 angularJs 中从单击事件的选择中设置第二个下拉列表的选定值

php - Doctrine2 Cascade的正确使用

php - 在触发器内部使用 select 语句

javascript - 为什么要对 url 进行编码,或者对哪些字符进行编码

php - 防止Mysql覆盖数据

c# - 异常处理和异步异常处理的区别