SlideShare una empresa de Scribd logo
1 de 66
Descargar para leer sin conexión
Mikel Ruiz, CTO en On4u
Magento X Files
Co-Founder y CTO en On4u
Ingeniero Informático
Magento Partner desde 2009
MCD, MCSS, M2 trained
50+ proyectos Magento
Compartir eXperiencia
Otros puntos de vista
Terapia de grupo ;)
QUÉ BUSCAMOS
X
X
X
X-FILE PHP
Descripción
X
X
Vemos en New Relic transacciones de +30s,
que parecen timeouts
Pero 1-5 pedidos/día se quedan en
un estado previo a ir a la pasarela
X
Cada 15 minutos se borran los pedidos que
no se han pagado (on hold)
X Magento EE con muchos pedidos
X Parece que la sesión se queda bloqueada
X El resto de peticiones funcionan bien
X $session->getLastOrderId()
Explicación
SSL
Explicación
SSL
Explicación X PHP dice… “Not a bug”
SSL
Explicación
SSL
Solución
SSL
Solución
Solución
X-FILE SSL
Descripción
X
X
Un cliente (hosting ACME) acaba de comprar
y activar un cert SSL
Resultado: redireccionamientos infinitos en
Magento
Explicación
Explicación
X
Además del hosting acme hay un cdn haciendo de
proxy.
X
Solución: Configuramos la opción offloader header
HTTP_X_FORWARDED_PROTO
X Pero empiezan otros problemas… con redsys
Explicación
X El certificado se sirve desde Cloudfare con SNI y
Redsys no lo soporta. Vamos a migrar a nuestros
servidores, pero mientras tanto tenemos que
hacer algo con los callback.
Solución
X
Creamos una nueva URL de callback con un
certificado correcto en otro servidor y ponemos
un script que reenvía los datos a Magento
$url = ‘https://www.cliente.com/redsys/index/callback/’;
$fields = array(
        'Ds_SignatureVersion' => urlencode($_POST['Ds_SignatureVersion']),
        'Ds_Signature' => urlencode($_POST['Ds_Signature']),
        'Ds_MerchantParameters' => urlencode($_POST['Ds_MerchantParameters'])
);
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string, '&');
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
$result = curl_exec($ch);
curl_close($ch);
X-FILE MYSQL
Descripción
X
X
Hosting cloud externo (otro dpto)
El cliente reporta un bug: no se ven
ciertos productos
X
X
Probamos y todo se ve bien…
… o no, o sí, o no…
X Balanceador? Caches?
Descripción
X
Se añade información al bug: a veces
tampoco se puede dar de alta un
producto
X
Parece que en el front los problemas
ocurren sólo con los últimos productos
Explicación
X
X
Conclusión: MySQL es consistente
dentro de la misma conexión…
… pero no entre conexiones
Solución
X Versión oficial:
El Cloud de BBDD tiene varios nodos y
las tablas MyISAM no pueden trabajar
con varios nodos
Solución
X Solución
Quitar nodos
X-FILE CSS
Descripción
X
X
X
Proyecto heredado con un mal diseño
Problemas en versiones viejas de IE
Diseño web + IE => X-Files !
X En este caso no parecía el típico “ms-standard”
X
Se rompían zonas enteras y los cambios no se
aplicaban
X Uno de los primeros proyectos con LESS
Explicación
Explicación
Explicación
X 4096 reglas, 32 hojas, < IE10 (tarde!)
X 32 bits: 5 bits (hojas) + 12 bits (reglas)
Solución
X
X
Separarlo en varios ficheros CSS
Optimizar el tema
X-FILE XML
Descripción
X
X
Problemas de I/O al leer app/etc/local.xml
Todo tipo de consecuencias extrañas
Solución
X
X
X
Explicación
X
X
X
Solución
X
X
X
Solución
X
X
Cargar primero el xml a un string y
después parsearlo
Aplicar parches Magento
X-FILE HDD
Descripción
X
X
X
Entorno cloud con:
Servidores físicos superpotentes
Cabinas de discos duros ultra-rápidas y
fiables
Red de fibra con tecnología alien.
Entorno probado y proporcionando alto
rendimiento y disponibilidad para
aplicaciones críticas (ERP, almacen,
etc.)
X
X
X … pero a veces iba leeeeento
Explicación
0MB/s
150MB/s
300MB/s
450MB/s
600MB/s
Write
X
X
X
Los discos tenían una cache muy
rápida pero a veces no consolidaban
correctamente.
Sin caches eran extremadamente
lentos
La cabina estaba físicamente en otro
edificio y algún router/switch perdía
paquetes (sic)
Solución
X Cambio de almacenamiento SSD local
X Reducir complejidad
X-FILE CACHE
Descripción
X
X
Gran volumen de tráfico
A veces sube la carga a tope
X
X
Cache layout mayor de 1.5MB
> 80.000 entradas SWATCH_*
X
X
Rumores con tamaños máximos en Memcached.
Finalmente pasamos a REDIS
X
Hay que reiniciar todos los fronts para
que vuelva a la normalidad
Descripción
X
Explicación
Investigando muchas horas después...
2015-06-29T23:04:02+00:00 DEBUG (7): 24365END ADD LOCK
2015-06-29T23:04:02+00:00 DEBUG (7): 24365START REMOVE CACHE
2015-06-29T23:04:02+00:00 DEBUG (7): 24365END REMOVE CACHE
2015-06-29T23:04:02+00:00 DEBUG (7): 24365START SAVE CONFIG
2015-06-29T23:04:02+00:00 DEBUG (7): 24362START ADD LOCK
2015-06-29T23:04:02+00:00 DEBUG (7): 24362END ADD LOCK  <---------- No debería llegar aquí, ni continuar
2015-06-29T23:04:02+00:00 DEBUG (7): 24362START REMOVE CACHE
2015-06-29T23:04:02+00:00 DEBUG (7): 24362END REMOVE CACHE
2015-06-29T23:04:02+00:00 DEBUG (7): 24362START SAVE CONFIG
2015-06-29T23:04:02+00:00 DEBUG (7): 24365END SAVE CONFIG
2015-06-29T23:04:02+00:00 DEBUG (7): 24365START REMOVE LOCK
2015-06-29T23:04:02+00:00 DEBUG (7): 24365END REMOVE LOCK
2015-06-29T23:04:03+00:00 DEBUG (7): 24362END SAVE CONFIG
2015-06-29T23:04:03+00:00 DEBUG (7): 24362START REMOVE LOCK
2015-06-29T23:04:03+00:00 DEBUG (7): 24362END REMOVE LOCK
X
Algo pasa con la cache de
configuración
X
Explicación
Caches: no asumas que funcionan
X Magento asume que pueden fallar al leer
X
Explicación
Caches: no asumas que funcionan
X Magento asume que pueden fallar al leer
X … pero al escribir…
Explicación
Explicación
Explicación
Explicación
Solución
X Solución: implementar un bloqueo adecuado
Solución
XSolución Resultado:
2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.1402 3346 TRYING LOCK config_global.lock
2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.146 3346 LOCK ACQUIRED
2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.4262 2893 TRYING LOCK config_global.lock
2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.4296 2893 LOCK DENIED
2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.5973 28677 TRYING LOCK config_global.lock
2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.6227 28677 LOCK DENIED
2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.6781 10373 TRYING LOCK config_global.lock
2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.6809 10373 LOCK DENIED
2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.7245 3150 TRYING LOCK config_global.lock
2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.7276 3150 LOCK DENIED
2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.9242 21025 TRYING LOCK config_global.lock
2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.9265 21025 LOCK DENIED
2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.9892 29427 TRYING LOCK config_global.lock
2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.9916 29427 LOCK DENIED
2015-08-11T09:04:44+00:00 DEBUG (7): 1439283884.5996 1614 TRYING LOCK config_global.lock
2015-08-11T09:04:44+00:00 DEBUG (7): 1439283884.6046 1614 LOCK DENIED
2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.4341 23353 TRYING LOCK config_global.lock
2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.6381 3345 TRYING LOCK config_global.lock
2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.6398 17951 TRYING LOCK config_global.lock
2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.6668 23353 LOCK DENIED
2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.6843 3345 LOCK DENIED
2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.6844 17951 LOCK DENIED
2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.6861 3243 TRYING LOCK config_global.lock
2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.687 16405 TRYING LOCK config_global.lock
2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.7087 27816 TRYING LOCK config_global.lock
2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.7088 3346 START REMOVE CACHE
2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.7294 3243 LOCK DENIED
2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.8494 16405 LOCK DENIED
2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.8648 3346 END REMOVE CACHE
2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.8649 3346 START SAVE CONFIG
2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.886 27816 LOCK DENIED
2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.9914 10366 TRYING LOCK config_global.lock
2015-08-11T09:04:48+00:00 DEBUG (7): 1439283888.0707 10366 LOCK DENIED
2015-08-11T09:04:48+00:00 DEBUG (7): 1439283888.0913 27822 TRYING LOCK config_global.lock
2015-08-11T09:04:48+00:00 DEBUG (7): 1439283888.156 1612 TRYING LOCK config_global.lock
2015-08-11T09:04:48+00:00 DEBUG (7): 1439283888.2183 27822 LOCK DENIED
2015-08-11T09:04:48+00:00 DEBUG (7): 1439283888.4408 29428 TRYING LOCK config_global.lock
2015-08-11T09:04:48+00:00 DEBUG (7): 1439283888.4939 1612 LOCK DENIED
2015-08-11T09:04:48+00:00 DEBUG (7): 1439283888.5218 2896 TRYING LOCK config_global.lock
2015-08-11T09:04:48+00:00 DEBUG (7): 1439283888.5811 29428 LOCK DENIED
2015-08-11T09:04:48+00:00 DEBUG (7): 1439283888.6915 2896 LOCK DENIED
2015-08-11T09:04:55+00:00 DEBUG (7): 1439283895.0935 3346 END SAVE CONFIG (7.2285659313202s)
2015-08-11T09:04:55+00:00 DEBUG (7): 1439283895.0937 3346 TRYING UNLOCK
2015-08-11T09:04:55+00:00 DEBUG (7): 1439283895.1078 3346 UNLOCKED SUCCESSFULLY
X-FILE REDISX-FILE REGULAR EXPRESSIONS
Descripción
X
X
X
Importador de CVS con descripciones
de producto
Error reportado: con descripciones de
más de 6.000 caracteres falla.
Lógica muy sencilla. Básicamente una
query a la BD.
Explicación
X
X
X Vemos segmentation fault en los logs
Primero pensamos en MySQL y
tamaño de campos
Las evidencias nos llevan a Zend
Explicación
/**
     * Remove parts of a SQL string that contain quoted strings
     * of values or identifiers.
     *
     * @param string $sql
     * @return string
     */
    protected function _stripQuoted($sql)
    {
        // get the character for delimited id quotes,
        // this is usually " but in MySQL is `
        $d = $this->_adapter->quoteIdentifier('a');
        $d = $d[0];
 
        // get the value used as an escaped delimited id quote,
        // e.g. " or "" or `
        $de = $this->_adapter->quoteIdentifier($d);
        $de = substr($de, 1, 2);
        $de = str_replace('', '', $de);
 
        // get the character for value quoting
        // this should be '
        $q = $this->_adapter->quote('a');
        $q = $q[0];
 
        // get the value used as an escaped quote,
        // e.g. ' or ''
        $qe = $this->_adapter->quote($q);
        $qe = substr($qe, 1, 2);
        $qe = str_replace('', '', $qe);
 
        // get a version of the SQL statement with all quoted
        // values and delimited identifiers stripped out
        // remove "foo"bar"
        $sql = preg_replace("/$q($qe|{2}|[^$q])*$q/", '', $sql);
        // remove 'foo'bar'
        if (!empty($q)) {
            $sql = preg_replace("/$q($qe|[^$q])*$q/", '', $sql);
        }
 
        return $sql;
    }
