Bienvenido a los foros %s

Foro comunidad hispana Dolibarr

Identificarse Registrarse

Error con el Asistente para compilar el archivo de volcado de la base de datos

Si cree que ha encontrado un error en una versión estable, siéntase libre de comunicarlo aquí, indicando la versión.
Apolo
Novato
Mensajes: 30
Registrado: Lun, 29/05/2017, 10:49

Error con el Asistente para compilar el archivo de volcado de la base de datos

Mensaje por Apolo »

Hola a todos y todas,

Me presento, soy Jesus y en el trabajo tenemos Dolibarr como herramienta, para conocerlo mejor hace unos dias me instalé la ultima version estable 13.0.1 en mi hosting para probar . Comencé a hacer pruebas con importaciones de terceros, clientes y proveedores, hice una importacion ficticia de 10.000 articulos, y me encontre con el primer problema, la importación fallaba. Todas las importaciones las hice con el asistente y con el fichero Excel de importación de ejemplo. Cuando digo que fallaba me refiero que era por hacer la importación de tantas casi 10.000 registros,aún así llegué a poder hacer la importación al subir máximo de 1000 en 1000 registros. Encontré que el problema seguramente era del servidor PHP, así que desde el control del Panel de mi dominio , di estos valores a traves de un formulario para combiar la configuracion del Servidor PHP. Estos son los valores, por si a alguien le pasaba tambien este error que no es del Dolibarr en un principio, sino de la configuracion del PHP general.

Memoria utilizada : 524288 kB
Tiempo máximo de proceso : 300 segundos

La memoria la puse al máximo que me permitia mi Hosting, 512M, y el tiempo máximo de proceso lo tenia a 120 por defecto, lo puse a 300s. Muchos registradores de dominio y Hosting no dejan acceder a la configuracion del PHP, en mi caso ionos, tiene la opcion de poderlo modificar a traves del Panel , en Servidores y Clouds, configuración avanzada, ya que esos parametros limitan el php.ini que luego puede ir en cada espacio web, en mi caso mi dominio.
No me ha dado tiempo a probar lo porque justo despues, habiendo subido los 10.000 productos ficticios, de 1000 en 1000, quise hacer una copia de seguridad, pues habia estado ya unas horas configurando el dichoso excel de ejemplo de productos y para probar que funcionaba bien, en el trabajo me ocupo de hacer la copia de seguridad cada semana y nunca habia tenido problemas, tanto de la base de datos como de la carpeta documents.
EDITO: Aún con esas modificaciones del PHP sigue habiendo la limitación de registros al subir los productos y por lo que entiendo tambien los clientes.

Aqui detallo la base de datos esta en MySql 5.7, y la versión de PHP 7.4, la copia de la Base de Datos .sql la hago con la primera opcion de l Asistente MySQL Dump (mysqldump) y me lanza este error:

Resultado de la copia:
Error : mysqldump: Error: 'Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces

Lo solucioné exportando desde phpmyadmin la base de datos en MySQL5.7 e importandola a una nueva base de datos en MySQL5.5, ahora la copia de la Base de datos la hace bien, pero no creo que sea la mejor solución, ya que si necesitara mantener la 5.7 por alguna razón por ejemplo, un wordpress que compartiera esa base de datos para un woocommerce, o por tenerla que actualizar por lo que fuera no podria hacer la copia de esta forma, si no voy errado es un requerimiento de MySQL 5.7, o de PHP 7.4, no se , no soy experto. Seguramente muchos de vosotros me podrias aclarar el porqué y si está a mi alcance salvar ese error.

En otra copia tambien se solucionó este primer error con la copia de la BBDD copiando por ftp todas las carpetas encima de las actuales, con lo que algun fichero php estaba corrupto, de todas formas esta ultima estrategia y el hacer el downgrade de MySQL 5.7 a 5.5 no me ha solucionado este otro error de la copia de de la carpeta documents, que la estoy haciendo por FTP.
Dato importante es que los dos errores los lanza cuando en la la base de datos uso la primera opcion llamando a MySqlDump y no da error si lo hago con la segunda opcion (php), y en el caso de la segunda parte, la copia de la carpeta Documents, si comprimo en Gzip la crea bien pero si da este error si la hafo en ZIP, (CODIGO POSTAL) traducción literal:

