我不确定这是否是发布这类问题的正确位置,如果不是这样,请(礼貌地)告诉我......: - )
我需要在php站点的mysql数据库中保存大于16MB的文件...
我已经更改了c:\ xampp \ mysql \ bin \ my.cnf
并将max_allowed_packet设置为16 MB,一切正常
然后我将其设置为32 MB但我无法处理大于16 MB的文件
我收到以下错误:
'MySQL服务器已经消失'
(当max_allowed_packet设置为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
答案 0 :(得分:3)
编辑:我的原始答案不正确。
与mysql服务器版本相比,mysql客户端库php的版本(明显)早于mysql服务器版本,这使我看来我写的是真的;但现在似乎并非如此。当我针对正确的mysql客户端库重新编译php时,更新服务器端变量就是所需要的。
我会在这里留下回复,因为其他人可能会发现问题并且它可能与客户端库有关(就像我的一样)。它(也是原始问题陈述v3库和v4服务器)很可能是原始问题的答案。
运行
phpinfo()
并在mysql部分中查找“Client API version”以检查版本。
- 来自此处的旧答案
问题是虽然有一个服务器变量“max_allowed_packet”,但客户端中还有一个集合。您可以使用
在mysql客户端中设置它mysql --max_allowed_packet
或使用
set-variable = max-allowed-packet=64M
在my.cnf的 不幸的是,php没有读取my.cnf,也不允许你设置这个客户端变量。因此,您将陷入php源代码中的编译时限制: 如果您重新编译修改了此限制的php模块,它应该可以解决您的问题,但正如其他人所指出的那样,您应该采用不同的方式。ext/mysql/libmysql/net.c:ulong max_allowed_packet=16*1024*1024L;
答案 1 :(得分:1)
过去我用PHP和MySQL遇到过这个问题。
我记得我的解决方案将二进制分解成块并循环遍历数组。首先它会插入一个新行,然后使用CONCAT语句更新该行。
这是令人讨厌的,但它确实做到了。
实际上,最后,我们将二进制内容存储在文件中,并保留指向数据库中文件的指针。效率更高。
答案 2 :(得分:1)
出于这个原因扩展max_allowed_packet是执行错误的结果。我建议阅读文件存储的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