Explicación
/**
     * Remove parts of a SQL string that contain quoted strings
     * of values or identifiers.
     *
     * @param string $sql
     * @return string
     */
    protected function _stripQuoted($sql)
    {
        // get the character for delimited id quotes,
        // this is usually " but in MySQL is `
        $d = $this->_adapter->quoteIdentifier('a');
        $d = $d[0];
 
        // get the value used as an escaped delimited id quote,
        // e.g. " or "" or `
        $de = $this->_adapter->quoteIdentifier($d);
        $de = substr($de, 1, 2);
        $de = str_replace('', '', $de);
 
        // get the character for value quoting
        // this should be '
        $q = $this->_adapter->quote('a');
        $q = $q[0];
 
        // get the value used as an escaped quote,
        // e.g. ' or ''
        $qe = $this->_adapter->quote($q);
        $qe = substr($qe, 1, 2);
        $qe = str_replace('', '', $qe);
 
        // get a version of the SQL statement with all quoted
        // values and delimited identifiers stripped out
        // remove "foo"bar"
        $sql = preg_replace("/$q($qe|{2}|[^$q])*$q/", '', $sql);
        // remove 'foo'bar'
        if (!empty($q)) {
            $sql = preg_replace("/$q($qe|[^$q])*$q/", '', $sql);
        }
 
        return $sql;
    }
