mysql: нельзя установить для max_allowed_package значение больше 16 МБ - PullRequest
3 голосов
/ 05 января 2009

Я не уверен, что это правильное место для размещения подобных вопросов, если это не так, пожалуйста (вежливо), дайте мне знать ...: -)

Мне нужно сохранить файлы размером более 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 sp2 версия сервера: 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

Ответы [ 4 ]

3 голосов
/ 20 апреля 2010

Редактировать: мой первоначальный ответ неверен.

Версия клиентской библиотеки 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 с этим измененным лимитом, это должно решить вашу проблему, но, как уже отмечали другие, вы действительно должны действовать по-другому.

1 голос
/ 05 января 2009

Расширение max_allowed_packet по этой причине является результатом плохой реализации. Я предлагаю прочитать эту статью / реализацию для хранения файлов. Вы можете хранить файлы любого размера.

1 голос
/ 05 января 2009

Я сталкивался с этой проблемой в прошлом с PHP и MySQL.

Я помню, что мое решение разбивало двоичный файл на куски и зацикливался на массиве. Сначала он вставит новую строку, а затем обновит строку, используя инструкцию CONCAT.

Это было противно, но это помогло.

Фактически, в конце мы сохранили двоичное содержимое в файле и сохранили указатель на файл в базе данных. Это было намного эффективнее.

0 голосов
/ 05 января 2009

Существует также максимально допустимый предел загрузки в файле 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
...