sql >> Base de Datos >  >> RDS >> Mysql

Problema de tamaño de carga en PHP y MySql

Su consulta sql probablemente exceda el max_allowed_packet en cuyo caso el servidor se desconectará.
Es posible que le interese
mysqli_stmt ::send_long_data lo que le permite enviar parámetros más largos que max_allowed_packet en fragmentos.

Actualización:"¿Cómo puedo cambiarlo? ¿Usar mysqli es la única opción?"
Afaik, el valor no se puede modificar por sesión, es decir, si no puede cambiar la configuración del servidor (my.cnf o parámetros de inicio), el valor será de solo lectura. editar:como sugiere el comentario, puede cambiar el valor global del servidor mysql después de que se haya iniciado si tiene los permisos adecuados .PDO/PDO_MYSQL (a partir de phpversion 5.3.0) no parece para admitir send_long_data, pero tampoco estoy seguro de eso. Eso dejaría mysqli como única opción. Recientemente noté que Wez Furlong desbordamiento de pila unida. Dado que es uno de los autores de la implementación de PDO, es posible que lo sepa (aunque no escribió pdo_mysql módulo).

(Completamente no probado y feo) ejemplo

// $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();