Explicación
Explicación
$sql = preg_replace("/$q($qe|{2}|[^$q])*$q/", '', $sql);
$sql = preg_replace("/$q($qe|[^$q])*$q/", '', $sql);
Explicación
X
X
X
Todos los lenguajes tienen sistemas
parecidos a PHP para evitar recursiones
infinitas, pero PHP no es muy claro con
errores en expresiones regulares.
Es un bug/feature/límite que ha heredado
Zend de PHP
Ese mismo error, por ejemplo en C#
hubiera dado un
PCRE_ERROR_MATCHLIMIT
Solución
/**
* Remove parts of a SQL string that contain quoted strings
* of values or identifiers.
*
* @param string $sql
* @return string
*/
protected function _stripQuoted($sql)
{
// get the character for value quoting
// this should be '
$q = $this->_adapter->quote('a');
$q = $q[0];
// get the value used as an escaped quote,
// e.g. ' or ''
$qe = $this->_adapter->quote($q);
$qe = substr($qe, 1, 2);
$qe = preg_quote($qe);
$escapeChar = substr($qe,0,1);
// remove 'foo'bar'
if (!empty($q)) {
$escapeChar = preg_quote($escapeChar);
// this segfaults only after 65,000 characters instead of 9,000
$sql = preg_replace("/$q([^$q{$escapeChar}]*|($qe)*)*$q/s", '', $sql);
}
// get a version of the SQL statement with all quoted
// values and delimited identifiers stripped out
// remove "foo"bar"
$sql = preg_replace("/"("|[^"])*"/Us", '', $sql);
// get the character for delimited id quotes,
// this is usually " but in MySQL is `
$d = $this->_adapter->quoteIdentifier('a');
$d = $d[0];
// get the value used as an escaped delimited id quote,
// e.g. " or "" or `
$de = $this->_adapter->quoteIdentifier($d);
$de = substr($de, 1, 2);
$de = preg_quote($de);
// Note: $de and $d where never used..., now they are:
$sql = preg_replace("/$d($de|{2}|[^$d])*$d/Us", '', $sql);
return $sql;
}
Solución
protected function _stripQuoted($sql)
{
…
// this segfaults only after 65,000 characters instead of 9,000
$sql = preg_replace("/$q([^$q{$escapeChar}]*|($qe)*)*$q/s", '',$sql);
…
$sql = preg_replace("/"("|[^"])*"/Us", '', $sql);
…
// Note: $de and $d where never used..., now they are:
$sql = preg_replace("/$d($de|{2}|[^$d])*$d/Us", '', $sql);
…
}
https://framework.zend.com/issues/browse/ZF-5063
http://www.pcre.org/original/doc/html/pcreapi.html
http://zend-framework-community.634137.n4.nabble.com/issues-with-Zend-Db-Statement-str
You are not alone, share your truth with us…
XMagento Files
¡THANK YOU!
Mikel Ruiz
mikel@on4u.es
www.on4u.es @weareon4u@on4u

Más contenido relacionado

La actualidad más candente

[..Tuto..] Pgs4a-0.9.4 en Ubuntu 12.04 precise instalación
[..Tuto..] Pgs4a-0.9.4 en Ubuntu 12.04 precise instalación[..Tuto..] Pgs4a-0.9.4 en Ubuntu 12.04 precise instalación
[..Tuto..] Pgs4a-0.9.4 en Ubuntu 12.04 precise instalaciónIvan Dragogear
 
97132962-instalacion-de-open meetings-en-squeeze
 97132962-instalacion-de-open meetings-en-squeeze 97132962-instalacion-de-open meetings-en-squeeze
97132962-instalacion-de-open meetings-en-squeezexavazquez
 
Magento 2 Code Generation Tools
Magento 2 Code Generation ToolsMagento 2 Code Generation Tools
Magento 2 Code Generation ToolsÓscar Recio Soria
 
Tutorialdenetbeansyopenglpedrolopezsalazar 120103154712-phpapp02
Tutorialdenetbeansyopenglpedrolopezsalazar 120103154712-phpapp02Tutorialdenetbeansyopenglpedrolopezsalazar 120103154712-phpapp02
Tutorialdenetbeansyopenglpedrolopezsalazar 120103154712-phpapp02QBIR
 
