Requisitos de memoria para mysqldump desde php script

Tengo el siguiente script que funciona muy bien para la copia de seguridad de la base de datos. Pero ¿alguna vez me encontraré con problemas de memoria para bases de datos muy grandes?

//Set large amount of memory to prevent fatal errors and don't let it timeout ini_set('memory_limit', '1024M'); set_time_limit(0); $database = escapeshellarg($this->db->database); $db_hostname = escapeshellarg($this->db->hostname); $db_username= escapeshellarg($this->db->username); $db_password = escapeshellarg($this->db->password); $backup_command = "/usr/local/mysql/bin/mysqldump -h $db_hostname -u $db_username -p$db_password $database"; $dump_output = shell_exec($backup_command); force_download('database.sql', $dump_output); 

No usaría shell_exec() . Use passthru() lugar, no requerirá memoria extra ya que pasa la salida de mysqldump intacta a la salida de PHP:

 // set appropriate headers for download ... header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="download.sql"'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); // then directly output using passthru() passthru('/usr/local/mysql/bin/mysqldump -h $db_hostname -u $db_username -p$db_password $database"'); 

Sin embargo, esta solución no podrá configurar el encabezado Content-Length ya que el tamaño del resultado es desconocido para PHP. En la mayoría de los casos, debería estar bien y puedes vivir con eso. (phpmyadmin hace lo mismo)


El uso de passthru() incluso set_time_limit() no es necesario aquí (a menos que su servidor ejecute Windows (!)). De la documentacion :

Nota: La función set_time_limit () y la directiva de configuración max_execution_time solo afectan el tiempo de ejecución del script. No se incluye el tiempo dedicado a la actividad que ocurre fuera de la ejecución del script, como las llamadas al sistema utilizando system (), operaciones de flujo de datos, consultas de bases de datos, etc., al determinar el tiempo máximo que el script se ha estado ejecutando. Esto no es cierto en Windows donde el tiempo medido es real.

Solución final basada en comentarios / discusión:

 function do_mysqldump_backup() { //Set large amount of memory to prevent fatal errors and don't let it timeout ini_set('memory_limit', '1024M'); set_time_limit(0); $mysqldump_paths = array('C:\Program Files\PHP Point of Sale Stack\mysql\bin\mysqldump.exe', //Windows '/Applications/phppos/mysql/bin/mysqldump', //Mac '/opt/phppos/mysql/bin/mysqldump', //Linux '/usr/bin/mysqldump', //Linux '/usr/local/mysql/bin/mysqldump', //Linux '/usr/local/bin/mysqldump', //Linux '/usr/mysql/bin/mysqldump'); //Linux $database = escapeshellarg($this->db->database); $db_hostname = escapeshellarg($this->db->hostname); $db_username= escapeshellarg($this->db->username); $db_password = escapeshellarg($this->db->password); $success = FALSE; foreach($mysqldump_paths as $mysqldump) { if (is_executable($mysqldump)) { $backup_command = "\"$mysqldump\" --host=$db_hostname --user=$db_username --password=$db_password $database"; // set appropriate headers for download ... header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="php_point_of_sale.sql"'); header('Content-Transfer-Encoding: binary'); header('Connection: Keep-Alive'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); $status = false; passthru($backup_command, $status); $success = $status == 0; break; } } if (!$success) { header('Content-Description: Error message'); header('Content-Type: text/plain'); header('Content-Disposition: inline'); header('Content-Transfer-Encoding: base64'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); die(lang('config_mysqldump_failed')); } }