3

我不确定这是否是发布此类问题的正确位置,如果不是这样,请(礼貌地)让我知道... :-)

我需要从 php 站点将大于 16MB 的文件保存在 mysql 数据库中...

我已经更改了 c:\xampp\mysql\bin\my.cnf

并将 max_allowed_pa​​cket 设置为 16 MB,一切正常

然后我将其设置为 32 MB,但我无法处理大于 16 MB 的文件

我收到以下错误:

'MySQL 服务器已消失'

(当 max_allowed_pa​​cket 设置为 1MB 时,我遇到了同样的错误)

必须有一些其他设置不允许我处理大于 16MB 的文件

也许是php客户端,我猜,但我不知道在哪里编辑它

这是我正在运行的代码

当 file.txt 的长度小于 16.776.192 字节时,它可以正常工作,但是

如果 file.txt 有 16.777.216 字节我得到上述错误

哦,字段 download.content 是一个 longblob ......



$file = 'file.txt';

$file_handle = fopen( $file, 'r' );

$content = fread( $file_handle, filesize( $file ) );

fclose( $file_handle );

db_execute( 'truncate table download', true );

$sql = 
"insert into download( 
    code, title, name, description, original_name, 
    mime_type, size, content, 
    user_insert_id, date_insert, user_update_id, date_update )
values (
    'new file', 'new file', 'sas.jpg', 'new file', '$file',
    'mime', " . filesize( $file ) . ", '" . addslashes( $content ) . "',
    0, " . db_char_to_sql( now_char(), 'datetime' ) . ", 0, " . db_char_to_sql( now_char(), 'datetime' ) . " )";

db_execute( $sql, true );

(db_execute 函数只是打开连接并执行 sql 的东西)

运行在 windows XP sp2 服务器版本:5.0.67-community PHP 版本 4.4.9 mysql 客户端 API 版本:3.23.49

使用: ApacheFriends XAMPP (Basispaket) 版本 1.6.8 + Apache 2.2.9 + MySQL 5.0.67 (社区服务器) + PHP 5.2.6 + PHP 4.4.9 + PEAR + phpMyAdmin 2.11.9.2 ...

这是 c:\xampp\mysql\bin\my.cnf 内容的一部分

# MySQL 服务器
[mysqld]
端口= 3306
套接字=“C:/xampp/mysql/mysql.sock”
basedir="C:/xampp/mysql"
tmpdir="C:/xampp/tmp"
datadir="C:/xampp/mysql/data"
跳跃锁定
key_buffer = 16M
# max_allowed_pa​​cket = 1M
max_allowed_pa​​cket = 32M
表缓存 = 128
排序缓冲区大小 = 512K
net_buffer_length = 8K
读取缓冲区大小 = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
4

4 回答 4

3

编辑:我原来的答案是不正确的。

php 链接的 mysql 客户端库的版本(明显)比 mysql 服务器版本旧,这使得我写的看起来是真的;但是现在似乎并非如此。当我针对正确的 mysql 客户端库重新编译 php 时,只需要更新服务器端变量即可。

我将在此处留下回复,因为其他人可能会发现问题并且它很可能与客户端库相关(就像我的一样)。它也是(给定原始问题状态 v3 库和 v4 服务器)很可能是原始问题的答案。

phpinfo()

并在 mysql 部分中查找“客户端 API 版本”以检查版本。

- 来自这里的旧答案

问题是虽然有一个服务器变量“max_allowed_pa​​cket”,但客户端中也有一组。您可以在 mysql 客户端中使用

mysql --max_allowed_packet 

或通过使用

set-variable   = max-allowed-packet=64M

在 my.cnf 的 [client] 部分

不幸的是 php 不读取 my.cnf 也不允许你设置这个客户端变量。因此,您会遇到 php 源代码中的编译时间限制:

ext/mysql/libmysql/net.c:ulong max_allowed_packet=16*1024*1024L;

如果您重新编译修改此限制的 php 模块,它应该可以解决您的问题,但正如其他人所指出的那样,您确实应该以不同的方式做事。

于 2010-04-20T09:48:39.490 回答
1

我过去在 PHP 和 MySQL 中遇到过这个问题。

我记得我的解决方案将二进制文件分成块并循环遍历数组。首先它会插入一个新行,然后它会使用 CONCAT 语句更新该行。

这很讨厌,但它成功了。

实际上,最后,我们将二进制内容存储在文件中,并在数据库中保存了指向该文件的指针。它效率更高。

于 2009-01-04T23:01:07.860 回答
1

出于这个原因扩展 max_allowed_pa​​cket 是错误实现的结果。我建议阅读这篇文章/文件存储的实现。您可以存储任何大小的文件。

于 2009-01-04T23:05:27.523 回答
-1

php.ini 文件中还有最大允许上传限制。它没有直接连接到 MySQL,但如果您使用 php 发送数据,则可能是您的问题。

; Maximum allowed size for uploaded files.
upload_max_filesize = 16M

; Maximum size of POST data that PHP will accept.
post_max_size = 16M
于 2009-01-05T06:53:45.597 回答