Manual de usuario crud django
Manual de usuario crud djangoManual de usuario crud django
Manual de usuario crud djangoDaniel Arevalo
 
Activar hyper v en windows 8
Activar hyper v en windows 8Activar hyper v en windows 8
Activar hyper v en windows 8Maggie Kno
 
ocs inventory gpli gestor incidencias castellano
ocs inventory gpli gestor incidencias castellanoocs inventory gpli gestor incidencias castellano
ocs inventory gpli gestor incidencias castellanoIvan Urgell
 
Webinar 5 net5-2021
Webinar 5 net5-2021Webinar 5 net5-2021
Webinar 5 net5-2021atSistemas
 
Laboratorio de netbeans sql server15-04-2013
Laboratorio de netbeans  sql server15-04-2013Laboratorio de netbeans  sql server15-04-2013
Laboratorio de netbeans sql server15-04-2013saul1905
 
Desplegando código con Phing, PHPunit, Coder y Jenkins
Desplegando código con Phing, PHPunit, Coder y JenkinsDesplegando código con Phing, PHPunit, Coder y Jenkins
Desplegando código con Phing, PHPunit, Coder y JenkinsLa Drupalera
 
04 taller-django
04 taller-django04 taller-django
04 taller-djangosamerscd
 
Cómo migrar de source safe a team foundation server 2010
Cómo migrar de source safe a team foundation server 2010Cómo migrar de source safe a team foundation server 2010
Cómo migrar de source safe a team foundation server 2010Diego Vazquez Arce
 

La actualidad más candente (18)

[..Tuto..] Pgs4a-0.9.4 en Ubuntu 12.04 precise instalación
[..Tuto..] Pgs4a-0.9.4 en Ubuntu 12.04 precise instalación[..Tuto..] Pgs4a-0.9.4 en Ubuntu 12.04 precise instalación
[..Tuto..] Pgs4a-0.9.4 en Ubuntu 12.04 precise instalación
 
97132962-instalacion-de-open meetings-en-squeeze
 97132962-instalacion-de-open meetings-en-squeeze 97132962-instalacion-de-open meetings-en-squeeze
97132962-instalacion-de-open meetings-en-squeeze
 
Netbeans ide 7.2(2)
Netbeans ide 7.2(2)Netbeans ide 7.2(2)
Netbeans ide 7.2(2)
 
Magento 2 Code Generation Tools
Magento 2 Code Generation ToolsMagento 2 Code Generation Tools
Magento 2 Code Generation Tools
 
Framework
FrameworkFramework
Framework
 
Tutorialdenetbeansyopenglpedrolopezsalazar 120103154712-phpapp02
Tutorialdenetbeansyopenglpedrolopezsalazar 120103154712-phpapp02Tutorialdenetbeansyopenglpedrolopezsalazar 120103154712-phpapp02
Tutorialdenetbeansyopenglpedrolopezsalazar 120103154712-phpapp02
 
Manual de usuario crud django
Manual de usuario crud djangoManual de usuario crud django
Manual de usuario crud django
 
Manual de Open Shift
Manual de Open ShiftManual de Open Shift
Manual de Open Shift
 
Activar hyper v en windows 8
Activar hyper v en windows 8Activar hyper v en windows 8
Activar hyper v en windows 8
 
ocs inventory gpli gestor incidencias castellano
ocs inventory gpli gestor incidencias castellanoocs inventory gpli gestor incidencias castellano
ocs inventory gpli gestor incidencias castellano
 
Webinar 5 net5-2021
Webinar 5 net5-2021Webinar 5 net5-2021
Webinar 5 net5-2021
 
Instalación y configuración glpi
Instalación y configuración glpiInstalación y configuración glpi
Instalación y configuración glpi
 
Laboratorio de netbeans sql server15-04-2013
Laboratorio de netbeans  sql server15-04-2013Laboratorio de netbeans  sql server15-04-2013
Laboratorio de netbeans sql server15-04-2013
 
Netbeans ide 7.2
Netbeans ide 7.2Netbeans ide 7.2
Netbeans ide 7.2
 
Desplegando código con Phing, PHPunit, Coder y Jenkins
Desplegando código con Phing, PHPunit, Coder y JenkinsDesplegando código con Phing, PHPunit, Coder y Jenkins
Desplegando código con Phing, PHPunit, Coder y Jenkins
 
04 taller-django
04 taller-django04 taller-django
04 taller-django
 
CodeCamp 2010 | Diez formas de escribir código (in)seguro
CodeCamp 2010 | Diez formas de escribir código (in)seguroCodeCamp 2010 | Diez formas de escribir código (in)seguro
CodeCamp 2010 | Diez formas de escribir código (in)seguro
 
Cómo migrar de source safe a team foundation server 2010
Cómo migrar de source safe a team foundation server 2010Cómo migrar de source safe a team foundation server 2010
Cómo migrar de source safe a team foundation server 2010
 

Similar a Mikel Ruiz - Magento X-Files

Evidencia instalacion
Evidencia instalacionEvidencia instalacion
Evidencia instalacionalbusscorpio
 
81961639 serial-y-tucos-para-activar-office-2010
81961639 serial-y-tucos-para-activar-office-201081961639 serial-y-tucos-para-activar-office-2010
81961639 serial-y-tucos-para-activar-office-2010Erick Quiñonez
 
Diagnostico y resolución de problemas en sql server
Diagnostico y resolución de problemas en sql serverDiagnostico y resolución de problemas en sql server
Diagnostico y resolución de problemas en sql serverSpanishPASSVC
 
24 HOP Español - Utilizando cdc para cargar dw on line - Miguel Egea
24 HOP Español - Utilizando cdc para cargar dw on line - Miguel Egea24 HOP Español - Utilizando cdc para cargar dw on line - Miguel Egea
24 HOP Español - Utilizando cdc para cargar dw on line - Miguel EgeaSpanishPASSVC
 
