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()
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
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
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
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
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.
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;
}
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