Проблема с размером загрузки в PHP и MySql - PullRequest
1 голос
/ 22 августа 2009

Я загружаю файлы в MySql DB через PHP. Я могу загружать файлы размером до 1 МБ (методом проб и ошибок). Файлы размером более 1 МБ не загружаются. Ошибка MySql, напечатанная функцией mysql_error () в PHP: MySQL сервер ушел

Кто-нибудь может помочь мне с этим? Сервер MySql запущен и работает только для запросов> 1 МБ, он выдает эту ошибку.

С уважением, Mayank.

P.S .: Я использую форму для загрузки файла. <FORM METHOD="post" ACTION="fileUpload.php" ENCTYPE="multipart/form-data"> <INPUT TYPE="hidden" NAME="MAX_FILE_SIZE" VALUE="300000000"> <INPUT TYPE="hidden" NAME="action" VALUE="upload"> Description: <TEXTAREA NAME="txtDescription" ROWS="1" COLS="80"></TEXTAREA> <INPUT TYPE="file" NAME="binFile" ID="binFile"> <INPUT TYPE="submit" NAME="Upload" VALUE="Upload"> </FORM>

Ответы [ 2 ]

4 голосов
/ 22 августа 2009

Ваш sql-запрос, вероятно, превышает размер max_allowed_packet , и в этом случае сервер отключается.
Возможно, вас заинтересует mysqli_stmt :: send_long_data , который позволяет отправлять параметры длиннее, чем max_allowed_packet, в чанках.

Обновление: «Как я могу изменить его? Является ли использование mysqli единственным вариантом?»
Afaik значение не может быть изменено для каждой сессии, то есть, если вы не можете изменить конфигурацию сервера (my.cnf или параметры запуска), значение будет доступно только для чтения. редактировать: как говорится в комментарии, вы можете изменить глобальное значение сервера mysql после его запуска, если у вас есть соответствующие права . PDO / PDO_MYSQL (по состоянию на phpversion 5.3.0) не кажется для поддержки send_long_data, но я тоже не уверен в этом. Это оставило бы mysqli как единственный вариант. Недавно я заметил, что Wez Furlong переполнение стека. Поскольку он является одним из авторов реализации PDO, он может знать (хотя он не писал модуль pdo_ mysql ).

(полностью непроверенный и безобразный) пример

// $mysqli = new mysqli(....
$fp = fopen($_FILES['binFile']['tmp_name'], 'rb') or die('!fopen');

//$result = $mysqli->query('SELECT @@max_allowed_packet') or die($mysqli->error);
//$chunkSize = $result->fetch_all();
//$chunkSize = $maxsize[0][0];
$chunkSize = 262144; // 256k chunks

$stmt = $mysqli->prepare('INSERT INTO foo (desc, bindata) VALUES (?,?)') or die($mysqli->error);
// silently truncate the description to 8k
$desc = 8192 < strlen($_POST['txtDescription']) ? $_POST['txtDescription'] : substr($_POST['txtDescription'], 0, 8192);
$stmt->bind_param('sb', $desc, null);

while(!feof($fp)) {
  $chunk = fread($fp, $chunkSize);
  $stmt->send_long_data(1, $chunk) or die('!send_long_data.'.$stmt->error);
}
$result = $stmt->execute();
3 голосов
/ 22 августа 2009

Чтобы загрузить большие файлы на ваш сервер с помощью PHP, вам нужно изменить 2 параметра в файле php.ini.

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

; Maximum size of POST data that PHP will accept.
post_max_size = 50M

50M = 50Mb

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...