Я не уверен, что это подходящее место для размещения подобных вопросов, если это не так, пожалуйста (вежливо) дайте мне знать ... :-)
Мне нужно сохранить файлы размером более 16 МБ в базе данных mysql с сайта php ...
Я уже изменил c: \ xampp \ mysql \ bin \ my.cnf
и установите max_allowed_packet на 16 МБ, и все работало нормально
затем я установил его на 32 МБ, но я никак не могу обработать файл размером более 16 МБ
Я получаю следующую ошибку:
'Сервер MySQL ушел'
(та же ошибка, что и у меня, когда max_allowed_packet был установлен на 1 МБ)
должен быть какой-то другой параметр, который не позволяет мне обрабатывать файлы размером более 16 МБ
возможно, клиент 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 с пакетом обновления 2 версия сервера: 5.0.67-сообщество Версия PHP 4.4.9 Версия клиентского API mysql: 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






Я сталкивался с этой проблемой в прошлом с PHP и MySQL.
Я помню, что мое решение разбило двоичный файл на куски и перебирало массив. Сначала он должен ВСТАВИТЬ новую строку, а затем ОБНОВИТЬ строку с помощью оператора CONCAT.
Это было противно, но помогло.
Фактически, в конце концов, мы сохранили двоичное содержимое в файле и сохранили указатель на файл в базе данных. Это было намного эффективнее.
Любопытно ... Я пробовал это раньше, но ничего не вышло: -?
Расширение max_allowed_packet по этой причине является результатом плохой реализации. Предлагаю прочитать статью / реализацию это для файлового хранилища. Вы можете хранить файлы любого размера.
В статье объясняется обходной путь, чтобы заставить его работать с настройками по умолчанию. Само по себе это не делает реализацию лучше.
Также существует максимально допустимый лимит загрузки в файле 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
Нет, поскольку он открывает локальный файл.
Обновлено: мой первоначальный ответ неверен.
Версия клиентской библиотеки mysql, с которой был скомпонован php, была (значительно) старше, чем версия сервера mysql, из-за чего казалось, что то, что я написал, было правдой; однако теперь, похоже, это не так. Когда я перекомпилирую php для правильных клиентских библиотек mysql, все, что требуется, - это обновить серверную переменную.
Я оставлю ответ здесь, потому что кто-то другой может найти проблему, и она вполне может быть связана (как и моя) с клиентскими библиотеками. Это также (учитывая, что в исходном вопросе говорится о библиотеке v3 и сервере v4), вполне возможно, что это ответ на исходный вопрос.
Запустить
phpinfo()
и найдите «Версия клиентского API» в разделе mysql, чтобы проверить версию.
- старый ответ отсюда
Проблема в том, что, хотя есть серверная переменная max_allowed_packet, есть еще одна переменная, установленная в клиенте. Вы можете установить это в клиенте mysql, используя
mysql --max_allowed_packet
или используя
set-variable = max-allowed-packet=64M
в разделе [client] файла my.cnf
К сожалению, php не читает my.cnf и не позволяет вам установить эту клиентскую переменную. Таким образом, вы застряли с ограничением времени компиляции в источнике php:
ext/mysql/libmysql/net.c:ulong max_allowed_packet=16*1024*1024L;
Если вы перекомпилируете модуль php с измененным этим ограничением, это должно решить вашу проблему, но, как указывали другие, вы действительно должны делать что-то по-другому.
Это отличное место, чтобы задавать подобные вопросы.