Todo lo que necesitas saber sobre Drupal 8
Todo lo que necesitas saber sobre Drupal 8Todo lo que necesitas saber sobre Drupal 8
Todo lo que necesitas saber sobre Drupal 8Acquia
 
Bd eq.#3 actividad 2 reporte instalacion mys ql
Bd eq.#3 actividad 2 reporte instalacion mys qlBd eq.#3 actividad 2 reporte instalacion mys ql
Bd eq.#3 actividad 2 reporte instalacion mys qlKARY
 
Bd eq.#3 actividad 2 reporte instalacion mys ql
Bd eq.#3 actividad 2 reporte instalacion mys qlBd eq.#3 actividad 2 reporte instalacion mys ql
Bd eq.#3 actividad 2 reporte instalacion mys qlKARY
 
Bd eq.#3 actividad 2 reporte instalacion mys ql
Bd eq.#3 actividad 2 reporte instalacion mys qlBd eq.#3 actividad 2 reporte instalacion mys ql
Bd eq.#3 actividad 2 reporte instalacion mys qlKARY
 
DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...
DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...
DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...Plain Concepts
 
Guías y recomendaciones para instalar y configurar clusters de sql server
Guías y recomendaciones para instalar y configurar clusters de sql serverGuías y recomendaciones para instalar y configurar clusters de sql server
Guías y recomendaciones para instalar y configurar clusters de sql serverEnrique Catala Bañuls
 
Guias y recomendaciones para instalar y configurar clusters de sql server
Guias y recomendaciones para instalar y configurar clusters de sql serverGuias y recomendaciones para instalar y configurar clusters de sql server
Guias y recomendaciones para instalar y configurar clusters de sql serverEnrique Catala Bañuls
 
Dominando las funciones de ventana (window functions) en TSQL
Dominando las funciones de ventana (window functions) en TSQLDominando las funciones de ventana (window functions) en TSQL
Dominando las funciones de ventana (window functions) en TSQLSpanishPASSVC
 
Creación de VLANs (subredes) desde Cisco Packet Tracer Student
Creación de VLANs (subredes) desde Cisco Packet Tracer StudentCreación de VLANs (subredes) desde Cisco Packet Tracer Student
Creación de VLANs (subredes) desde Cisco Packet Tracer StudentIvan Luis Jimenez
 
Guía de instalación de sql server 2008 r2 paso a paso
Guía de instalación de sql server 2008 r2 paso a pasoGuía de instalación de sql server 2008 r2 paso a paso
Guía de instalación de sql server 2008 r2 paso a pasoKira_Bravo
 
Bd eq.#3 actividad 2 reporte instalacion microsoft sql server
Bd eq.#3 actividad 2 reporte instalacion microsoft sql server Bd eq.#3 actividad 2 reporte instalacion microsoft sql server
Bd eq.#3 actividad 2 reporte instalacion microsoft sql server KARY
 
Bd eq.#3 actividad 2 reporte instalacion microsoft sql server
Bd eq.#3 actividad 2 reporte instalacion microsoft sql server Bd eq.#3 actividad 2 reporte instalacion microsoft sql server
Bd eq.#3 actividad 2 reporte instalacion microsoft sql server KARY
 
Bd eq.#3 actividad 2 reporte instalacion microsoft sql server
Bd eq.#3 actividad 2 reporte instalacion microsoft sql server Bd eq.#3 actividad 2 reporte instalacion microsoft sql server
Bd eq.#3 actividad 2 reporte instalacion microsoft sql server KARY
 

Similar a Mikel Ruiz - Magento X-Files (20)

Evidencia instalacion
Evidencia instalacionEvidencia instalacion
Evidencia instalacion
 
81961639 serial-y-tucos-para-activar-office-2010
81961639 serial-y-tucos-para-activar-office-201081961639 serial-y-tucos-para-activar-office-2010
81961639 serial-y-tucos-para-activar-office-2010
 
Diagnostico y resolución de problemas en sql server
Diagnostico y resolución de problemas en sql serverDiagnostico y resolución de problemas en sql server
Diagnostico y resolución de problemas en sql server
 
24 HOP Español - Utilizando cdc para cargar dw on line - Miguel Egea
24 HOP Español - Utilizando cdc para cargar dw on line - Miguel Egea24 HOP Español - Utilizando cdc para cargar dw on line - Miguel Egea
24 HOP Español - Utilizando cdc para cargar dw on line - Miguel Egea
 
Todo lo que necesitas saber sobre Drupal 8
Todo lo que necesitas saber sobre Drupal 8Todo lo que necesitas saber sobre Drupal 8
Todo lo que necesitas saber sobre Drupal 8
 
Bd eq.#3 actividad 2 reporte instalacion mys ql
Bd eq.#3 actividad 2 reporte instalacion mys qlBd eq.#3 actividad 2 reporte instalacion mys ql
Bd eq.#3 actividad 2 reporte instalacion mys ql
 
Bd eq.#3 actividad 2 reporte instalacion mys ql
Bd eq.#3 actividad 2 reporte instalacion mys qlBd eq.#3 actividad 2 reporte instalacion mys ql
Bd eq.#3 actividad 2 reporte instalacion mys ql
 
Bd eq.#3 actividad 2 reporte instalacion mys ql
Bd eq.#3 actividad 2 reporte instalacion mys qlBd eq.#3 actividad 2 reporte instalacion mys ql
Bd eq.#3 actividad 2 reporte instalacion mys ql
 
DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...
DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...
DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...
 
Guías y recomendaciones para instalar y configurar clusters de sql server
Guías y recomendaciones para instalar y configurar clusters de sql serverGuías y recomendaciones para instalar y configurar clusters de sql server
Guías y recomendaciones para instalar y configurar clusters de sql server
 
Cursos obligarorios
Cursos obligaroriosCursos obligarorios
Cursos obligarorios
 