Warning: preg_match(): Unknown modifier ']' in /homepages/20/***/htdocs/***/dolibarr/core/lib/files.lib.php on line 2167

Warning: Cannot modify header information - headers already sent by (output started at /homepages/20/***/htdocs/***/dolibarr/core/lib/files.lib.php:2167) in /homepages/20/***/htdocs/***/dolibarr/admin/tools/export_files.php on line 172

Me he metido en los archivos, pero no domino el php, y me pierdo un poco. Me da que podria ser un Bug de la versión 13.0.1 ya que la copia comprimida la hace, no he logrado encontrar nada en la documentación y posiblemente eso y tambien mi desconocimiento de algunos temas que se me escapan no llego a ver la causa.
En Resumen, me gustaria saber el porqué, que seguro es culpa mia, no hace las copias de la base de datos con la opcion mysqldump, y tampoco la segunda parte de la copia de documentos no la hace cuando comprimes en ZIP.
La solución pasaria por hacer la copia de la BBDD desde phpmyadmin o desde la segunda opcion (php), y en cuanto a la copia de la carpeta Documents, o bien por FTP o bien comprimiendo la copia en GZip, seguramente vuelva a hacer la instalación y esta vez desde el principio ponga la base de datos MySQL5.5 pero me gustaria saber si alguno lo sabe que me esta pasando. Aunque sea solo por saberlo. Gracias de antemano y perdonar si he cascado alguna tonteria, hace poquito que me he puesto a destripar Dolibarr, aunque sea un usuario en el trabajo desde hace años.

EDITO: Sigue fallando habiendo hecho la instalación otra vez, con php 7.3 y la DB con MySql5.5 en la copia ZIP de documents.

Saludos.

Jesus.
Última edición por Apolo el Lun, 15/03/2021, 01:25, editado 2 veces en total.

Apolo
Novato
Mensajes: 30
Registrado: Lun, 29/05/2017, 10:49

Mensaje por Apolo »

Hola de Nuevo,

SIguiendo con mis intentos de encontrar la causa, he instalado un Dolibarr 11, con PHP 7.3 , MySql 5.5 y funciona correctamente tanto la copia de la db, como la copia de la carpeta documents. He actualizado a la version 13.0.1 y se ha reproducido el error de la copia de documents en ZIP. Lanzando el mismo error:


----
Warning: preg_match(): Unknown modifier ']' in /homepages/20/***/htdocs/***/dolibar/core/lib/files.lib.php on line 2167

Warning: preg_match(): Unknown modifier ']' in /homepages/20/***/htdocs/***/dolibar/core/lib/files.lib.php on line 2167

Warning: preg_match(): Unknown modifier ']' in /homepages/20/***/htdocs/***/dolibar/core/lib/files.lib.php on line 2167

Warning: Cannot modify header information - headers already sent by (output started at /homepages/20/***/htdocs/midemo/dolibar/core/lib/files.lib.php:2167) in /homepages/20/d725887478/htdocs/midemo/dolibar/admin/tools/export_files.php on line 172


Mirando el archivo files.lib.php la linea 2167
if (empty($excludefiles) || !preg_match($excludefiles, $filePath))

Código: Seleccionar todo

foreach ($files as $name => $file)
				{
					// Skip directories (they would be added automatically)
					if (!$file->isDir())
					{
						// Get real and relative path for current file
						$filePath = $file->getRealPath();
                                                $relativePath = ($rootdirinzip ? $rootdirinzip.'/' : '').substr($filePath, strlen($inputdir) + 1);

                                                if (empty($excludefiles) || !preg_match($excludefiles, $filePath))
						{
							// Add current file to archive
							$zip->addFile($filePath, $relativePath);
						}
					}
				}
