ID: 42809 Updated by: [EMAIL PROTECTED] Reported By: apolinux at hotmail dot com -Status: Open +Status: Feedback Bug Type: WDDX related Operating System: Windows XP PHP Version: 5.2.4 New Comment:
Can you please try and cut it down a few dozen lines? Short script is around 10-20 lines long.. Previous Comments: ------------------------------------------------------------------------ [2007-10-01 12:31:12] apolinux at hotmail dot com <? if (file_exists("../config/config.php") ){ include "../config/config.php"; } else { include "./config/config.php"; } ini_set('include_path', ini_get('include_path').";".$CONFIG_BASE['ruta_paginas']."/PEAR/"); require_once "PEAR.php"; require_once "DB.php"; require_once "operativolib.php"; require_once "granlavasecolib.php"; require_once "agenciaslib.php"; /* CREACION DE LA CLASE SINCRONIZACION contiene los metodos necesarios para comunicarse remotamente cliente a servidor usa el protocolo de conexion WDDX */ class Sincronizacion extends Operativo { var $urlServidor = ''; var $datos; var $peticion ; var $tabla; var $arrObj; function __construct($conex=NULL,$idAgenciaDest=NULL,$datos=NULL) { parent::__construct($conex); $agencia = new Agencias($conex); if ($this->idAgencia == $idAgenciaDest) {//no me conecto a la misma agencia die('No se puede conectar a la misma agencia.'); } if (empty($idAgenciaDest) && $datos['equipo'] != EQUIPO_SERVIDOR) { $this->lanzarErr('El URL de la Agencia esta vacio.<br />'); return false; } $this->urlServidor = $agencia->datos($idAgenciaDest)->URL.'/servidorWDDX.php'; if (!empty($datos)) { $this->asignaDatos($datos); } return true; } function asignaDatos($datos){ $this->datos = $datos; $this->peticion = $this->datos['peticion']; $this->tabla = $this->datos['tabla']; } /* funcion creaPaquete Empaqueta los datos en el formato WDDX listo para enviar */ function creaPaquete($datos) { $packet_id = wddx_packet_start("Llamada Remota WDDX"); if (is_array($datos)) { //verVar($datos); foreach($datos as $key => $data){ //create a var whith the name of the content of $key $$key = $data; wddx_add_vars($packet_id,$key); } } else { wddx_add_vars($packet_id, "datos"); } $paquete = wddx_packet_end($packet_id);// verVar($paquete); $paquete = urlencode($paquete); return $paquete; } function enviaPaquete($paqueteSerializado) { $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, "$this->urlServidor"); curl_setopt ($ch, CURLOPT_HEADER, 0); curl_setopt ($ch, CURLOPT_POSTFIELDS, $paqueteSerializado); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); if (! $resul = curl_exec ($ch)){ $this->lanzarErr("Error al comunicarse con '$this->urlServidor'"); return false; }// verlog($resul); curl_close ($ch); return $resul; } function analizaPaquete($paquete) { if (empty($paquete)) { return ''; } $paquete= urldecode($paquete); //verlog($paquete); //preg_match("/(<\/wddxPacket>)/s", $paquete, $m); //$paquete=$m[0]; //error_log(print_r($m,TRUE),0);//verVar($m);verVar($paquete); $parsed_packet = wddx_deserialize($paquete);// verlog($parsed_packet); return $parsed_packet; } public static function recibePaquete() { $fp = fopen("php://input", "r"); $paqueteRecibido = ''; while(!feof( $fp ))$paqueteRecibido.=fgets( $fp ); fclose($fp); return $paqueteRecibido; } /* funcion enviarDatosRemoto envia los datos en formato wddx al servidor ,recibe una respuesta y la devuelve */ public function enviarDatosRemoto()//$arrVariables) { //verificar si se envian o se reciben datos if (empty($this->datos) ){ die('No hay datos para enviar.'); } if ($this->datos['peticion'] == ENVIAR_DATOS) { //realiza la consulta $this->error = false; $this->datos['arrObj'] = $this->consultaBD();// verVar($this->datos['arrObj']); if ($this->error){ return false; } //verVar($this->datos['arrObj']); } //verlog($this->datos); //crear paquete $paquete = $this->creaPaquete($this->datos); //enviar paquete remotamente $respuesta = $this->enviaPaquete($paquete); //echo "resp=$respuesta,"; print_r($this->analizapaquete($respuesta)); echo ", error: '$this->error'";echo "<br />"; if ($this->error) { return $this->msg; } //analizar paquete $paqueteRecibido = $this->analizaPaquete($respuesta); //print_r($paqueteRecibido); if (empty($paqueteRecibido)) { $this->lanzarErr("La respuesta del servidor '$this->urlServidor' es vacia. Por favor verifique su configuracion"); return false; } if ($paqueteRecibido['error'] == 1){ $this->lanzarErr($paqueteRecibido['respuesta'],$paqueteRecibido['codError']); return false; } return $paqueteRecibido['respuesta'];//en crea paquete se define datos } public function recibeDatosRemoto() { $paquete = $this->recibePaquete(); //verlog($paquete); $consulta = $this->analizaPaquete($paquete); //verLog($consulta); if (empty($consulta) ){ $arrResp = array('respuesta' => 'consulta vacia.','error' => 1); } else { $peticion = $consulta['peticion']; $this->tabla = $consulta['tabla']; if ($peticion == SOLICITAR_DATOS) { $datos = $this->consultaBD(); } else { //enviar DATOS $datos = $this->insertaBD($consulta['arrObj']); } if (!$datos) { $datos = $this->msg; } $arrResp = array('respuesta' => $datos , 'error' => $this->error,'codError' => $this->codError); } $respuesta = $this->creaPaquete($arrResp); //verLog(print_r($arrResp)); return $respuesta; } function consultaBD() {//verVar($this) ; exit; switch ($this->tabla){ case T_ORDENES: $sql = "SELECT * FROM ordenes"; break; case T_PRENDAS: $sql = "SELECT * FROM prendas"; break; case T_CLIENTES: $sql = "SELECT * FROM clientes"; break; case T_OPERARIOS: $sql = "SELECT * FROM operarios"; break; case T_AGENCIAS: $sql = "SELECT * FROM agencias"; break; }//verlog("$this->tabla,$sql"); $datos =& $this->conex->getAssoc($sql,false, array(), DB_FETCHMODE_OBJECT); //verlog(print_r($datos,1)); if (PEAR::isError($datos)){ $this->lanzarErr($datos->getUserInfo()); //return $datos->getUserInfo(); return false; } //verlog($datos); return $datos; } /* funcion realiza la consulta de agregacion */ function insertaBD($datos) {//verlog($datos); if (empty($datos)) { $this->lanzarErr('Los datos para insercion son vacios.'); return false; } switch($this->tabla){ case T_ORDENES: $tabla = 'ordenes'; break; case T_PRENDAS: $tabla = 'prendas'; break; case T_CLIENTES: $tabla = 'clientes'; break; case T_OPERARIOS: $tabla = 'operarios'; break; case T_AGENCIAS: $tabla = 'agencias'; break; default: $this->lanzarErr('La tabla no existe'); return false;; } $contExt = 0; $sql = 0; foreach ($datos as $reg) { //recorre un array de objetos $cont = 0; $cadValores = ''; $cadCampos = ''; foreach($reg as $nombre => $valor) { //ciclo a traves de la clase if ($cont == 0){ $coma = ''; $cont = 1; } else { $coma = ','; } $cadCampos .= "$coma $nombre"; $cadValores .= "$coma '$valor'"; } if ($contExt == 0 ){ $sql = "INSERT INTO $tabla ($cadCampos)\nVALUES ($cadValores)\n"; $contExt = 1; } else $sql .= ",($cadValores)\n"; } $db = $this->conex; $res = $db->query($sql); if (PEAR::isError($res)){ if ($res->getCode() == -5 ) { //registros duplicados $this->lanzarErr("Existen registros duplicados en $tabla.",-5); //verlog("tabla=$this->msg "); return false; } else { //die($res->getUserInfo()); return $res->getUserInfo(); } } $numModif = $db->affectedRows(); $this->msg = "Se insertaron $numModif registros en $tabla"; return $this->msg; } function sincronizarTodo(){ $arrTablas1 = array( 'ordenes'=>T_ORDENES, 'prendas' => T_PRENDAS, 'clientes' => T_CLIENTES, 'operarios' => T_OPERARIOS, 'agencias' => T_AGENCIAS); $arrTablas2 = array( 'operarios' => T_OPERARIOS, 'agencias' => T_AGENCIAS); if (strtolower($this->idAgencia) == EQUIPO_PRINCIPAL){ //esta agencia=principal, recibe arrtablas1,envia arrtablas2 $arrTablasPeticion = $arrTablas1; $arrTablasEnvio = $arrTablas2; } else { $arrTablasPeticion = $arrTablas2; $arrTablasEnvio = $arrTablas1; } foreach($arrTablasPeticion as $nombre => $codTabla) { $datos = array('peticion'=>SOLICITAR_DATOS,'tabla'=> $codTabla ,'arrObj'=>''); $this->asignaDatos($datos); $cad .= nl2br("Solicitando la informacion de $nombre...\n"); $this->error = false; $resul = $this->enviarDatosRemoto(); //echo "aqui: $nombre, $codTabla.<br />"; //verVar($resul);//$datos); if ($this->error ){ $cad .= "<br />$this->msg"; break; } $cad .= nl2br("Agregando la informacion de $nombre en mi BD...\n"); //verVar($resul); exit; $this->error = false; $resul2 = $this->insertaBD($resul); //verlog($resul); $cad .= "$this->msg"; if ($this->error and $this->codError != ERR_REGISTROS_DUPLICADOS){ break; } $cad .= "$resul2<br />"; } $cad .= "<br />"; if (!$this->error or ($this->error and $this->codError == ERR_REGISTROS_DUPLICADOS) and 1 ) { foreach($arrTablasEnvio as $nombre => $codTabla) { $datos = array('peticion' => ENVIAR_DATOS, 'tabla' => $codTabla); $this->asignaDatos($datos); $cad .= "Enviar datos de tabla $nombre ...<br />"; $this->error = false; //echo "tabla=$codTabla "; $resul = $this->enviarDatosRemoto(); $cad .= $this->msg; //verVar($this); if ($this->error == TRUE and $this->codError != ERR_REGISTROS_DUPLICADOS){ //$cad .= "<br />$this->msg"; break; } $cad .= "$resul<br />"; //break; } } // } $this->msg = $cad; //$this->msg."<br />$cad"; if ($this->error){ return false; } return true; } } ?> /* i'm calling first to sincronizarTodo() */ ------------------------------------------------------------------------ [2007-10-01 09:24:49] [EMAIL PROTECTED] Please provide a short but complete example script that can be used to reproduce this. ------------------------------------------------------------------------ [2007-10-01 04:46:24] apolinux at hotmail dot com Description: ------------ I'm working with WDDX extension, used to make RPC between two computers, using classes to make wrapper. I have 3 basic scripts, one is the client, other is the server and other contains the classes that contains the scripts that interact with WDDX. When I try to simulate the client and the server over the same machine, I get the error zend_mm_heap corrupted in apache. When I ran the scripts in separate machines, it works OK. I have PHP 5.2.4, I had tried to run with PHP 5.2.3 but I got the same error. I have Apache/2.2.4 (Win32) mod_autoindex_color PHP/5.2.4. I try to run a debug with php, but I got it only with apache process. the error in apache log is [Sun Sep 30 11:20:52 2007] [notice] Child 3156: Starting thread to listen on port 80. zend_mm_heap corrupted Error in my_thread_global_end(): 51 threads didn't exit [Sun Sep 30 19:08:19 2007] [notice] Parent: child process exited with status 1 -- Restarting. [Sun Sep 30 19:08:38 2007] [notice] Apache/2.2.4 (Win32) mod_autoindex_color PHP/5.2.4 configured -- resuming normal operations Reproduce code: --------------- function creaPaquete($datos) { $packet_id = wddx_packet_start("Llamada Remota WDDX"); if (is_array($datos)) { //verVar($datos); foreach($datos as $key => $data){ //create a var whith the name of the content of $key $$key = $data; wddx_add_vars($packet_id,$key); } } else { wddx_add_vars($packet_id, "datos"); } $paquete = wddx_packet_end($packet_id);// verVar($paquete); $paquete = urlencode($paquete); return $paquete; } Expected result: ---------------- this function packs the data to send over the network using CURL. The code is too large to include here, and I'm not have a web site permanently connected. Actual result: -------------- Thread 50 - System ID 1844 Entry point msvcr71!_endthreadex+31 Create time 30/09/2007 11:18:18 a.m. Time spent in user mode 0 Days 0:0:0.281 Time spent in kernel mode 0 Days 0:0:0.93 Function Arg 1 Arg 2 Arg 3 Source php5ts!zend_mm_shutdown+116f 01b35228 000000d8 00825c3b php5ts!efree+39 03793678 03798138 00829e17 php5ts!zval_ptr_dtor+4b 03798114 037981f8 03797fa0 php5ts!zend_hash_destroy+27 03797fb8 03798204 00825c13 php5ts!zval_dtor_func+59 03797fa0 00000000 00829e17 php5ts!zval_ptr_dtor+23 03798204 03798228 03797f30 php5ts!zend_hash_destroy+27 00000000 00000000 00000000 PHP5TS!ZEND_MM_SHUTDOWN+116FWARNING - DebugDiag was not able to locate debug symbols for php5ts.dll, so the information below may be incomplete. In apache__PID__2872__Date__09_30_2007__Time_11_20_47AM__453__Second_Chance_Exception_C0000005.dmp the assembly instruction at php5ts!zend_mm_shutdown+116f in C:\xampp\apache\bin\php5ts.dll from The PHP Group has caused an access violation exception (0xC0000005) when trying to read from memory location 0x00000000 on thread 50 Module Information Image Name: C:\xampp\apache\bin\php5ts.dll Symbol Type: Export Base address: 0x00790000 Time Stamp: Thu Aug 30 06:06:12 2007 Checksum: 0x00000000 Comments: COM DLL: False Company Name: The PHP Group ISAPIExtension: False File Description: PHP Script Interpreter ISAPIFilter: False File Version: 5.2.4.4 Managed DLL: False Internal Name: php5ts.dll VB DLL: False Legal Copyright: Copyright © 1997-2007 The PHP Group Loaded Image Name: php5ts.dll Legal Trademarks: PHP Mapped Image Name: C:\xampp\apache\bin\php5ts.dll Original filename: php5ts.dll Module name: php5ts Private Build: Single Threaded: False Product Name: PHP Script Interpreter Module Size: 4,86 MBytes Product Version: 5.2.4 Symbol File Name: php5ts.dll Special Build: & Report for apache__PID__2584__Date__09_30_2007__Time_10_51_08AM__93__Second_Chance_Exception_C0000005.dmp ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=42809&edit=1