MySQL PHP 没有将完整文件存储到 BLOB
MySQL PHP not storing full file to BLOB
我刚刚设置了一个新的 LAMP 服务器 运行 CentOS 6、Apache 2.2.15、PHP 5.5.25 和 MySQL 5.5.43。我从 webtatic 安装了 php 和 mysql,并使用 mysqlnd 扩展。
我已经从更旧的 LAMP 设置中转移了代码和数据库。大部分站点运行良好,传输良好。
但是,数据库中的文件存储已停止正常运行。我的意思是文件不再完全存储,最后大约 20% 丢失了。我花了很长时间试图找出可能的原因,并且相当有信心它正在 "php saving to mysql" 阶段发生。
换句话说,该文件使其成为服务器的完整大小,但是当它作为 LONGBLOB 进入数据库时,它已经失去了一些大小。但是因为我必须将它从数据库中下载出来以检查它的大小,所以这可能是文件传递的问题。
我目前正在使用 phpmyadmin,它和我的 php 代码有完全相同的问题。无论我是使用我的上传器还是 phpmyadmin 的上传器(通过 insert/edit 选择文件),phpmyadmin 中显示的 LONGBLOB 文件大小最终都小于原始文件。
然后,当我通过我的文件传送或通过 phpmyadmins 下载它时,文件以正确的尺寸传送,但底部的 20% 是 gray/white/colour。
我完全被难住了!我试过搞乱 packet/memory/upload 限制、整理格式和数据库引擎。但我无法将其 store/deliver 整个文件。
有人有什么想法吗?
如果您需要更多信息以提供帮助,请告诉我。
谢谢
编辑 1:我现在已将问题缩小为 PHP 向客户端浏览器传送文件时出现的问题。无论出于何种原因,当文件内容来自数据库字段时,它并未完整交付。正如我提到的,我的代码和 phpmyadmin 都会发生这种情况。有什么想法吗?
编辑 2:我做了进一步的测试,可以使用 PHP 成功地将文件从数据库写入服务器的文件系统。文件已完成!这只能说明 PHP 从数据库发送数据的方式有问题。但是我的旧服务器和新服务器之间有什么变化?
如果您传输的数据(传入/传出 MySQL)大于允许的最大数据包大小,您会看到此问题。参见 https://dev.mysql.com/doc/refman/5.5/en/packet-too-large.html
尝试增加 MySQL 配置中的最大数据包大小:
[mysqld]
max_allowed_packet=16M
在将症状缩小到 PHP 向浏览器发送数据后,我现在发现这都是由 PHP 生成 [=] 的方式必须发生变化引起的21=] 来自 PHP 个文件(混合了代码中的一些差异)
问题本身归结为白色 space 在图像 header 之前发送。在生成最终输出以发送到浏览器之前,我正在处理的代码中包含了很多文件。在其中的几个文件中,在结束 ?> php 标记之后有两个新行。由于这些 PHP 文件是在图像输出流式传输之前包含的,因此它们最终在 header.
之前变为白色 space
我首先通过在发送图像之前执行 ob_clean() 函数来解决这个问题。然后设法追踪新线的实际位置并将其删除。现在可以使用了。
有趣的是代码按原样来自实时站点。这意味着该站点上的旧 PHP 版本处理了代码中的这些差异。看来新的更严格或配置不同。
如果有人知道这些变化可能是什么,请分享 :)
我刚刚设置了一个新的 LAMP 服务器 运行 CentOS 6、Apache 2.2.15、PHP 5.5.25 和 MySQL 5.5.43。我从 webtatic 安装了 php 和 mysql,并使用 mysqlnd 扩展。
我已经从更旧的 LAMP 设置中转移了代码和数据库。大部分站点运行良好,传输良好。
但是,数据库中的文件存储已停止正常运行。我的意思是文件不再完全存储,最后大约 20% 丢失了。我花了很长时间试图找出可能的原因,并且相当有信心它正在 "php saving to mysql" 阶段发生。
换句话说,该文件使其成为服务器的完整大小,但是当它作为 LONGBLOB 进入数据库时,它已经失去了一些大小。但是因为我必须将它从数据库中下载出来以检查它的大小,所以这可能是文件传递的问题。
我目前正在使用 phpmyadmin,它和我的 php 代码有完全相同的问题。无论我是使用我的上传器还是 phpmyadmin 的上传器(通过 insert/edit 选择文件),phpmyadmin 中显示的 LONGBLOB 文件大小最终都小于原始文件。
然后,当我通过我的文件传送或通过 phpmyadmins 下载它时,文件以正确的尺寸传送,但底部的 20% 是 gray/white/colour。
我完全被难住了!我试过搞乱 packet/memory/upload 限制、整理格式和数据库引擎。但我无法将其 store/deliver 整个文件。
有人有什么想法吗?
如果您需要更多信息以提供帮助,请告诉我。
谢谢
编辑 1:我现在已将问题缩小为 PHP 向客户端浏览器传送文件时出现的问题。无论出于何种原因,当文件内容来自数据库字段时,它并未完整交付。正如我提到的,我的代码和 phpmyadmin 都会发生这种情况。有什么想法吗?
编辑 2:我做了进一步的测试,可以使用 PHP 成功地将文件从数据库写入服务器的文件系统。文件已完成!这只能说明 PHP 从数据库发送数据的方式有问题。但是我的旧服务器和新服务器之间有什么变化?
如果您传输的数据(传入/传出 MySQL)大于允许的最大数据包大小,您会看到此问题。参见 https://dev.mysql.com/doc/refman/5.5/en/packet-too-large.html
尝试增加 MySQL 配置中的最大数据包大小:
[mysqld]
max_allowed_packet=16M
在将症状缩小到 PHP 向浏览器发送数据后,我现在发现这都是由 PHP 生成 [=] 的方式必须发生变化引起的21=] 来自 PHP 个文件(混合了代码中的一些差异)
问题本身归结为白色 space 在图像 header 之前发送。在生成最终输出以发送到浏览器之前,我正在处理的代码中包含了很多文件。在其中的几个文件中,在结束 ?> php 标记之后有两个新行。由于这些 PHP 文件是在图像输出流式传输之前包含的,因此它们最终在 header.
之前变为白色 space我首先通过在发送图像之前执行 ob_clean() 函数来解决这个问题。然后设法追踪新线的实际位置并将其删除。现在可以使用了。
有趣的是代码按原样来自实时站点。这意味着该站点上的旧 PHP 版本处理了代码中的这些差异。看来新的更严格或配置不同。
如果有人知道这些变化可能是什么,请分享 :)