MySQL PHP没有将完整文件存储到BLOB
Posted
技术标签:
【中文标题】MySQL PHP没有将完整文件存储到BLOB【英文标题】:MySQL PHP not storing full file to BLOB 【发布时间】:2015-09-05 11:22:10 【问题描述】:我刚刚设置了一个运行 CentOS 6、Apache 2.2.15、php 5.5.25 和 mysql 5.5.43 的新 LAMP 服务器。我从 webtatic 安装了 php 和 mysql,并且正在使用 mysqlnd 扩展。
我已经从更旧的 LAMP 设置中转移了代码和数据库。大部分网站运行良好,并且已顺利转移。
但是,数据库中的文件存储已停止正常运行。我的意思是文件不再被完全存储,最后大约 20% 丢失了。我花了很长时间试图找出原因可能是什么,并且相当有信心它发生在“php保存到mysql”阶段。
换句话说,该文件使其达到服务器的完整大小,但是当它作为 LONGBLOB 访问数据库时,它已经失去了一些大小。但由于我必须从数据库中下载它以检查它的大小,因此文件的传递可能存在问题。
我目前正在使用 phpmyadmin,它和我的两个 php 代码都有完全相同的问题。无论我使用我的上传器还是 phpmyadmin 的上传器(通过插入/编辑选择文件),phpmyadmin 中显示的 LONGBLOB 文件大小最终都会小于原始文件。
然后,当我通过我的文件交付或通过 phpmyadmins 下载它时,文件以正确的尺寸交付,但底部的 20% 是灰色/白色/彩色。
我完全被难住了!我试过搞乱数据包/内存/上传限制、整理格式和数据库引擎。但我无法让它存储/传递整个文件。
有人有什么想法吗?
如果您需要更多信息来提供帮助,请告诉我。
谢谢
编辑 1:我现在将其范围缩小为 PHP 将文件传递到客户端浏览器的问题。无论出于何种原因,当文件内容来自数据库字段时,它都不会完整地传递。正如我所提到的,这发生在我的代码和 phpmyadmin 中。有什么想法吗?
编辑 2:我已经做了进一步的测试,并且可以使用 PHP 成功地将文件从数据库写入服务器的文件系统。文件完成!这只能意味着 PHP 从数据库发送数据的方式是问题所在。但是我的旧服务器和新服务器之间有什么变化?
【问题讨论】:
除此之外,我刚刚注意到存储在数据库中的所有现有文件(从旧服务器传输)也没有正确传递!这意味着问题在于 LONGBLOB 数据是如何从 MySQL 中提取并由 PHP 解释的。我不认为这是 PHP 编码问题,因为 phpmyadmin 和我的代码都受此影响。 该字段的声明是什么?您是否指定了最大尺寸? 它是一个 LONGBLOB。另外,我在没有更改的情况下迁移了代码和数据库!唯一不同的是 LAMP 版本 为什么不将文件保存在文件夹中,并将文件夹路径保存在数据库中? 感谢您的建议。但对于任何寻找的人。我可以排除将它保存到一个文件夹以及任何关于它的辩论。该应用程序非常大,存储的数据更大。将所有现有文件从数据库移动到文件系统将是一项巨大的工作。 【参考方案1】:在将症状缩小到 PHP 将数据发送到浏览器之后,我现在发现这一切都是由于 PHP 从 PHP 文件生成 html 的方式发生了一定的变化(加上代码中的一些差异)
问题本身归结为在图像标题之前发送的空白。在生成最终输出以发送到浏览器之前,我正在处理的代码中包含了很多文件。在其中几个文件中,在结束 ?> php 标记之后有两个新行。由于这些 PHP 文件是在图像输出流式传输之前包含的,因此它们最终成为标题之前的空白。
我首先通过在发送图像之前执行 ob_clean() 函数来解决问题。然后设法追踪新线路的实际位置并将其删除。所以现在可以了。
有趣的是代码原样来自现场网站。这意味着该站点上的旧 PHP 版本可以处理代码中的这些差异。似乎新的更严格或以某种方式配置不同。
如果有人知道这些变化可能是什么,请分享:)
【讨论】:
【参考方案2】:如果您传输的数据(进/出 MySQL)大于最大允许数据包大小,您会看到此问题。见https://dev.mysql.com/doc/refman/5.5/en/packet-too-large.html
尝试在 MySQL 配置中增加最大数据包大小:
[mysqld]
max_allowed_packet=16M
【讨论】:
感谢您的建议。我的 max_allowed_packet 设置为 32M,并且代码限制为 8MB。我正在测试的文件范围从 10Kb 到 1Mb。文件的大小似乎不是这个问题的触发器。无论大小如何,所有文件都会发生:(以上是关于MySQL PHP没有将完整文件存储到BLOB的主要内容,如果未能解决你的问题,请参考以下文章
将文件上传到 Azure Blob 存储时没有触发事件网格事件——为啥?
将文件上传到 Blob 存储错误 get_NetworkTimeout 没有实现