mysql:无法将max_allowed_pa​​cket设置为大于16MB的任何内容

时间:2009-01-04 21:59:11

标签: php mysql file-upload blob

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

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

我已经更改了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是一个长篇大论......



$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中

# The MySQL server
[mysqld]
port= 3306
socket= "C:/xampp/mysql/mysql.sock"
basedir="C:/xampp/mysql" 
tmpdir="C:/xampp/tmp" 
datadir="C:/xampp/mysql/data"
skip-locking
key_buffer = 16M
# max_allowed_packet = 1M
max_allowed_packet = 32M
table_cache = 128
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M

4 个答案:

答案 0 :(得分:3)

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

与mysql服务器版本相比,mysql客户端库php的版本(明显)早于mysql服务器版本,这使我看来我写的是真的;但现在似乎并非如此。当我针对正确的mysql客户端库重新编译php时,更新服务器端变量就是所需要的。

我会在这里留下回复,因为其他人可能会发现问题并且它可能与客户端库有关(就像我的一样)。它(也是原始问题陈述v3库和v4服务器)很可能是原始问题的答案。

运行

phpinfo()

并在mysql部分中查找“Client API version”以检查版本。

- 来自此处的旧答案

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

在mysql客户端中设置它
mysql --max_allowed_packet 

或使用

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

在my.cnf的

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

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

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

答案 1 :(得分:1)

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

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

这是令人讨厌的,但它确实做到了。

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

答案 2 :(得分:1)

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

答案 3 :(得分:-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