Guias y recomendaciones para instalar y configurar clusters de sql server
Guias y recomendaciones para instalar y configurar clusters de sql serverGuias y recomendaciones para instalar y configurar clusters de sql server
Guias y recomendaciones para instalar y configurar clusters de sql server
 
Dominando las funciones de ventana (window functions) en TSQL
Dominando las funciones de ventana (window functions) en TSQLDominando las funciones de ventana (window functions) en TSQL
Dominando las funciones de ventana (window functions) en TSQL
 
Creación de VLANs (subredes) desde Cisco Packet Tracer Student
Creación de VLANs (subredes) desde Cisco Packet Tracer StudentCreación de VLANs (subredes) desde Cisco Packet Tracer Student
Creación de VLANs (subredes) desde Cisco Packet Tracer Student
 
Guía de instalación de sql server 2008 r2 paso a paso
Guía de instalación de sql server 2008 r2 paso a pasoGuía de instalación de sql server 2008 r2 paso a paso
Guía de instalación de sql server 2008 r2 paso a paso
 
7 curso
7 curso7 curso
7 curso
 
Laboratorio de Redes
Laboratorio de RedesLaboratorio de Redes
Laboratorio de Redes
 
Bd eq.#3 actividad 2 reporte instalacion microsoft sql server
Bd eq.#3 actividad 2 reporte instalacion microsoft sql server Bd eq.#3 actividad 2 reporte instalacion microsoft sql server
Bd eq.#3 actividad 2 reporte instalacion microsoft sql server
 
Bd eq.#3 actividad 2 reporte instalacion microsoft sql server
Bd eq.#3 actividad 2 reporte instalacion microsoft sql server Bd eq.#3 actividad 2 reporte instalacion microsoft sql server
Bd eq.#3 actividad 2 reporte instalacion microsoft sql server
 
Bd eq.#3 actividad 2 reporte instalacion microsoft sql server
Bd eq.#3 actividad 2 reporte instalacion microsoft sql server Bd eq.#3 actividad 2 reporte instalacion microsoft sql server
Bd eq.#3 actividad 2 reporte instalacion microsoft sql server
 

Último

La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafiosFundación YOD YOD
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxJOSEMANUELHERNANDEZH11
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024GiovanniJavierHidalg
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxpabonheidy28
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 

Último (16)

La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafios
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptx
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docx
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 