El Warning: preg_match(): Unknown modifier ']' hace alusion si no estoy errado a que unas de las variables $filePath o $excludefiles, tiene un modificador desconocido.

La variable $excludefiles coje en la función un valor vacio,

Código: Seleccionar todo

function dol_compress_dir($inputdir, $outputfile, $mode = "zip", $excludefiles = '', $rootdirinzip = '')

Creo que lo que hace esa linea es comparar si hay más ficheros para ir añadiendo ese fichero al ZIP.
Pero por mucho que miro para atras en la programación no logro ver el error.

He mirado estos ficheros en las versiones anteriores, Dolibarr 12 y 11 donde no salta el error, quizás el compresor zip es el que está fallando y no el codigo, ya que las otras compresiones, no fallan.

Si alguien puede comprobarlo? He intentado registrarme en dolibarr.org, para preguntar si habian encontrado este bug, pero desde mi ip, me dicen que ya no se pueden registrar más usuarios, que tampoco era mi intención. Si alguno puede comprobar si tambien os pasa, y no es algo solo que me pasa a mi en ionos o con mi configuración.

Siguiendo con los WARNINGS,
Warning: Cannot modify header information - headers already sent by (output started at /homepages/20/***/htdocs/***/dolibar/core/lib/files.lib.php:2167) in /homepages/20/***/htdocs/***/dolibar/admin/tools/export_files.php on line 172

Código: Seleccionar todo

// Redirect t backup page
header("Location: dolibarr_export.php");

$time_end = time();

$db->close();
El header entiendo que redirecciona hacia el fichero dolibarr_export.php.

Seguiré investiganto a ver si logro encontrar la causa de este WARNING, hasta que lo arreglen en la siguiente si es un bug, o encuentre la causa, para de momento no actualizar, aunque haya, las otras opciones de compresión de la carpeta documents, o copiar por ftp la carpeta.

EDITO:
Mirando en el GITHUB, el error del Header, parece que ya se habia reproducido en versiones anteriores.

Pero no entiendo la solucion, no se si hay que añadir "Print '<br>';" o en los anteriores se quitaba, de todas formas ni de una forma ni de otra deja de salir el error de Header,

https://github.com/Dolibarr/dolibarr/issues/13039
NOTA:
Información adicional sobre el error: - headers already sent

Un mensaje HTTP consta de una cabecera - Header y un cuerpo -Body que son enviados en este orden al cliente - Client. En el momento que se envía el Body no se puede enviar ya más el Header.

Si intentas entonces de llamar la función header() después que se haya mandado HTML, te va ha producir el famoso error: Cannot modify header information - headers already sent.
En cambio no encuentro nada en los issues de GITHUB sobre " Warning: preg_match(): Unknown modifier ']' in /homepages/... "

A ver si alguien puede dar luz, agradeceria comprender la causa. En el trabajo tenemos la version 13.0.1 con PHP 7.3 y MySQL5.7 y no da ese error al exportar la copia de documents en ZIP, no se si como lo tenemos activo desde la version 4, arrastra la solución.

SOLUCION:
Puedes solucionarlo moviendo el bloque de html tras el comando header. O también usando la función ob_start() en las primeras líneas de código. Eso iniciará la caché del búfer de salida y las cabeceras no se enviarán hasta finalizar el script.


He encontrado una posible solución al reenvio del Header, llamando a la funcion ob_start() que he colocado en la linea 74 del archivo export_files.php, despues del comentario de View
ob_start() ;
Y se ha solucionado, de esta forma tal y como comenta un usuario en este enlace, al que he de agradecer la solución de esperar a hacer el reenvio del Header antes de finalizar el script.

Este es el enlace donde he encontrado una posible solución:
https://es.stackoverflow.com/questions/ ... ders-alrea

Gracias a @Muriano
https://es.stackoverflow.com/users/5813/muriano

