Apache2 server/website 在下载过程中停止响应
Apache2 server/website stops responding while download is in progress
我有一个很奇怪的问题。
我在 Apache2.4 下的 ubuntu 服务器上有一个 运行 的网站。
该站点使用 PHP 编写,并使用 MySQL 作为数据库。
我已经实现 "file storage" 用于 MySQL 数据库中的小文件作为 longblobs。
当我想从 MySQL 数据库下载一个 blob/file 时,我打开了一个到数据库的 PDO 连接。
$sql = $pdoData->prepare("SELECT * FROM fileblob WHERE ID = ?");
$sql->execute(array($blobID));
$row = $sql->fetch();
$content = $row['data'];
via "echo $content" 然后我将文件传输到浏览器。
所有这一切都完美无缺。然而。下载期间整个站点停止响应,每个新请求都会超时。
下载继续正常。
当下载剩余 4MB 时,网站再次开始运行,但速度非常慢。完成后,站点完全恢复正常。
MySQL 数据库使用 InnoDB 后端,最多有 500 个并发连接等
下载期间只有 6 个打开的 SQL 连接。
磁盘使用率最高约为 20%,CPU 使用率低于 10%
Apache 还设置为处理 1k 并发连接(10 个线程,最多 100 个子线程)。服务器通过未计量的 1Gbps 线路连接。
我想不出任何硬件瓶颈。
我错过了什么?
我很乐意回答任何问题...
当您使用 PHP 的默认基于文件的会话机制时,PHP 锁定会话数据文件,而访问该特定会话的任何脚本都是 运行。
因此,当您下载 运行 时,会话数据文件一直保持打开状态,任何其他脚本都无法访问同一会话 - 它们只需等待,直到文件锁定再次发布。
为了帮助防止这种情况,可以使用 session_write_close
。它告诉PHP当前脚本已经完成对session数据的操作,所以现在可以将session内容写入数据文件,释放文件锁,以便其他脚本可以再次访问它。
(此时您显然需要完成会话数据操作;之后您不能在同一个脚本中再次更改会话内容。)
我有一个很奇怪的问题。 我在 Apache2.4 下的 ubuntu 服务器上有一个 运行 的网站。 该站点使用 PHP 编写,并使用 MySQL 作为数据库。 我已经实现 "file storage" 用于 MySQL 数据库中的小文件作为 longblobs。
当我想从 MySQL 数据库下载一个 blob/file 时,我打开了一个到数据库的 PDO 连接。
$sql = $pdoData->prepare("SELECT * FROM fileblob WHERE ID = ?");
$sql->execute(array($blobID));
$row = $sql->fetch();
$content = $row['data'];
via "echo $content" 然后我将文件传输到浏览器。 所有这一切都完美无缺。然而。下载期间整个站点停止响应,每个新请求都会超时。 下载继续正常。
当下载剩余 4MB 时,网站再次开始运行,但速度非常慢。完成后,站点完全恢复正常。
MySQL 数据库使用 InnoDB 后端,最多有 500 个并发连接等
下载期间只有 6 个打开的 SQL 连接。 磁盘使用率最高约为 20%,CPU 使用率低于 10% Apache 还设置为处理 1k 并发连接(10 个线程,最多 100 个子线程)。服务器通过未计量的 1Gbps 线路连接。 我想不出任何硬件瓶颈。
我错过了什么? 我很乐意回答任何问题...
当您使用 PHP 的默认基于文件的会话机制时,PHP 锁定会话数据文件,而访问该特定会话的任何脚本都是 运行。
因此,当您下载 运行 时,会话数据文件一直保持打开状态,任何其他脚本都无法访问同一会话 - 它们只需等待,直到文件锁定再次发布。
为了帮助防止这种情况,可以使用 session_write_close
。它告诉PHP当前脚本已经完成对session数据的操作,所以现在可以将session内容写入数据文件,释放文件锁,以便其他脚本可以再次访问它。
(此时您显然需要完成会话数据操作;之后您不能在同一个脚本中再次更改会话内容。)