Mikel Ruiz - Magento X-Files

  • 1. Mikel Ruiz, CTO en On4u Magento X Files
  • 2. Co-Founder y CTO en On4u Ingeniero Informático Magento Partner desde 2009 MCD, MCSS, M2 trained 50+ proyectos Magento
  • 3. Compartir eXperiencia Otros puntos de vista Terapia de grupo ;) QUÉ BUSCAMOS X X X
  • 5. Descripción X X Vemos en New Relic transacciones de +30s, que parecen timeouts Pero 1-5 pedidos/día se quedan en un estado previo a ir a la pasarela X Cada 15 minutos se borran los pedidos que no se han pagado (on hold) X Magento EE con muchos pedidos X Parece que la sesión se queda bloqueada X El resto de peticiones funcionan bien X $session->getLastOrderId()
  • 8. SSL Explicación X PHP dice… “Not a bug”
  • 14. Descripción X X Un cliente (hosting ACME) acaba de comprar y activar un cert SSL Resultado: redireccionamientos infinitos en Magento
  • 16. Explicación X Además del hosting acme hay un cdn haciendo de proxy. X Solución: Configuramos la opción offloader header HTTP_X_FORWARDED_PROTO X Pero empiezan otros problemas… con redsys
  • 17. Explicación X El certificado se sirve desde Cloudfare con SNI y Redsys no lo soporta. Vamos a migrar a nuestros servidores, pero mientras tanto tenemos que hacer algo con los callback.
  • 18. Solución X Creamos una nueva URL de callback con un certificado correcto en otro servidor y ponemos un script que reenvía los datos a Magento $url = ‘https://www.cliente.com/redsys/index/callback/’; $fields = array(         'Ds_SignatureVersion' => urlencode($_POST['Ds_SignatureVersion']),         'Ds_Signature' => urlencode($_POST['Ds_Signature']),         'Ds_MerchantParameters' => urlencode($_POST['Ds_MerchantParameters']) ); foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; } rtrim($fields_string, '&'); $ch = curl_init(); curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_POST, count($fields)); curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string); $result = curl_exec($ch); curl_close($ch);
  • 20. Descripción X X Hosting cloud externo (otro dpto) El cliente reporta un bug: no se ven ciertos productos X X Probamos y todo se ve bien… … o no, o sí, o no… X Balanceador? Caches?
  • 21. Descripción X Se añade información al bug: a veces tampoco se puede dar de alta un producto X Parece que en el front los problemas ocurren sólo con los últimos productos
  • 22. Explicación X X Conclusión: MySQL es consistente dentro de la misma conexión… … pero no entre conexiones
  • 23. Solución X Versión oficial: El Cloud de BBDD tiene varios nodos y las tablas MyISAM no pueden trabajar con varios nodos
  • 26. Descripción X X X Proyecto heredado con un mal diseño Problemas en versiones viejas de IE Diseño web + IE => X-Files ! X En este caso no parecía el típico “ms-standard” X Se rompían zonas enteras y los cambios no se aplicaban X Uno de los primeros proyectos con LESS
  • 29. Explicación X 4096 reglas, 32 hojas, < IE10 (tarde!) X 32 bits: 5 bits (hojas) + 12 bits (reglas)
  • 30. Solución X X Separarlo en varios ficheros CSS Optimizar el tema
  • 32. Descripción X X Problemas de I/O al leer app/etc/local.xml Todo tipo de consecuencias extrañas
  • 36. Solución X X Cargar primero el xml a un string y después parsearlo Aplicar parches Magento
  • 38. Descripción X X X Entorno cloud con: Servidores físicos superpotentes Cabinas de discos duros ultra-rápidas y fiables Red de fibra con tecnología alien. Entorno probado y proporcionando alto rendimiento y disponibilidad para aplicaciones críticas (ERP, almacen, etc.) X X X … pero a veces iba leeeeento
  • 39. Explicación 0MB/s 150MB/s 300MB/s 450MB/s 600MB/s Write X X X Los discos tenían una cache muy rápida pero a veces no consolidaban correctamente. Sin caches eran extremadamente lentos La cabina estaba físicamente en otro edificio y algún router/switch perdía paquetes (sic)
  • 40. Solución X Cambio de almacenamiento SSD local X Reducir complejidad
  • 42. Descripción X X Gran volumen de tráfico A veces sube la carga a tope X X Cache layout mayor de 1.5MB > 80.000 entradas SWATCH_* X X Rumores con tamaños máximos en Memcached. Finalmente pasamos a REDIS X Hay que reiniciar todos los fronts para que vuelva a la normalidad
  • 44. X Explicación Investigando muchas horas después... 2015-06-29T23:04:02+00:00 DEBUG (7): 24365END ADD LOCK 2015-06-29T23:04:02+00:00 DEBUG (7): 24365START REMOVE CACHE 2015-06-29T23:04:02+00:00 DEBUG (7): 24365END REMOVE CACHE 2015-06-29T23:04:02+00:00 DEBUG (7): 24365START SAVE CONFIG 2015-06-29T23:04:02+00:00 DEBUG (7): 24362START ADD LOCK 2015-06-29T23:04:02+00:00 DEBUG (7): 24362END ADD LOCK  <---------- No debería llegar aquí, ni continuar 2015-06-29T23:04:02+00:00 DEBUG (7): 24362START REMOVE CACHE 2015-06-29T23:04:02+00:00 DEBUG (7): 24362END REMOVE CACHE 2015-06-29T23:04:02+00:00 DEBUG (7): 24362START SAVE CONFIG 2015-06-29T23:04:02+00:00 DEBUG (7): 24365END SAVE CONFIG 2015-06-29T23:04:02+00:00 DEBUG (7): 24365START REMOVE LOCK 2015-06-29T23:04:02+00:00 DEBUG (7): 24365END REMOVE LOCK 2015-06-29T23:04:03+00:00 DEBUG (7): 24362END SAVE CONFIG 2015-06-29T23:04:03+00:00 DEBUG (7): 24362START REMOVE LOCK 2015-06-29T23:04:03+00:00 DEBUG (7): 24362END REMOVE LOCK X Algo pasa con la cache de configuración
  • 45. X Explicación Caches: no asumas que funcionan X Magento asume que pueden fallar al leer
  • 46. X Explicación Caches: no asumas que funcionan X Magento asume que pueden fallar al leer X … pero al escribir…
  • 51. Solución X Solución: implementar un bloqueo adecuado
  • 53. XSolución Resultado: 2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.1402 3346 TRYING LOCK config_global.lock 2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.146 3346 LOCK ACQUIRED 2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.4262 2893 TRYING LOCK config_global.lock 2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.4296 2893 LOCK DENIED 2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.5973 28677 TRYING LOCK config_global.lock 2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.6227 28677 LOCK DENIED 2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.6781 10373 TRYING LOCK config_global.lock 2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.6809 10373 LOCK DENIED 2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.7245 3150 TRYING LOCK config_global.lock 2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.7276 3150 LOCK DENIED 2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.9242 21025 TRYING LOCK config_global.lock 2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.9265 21025 LOCK DENIED 2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.9892 29427 TRYING LOCK config_global.lock 2015-08-11T09:04:43+00:00 DEBUG (7): 1439283883.9916 29427 LOCK DENIED 2015-08-11T09:04:44+00:00 DEBUG (7): 1439283884.5996 1614 TRYING LOCK config_global.lock 2015-08-11T09:04:44+00:00 DEBUG (7): 1439283884.6046 1614 LOCK DENIED 2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.4341 23353 TRYING LOCK config_global.lock 2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.6381 3345 TRYING LOCK config_global.lock 2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.6398 17951 TRYING LOCK config_global.lock 2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.6668 23353 LOCK DENIED 2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.6843 3345 LOCK DENIED 2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.6844 17951 LOCK DENIED 2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.6861 3243 TRYING LOCK config_global.lock 2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.687 16405 TRYING LOCK config_global.lock 2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.7087 27816 TRYING LOCK config_global.lock 2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.7088 3346 START REMOVE CACHE 2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.7294 3243 LOCK DENIED 2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.8494 16405 LOCK DENIED 2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.8648 3346 END REMOVE CACHE 2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.8649 3346 START SAVE CONFIG 2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.886 27816 LOCK DENIED 2015-08-11T09:04:47+00:00 DEBUG (7): 1439283887.9914 10366 TRYING LOCK config_global.lock 2015-08-11T09:04:48+00:00 DEBUG (7): 1439283888.0707 10366 LOCK DENIED 2015-08-11T09:04:48+00:00 DEBUG (7): 1439283888.0913 27822 TRYING LOCK config_global.lock 2015-08-11T09:04:48+00:00 DEBUG (7): 1439283888.156 1612 TRYING LOCK config_global.lock 2015-08-11T09:04:48+00:00 DEBUG (7): 1439283888.2183 27822 LOCK DENIED 2015-08-11T09:04:48+00:00 DEBUG (7): 1439283888.4408 29428 TRYING LOCK config_global.lock 2015-08-11T09:04:48+00:00 DEBUG (7): 1439283888.4939 1612 LOCK DENIED 2015-08-11T09:04:48+00:00 DEBUG (7): 1439283888.5218 2896 TRYING LOCK config_global.lock 2015-08-11T09:04:48+00:00 DEBUG (7): 1439283888.5811 29428 LOCK DENIED 2015-08-11T09:04:48+00:00 DEBUG (7): 1439283888.6915 2896 LOCK DENIED 2015-08-11T09:04:55+00:00 DEBUG (7): 1439283895.0935 3346 END SAVE CONFIG (7.2285659313202s) 2015-08-11T09:04:55+00:00 DEBUG (7): 1439283895.0937 3346 TRYING UNLOCK 2015-08-11T09:04:55+00:00 DEBUG (7): 1439283895.1078 3346 UNLOCKED SUCCESSFULLY
  • 55. Descripción X X X Importador de CVS con descripciones de producto Error reportado: con descripciones de más de 6.000 caracteres falla. Lógica muy sencilla. Básicamente una query a la BD.
  • 56. Explicación X X X Vemos segmentation fault en los logs Primero pensamos en MySQL y tamaño de campos Las evidencias nos llevan a Zend
  • 57. Explicación /**      * Remove parts of a SQL string that contain quoted strings      * of values or identifiers.      *      * @param string $sql      * @return string      */     protected function _stripQuoted($sql)     {         // get the character for delimited id quotes,         // this is usually " but in MySQL is `         $d = $this->_adapter->quoteIdentifier('a');         $d = $d[0];           // get the value used as an escaped delimited id quote,         // e.g. " or "" or `         $de = $this->_adapter->quoteIdentifier($d);         $de = substr($de, 1, 2);         $de = str_replace('', '', $de);           // get the character for value quoting         // this should be '         $q = $this->_adapter->quote('a');         $q = $q[0];           // get the value used as an escaped quote,         // e.g. ' or ''         $qe = $this->_adapter->quote($q);         $qe = substr($qe, 1, 2);         $qe = str_replace('', '', $qe);           // get a version of the SQL statement with all quoted         // values and delimited identifiers stripped out         // remove "foo"bar"         $sql = preg_replace("/$q($qe|{2}|[^$q])*$q/", '', $sql);         // remove 'foo'bar'         if (!empty($q)) {             $sql = preg_replace("/$q($qe|[^$q])*$q/", '', $sql);         }           return $sql;     }
  • 58. Explicación /**      * Remove parts of a SQL string that contain quoted strings      * of values or identifiers.      *      * @param string $sql      * @return string      */     protected function _stripQuoted($sql)     {         // get the character for delimited id quotes,         // this is usually " but in MySQL is `         $d = $this->_adapter->quoteIdentifier('a');         $d = $d[0];           // get the value used as an escaped delimited id quote,         // e.g. " or "" or `         $de = $this->_adapter->quoteIdentifier($d);         $de = substr($de, 1, 2);         $de = str_replace('', '', $de);           // get the character for value quoting         // this should be '         $q = $this->_adapter->quote('a');         $q = $q[0];           // get the value used as an escaped quote,         // e.g. ' or ''         $qe = $this->_adapter->quote($q);         $qe = substr($qe, 1, 2);         $qe = str_replace('', '', $qe);           // get a version of the SQL statement with all quoted         // values and delimited identifiers stripped out         // remove "foo"bar"         $sql = preg_replace("/$q($qe|{2}|[^$q])*$q/", '', $sql);         // remove 'foo'bar'         if (!empty($q)) {             $sql = preg_replace("/$q($qe|[^$q])*$q/", '', $sql);         }           return $sql;     }
  • 60. Explicación $sql = preg_replace("/$q($qe|{2}|[^$q])*$q/", '', $sql); $sql = preg_replace("/$q($qe|[^$q])*$q/", '', $sql);
  • 61. Explicación X X X Todos los lenguajes tienen sistemas parecidos a PHP para evitar recursiones infinitas, pero PHP no es muy claro con errores en expresiones regulares. Es un bug/feature/límite que ha heredado Zend de PHP Ese mismo error, por ejemplo en C# hubiera dado un PCRE_ERROR_MATCHLIMIT
  • 62. Solución /** * Remove parts of a SQL string that contain quoted strings * of values or identifiers. * * @param string $sql * @return string */ protected function _stripQuoted($sql) { // get the character for value quoting // this should be ' $q = $this->_adapter->quote('a'); $q = $q[0]; // get the value used as an escaped quote, // e.g. ' or '' $qe = $this->_adapter->quote($q); $qe = substr($qe, 1, 2); $qe = preg_quote($qe); $escapeChar = substr($qe,0,1); // remove 'foo'bar' if (!empty($q)) { $escapeChar = preg_quote($escapeChar); // this segfaults only after 65,000 characters instead of 9,000 $sql = preg_replace("/$q([^$q{$escapeChar}]*|($qe)*)*$q/s", '', $sql); } // get a version of the SQL statement with all quoted // values and delimited identifiers stripped out // remove "foo"bar" $sql = preg_replace("/"("|[^"])*"/Us", '', $sql); // get the character for delimited id quotes, // this is usually " but in MySQL is ` $d = $this->_adapter->quoteIdentifier('a'); $d = $d[0]; // get the value used as an escaped delimited id quote, // e.g. " or "" or ` $de = $this->_adapter->quoteIdentifier($d); $de = substr($de, 1, 2); $de = preg_quote($de); // Note: $de and $d where never used..., now they are: $sql = preg_replace("/$d($de|{2}|[^$d])*$d/Us", '', $sql); return $sql; }
  • 63. Solución protected function _stripQuoted($sql) { … // this segfaults only after 65,000 characters instead of 9,000 $sql = preg_replace("/$q([^$q{$escapeChar}]*|($qe)*)*$q/s", '',$sql); … $sql = preg_replace("/"("|[^"])*"/Us", '', $sql); … // Note: $de and $d where never used..., now they are: $sql = preg_replace("/$d($de|{2}|[^$d])*$d/Us", '', $sql); … } https://framework.zend.com/issues/browse/ZF-5063 http://www.pcre.org/original/doc/html/pcreapi.html http://zend-framework-community.634137.n4.nabble.com/issues-with-Zend-Db-Statement-str
  • 64.
  • 65. You are not alone, share your truth with us… XMagento Files