Dejo el archivo adjunto del fichero modificado con esa linea. Se ubica en admin/tools/export_files.php

Seria interesante que los que saben programación PHP, confirmen que este parche es correcto y no provoque otros problemas.

Saludos.


Jesus.
Adjuntos
export_files.zip
(2.49 KiB) Descargado 197 veces

Apolo
Novato
Mensajes: 30
Registrado: Lun, 29/05/2017, 10:49

Mensaje por Apolo »

ACTUALIZO:

Aunque la solución anterior hace desaparecer los WARNINGS y genera el archivo zip de documentos, desgraciadamente el archivo resultante no es correcto, y presenta fallos en la estructura de carpetas. :o Es decir, se van los warnings, pero se genera el mismo archivo con los mismos errores de antes, retomo la idea que el motor de compresión ZIP falla.

Código: Seleccionar todo

if ($compression == 'zip')
{
	$file .= '.zip';
	$ret = dol_compress_dir(DOL_DATA_ROOT, $outputdir."/".$file, $compression, '/(\.back|\.old|\.log|[\\\/]temp[\\\/]|documents[\\\/]admin[\\\/]documents[\\\/])/i');
	if ($ret < 0)
	{
		if ($ret == -2) {
			$langs->load("errors");
			$errormsg = $langs->trans("ErrNoZipEngine");
		} else {
			$langs->load("errors");
			$errormsg = $langs->trans("ErrorFailedToWriteInDir", $outputdir);
		}
	}
Seguimos.
Saludos.

Jesus.

Apolo
Novato
Mensajes: 30
Registrado: Lun, 29/05/2017, 10:49

Mensaje por Apolo »

Bueno,

Pues seguimos avanzando, a traves del canal GITHUB, @eldy propone hacer el cambio en el codigo , podeis seguirlo aqui:

https://github.com/Dolibarr/dolibarr/co ... 68362c86d1

Esta es la original en el archivo expor_files.php

Código: Seleccionar todo

$ret = dol_compress_dir(DOL_DATA_ROOT, $outputdir."/".$file, $compression, '/(\.back|\.old|\.log|[\\\/]temp[\\\/]|documents[\\\/]admin[\\\/]documents[\\\/])/i');
y añade el valor a una variable en vez de poner todo en ese campo,

Código: Seleccionar todo

$excludefiles = '/(\.back|\.old|\.log|[\/\\\]temp[\/\\\]|documents[\/\\\]admin[\/\\\]documents[\/\\\])/i';
$ret = dol_compress_dir(DOL_DATA_ROOT, $outputdir."/".$file, $compression, $excludefiles);
Aunque resuelve el warning como la propuesta que habia hecho yo, no resuelve el problema de generar correctamente la estructura de directorios y ficheros, y genera mal los nombres el ZIP.

WinRAR_0E6oFrZMX4.jpg
WinRAR_0E6oFrZMX4.jpg (49.53 KiB) Visto 7906 veces
Pienso que el problema lo tengo con IONOS, con mi hosting y como tienen montada la estructura de carpetas y ficheros, ya he comprobado que misma version en un Nas Synology no da problemas.

Apolo
Novato
Mensajes: 30
Registrado: Lun, 29/05/2017, 10:49

Mensaje por Apolo »

Hola,

Despues de comentar con IONOS, hemos llegado a la conclusión, que posiblemente la versión de ZIP que esta corriendo en mi Hosting, sea una versión que soporta solo 7 bits, y por eso la estructura de los nombres de las carpetas sale mal, ya que solo contempla unos determinados caracteres, por lo que daré este problema por solucionado, haciendo la copia en GZIP o BZIP2 que si lo hace bien.
Como la versión de ZIP que hay en mi Hosting no puedo cambiarla, y la solución seria otra más radical, dejo este hilo, por que posiblemente otros estén haciendo la copia en ZIP y deberian comprobar si esa copia en su Hosting está bien creada, y la solución seria crearla como digo en GZIP.

Saludos y a otra cosa.

Jesus.