Optimizar tus aplicaciones/scripts de PHP
Hay miles de artículos que explican como optimizar una aplicación. Desde los básicos que te hablan del sentido común que hay que tener cuando programás (optimizar estructuras, uso de variables, etc) hasta las específicas por como está implementado el lenguaje.
Encontré este artículo “40 Tips for optimizing your php Code” (40 consejos para optimizar tu código PHP), que la verdad es muy interesante. Y me tomo el trabajo de traducir algunas de las que me parecieron sumamente curiosas e importantes.
-
Si un método puede ser estático, declaralo como estático. La performance mejora hasta 4 veces.
class cClase(){ function miMetodo() { } }cambialo por:
class cClase() { static function miMetodo() { } } -
“echo” es mucho más rápido que “print“
print $aVar;reemplaza por:
echo $aVar -
Usa “echo” con parámetros en vez de concatenar cadenas.
echo $sVar1 . $sVar2 . $sVar 3;reemplaza por:
echo $sVar1, $sVar2, $sVar 3; -
Libera las variables que ya no usas con unset, especialmente los arrays largos.
print $sVar; unset $sVar; -
Evita los métodos mágicos como __get, __set, __autoload
-
require_once() es costoso. Utiliza require();
require_once('mi_lib.inc.php');reemplaza por:
require('mi_lib.inc.php'); -
Utilizar rutas absolutas en los require() e include(). Ahorras el tiempo que se tarda en resolver las rutas relativas.
require('../libs/mi_lib.inc.php');reemplaza por:
require('/home/apps/libs/mi_lib.inc.php'); -
str_replace() es mucho más rápido que preg_replace(), pero strtr() es hasta 4 veces más rápido que str_replace().
preg_replace('a', 'á', $sVar);reemplaza por:
str_replace('a', 'á', $sVar);o mejor aún por:
strtr('a', 'á', $sVar); -
Suprimir errores con @ es muy lento.
@mysql_connect($sServer, $sUser, $sPass);reemplaza por:
mysql_connect($sServer, $sUser, $sPass); -
Cierra las conexiones con la base de datos cuando ya no la uses
mysql_close($rLink); -
$aArray[’id’] es hasta 7 veces más rápido que $aArray[id] (y no genera warnings)
echo $aArray[id];reemplaza por:
echo $aArray['id']; -
No utilizes funciones dentro de una estructura repetitiva ya que esta será llamada en cada iteracción.
for ($i=0; $i < count($aArray); $i) { // Proceso }reemplaza por:
$iItems = count($aArray); for ($i=0; $i < $iItems; $i) { // Proceso } -
Incrementar la propiedad de un objeto es 3 veces más lento que incrementar una variable.
$oObjeto->iCount++;es menos eficiente que:
$iCount++; -
Incrementar una variable no inicializada es entre 9 y 10 veces más lento que incrementar una variable inicializada.
$iCount++;reemplaza por:
$iCount = 0; $iCount++; -
Los métodos definidos en una clase derivada se ejecutan más rápido que los métodos de la clase base.
class cClassBase { function incrementar1() { } } class cClassDerivada extends cClassBase { function incrementar2() { } } $oObjeto = new cClassDerivada; // Más lento $oObjeto->incrementar1(); // Más rápido $oObjeto->incrementar2(); -
Trata de usar comillas simples en vez de utilizar comillas dobles para encerrar las cadenas (a menos que uses variables dentro de estas). Las cadenas dentro de comillas dobles implican un parsing.
echo "Esta es una cadena simple.";reemplaza por:
echo 'Esta es una cadena simple.'; -
No todo en tu aplicación debe ser OOP, a menudo esto implica mucha sobrecargada: cada método y cada llamada al objeto consume mucha memoria e implica varios procesos.
-
No implementes cada estructura de datos como un objeto. Los arrays son muy útiles también.
class cPersona { var $sNombre = 'Pablo'; var $iEdad; = 32; var $sSexo = 'Masculino'; } $oPersona = new cPersona; echo $oPersona->$sNombre, ' tiene ', $oPersona->$iEdad, ' y es ', $oPersona->$sSexo;reemplaza por:
$aPersona = ar ray(); $aPersona['nombre'] = 'Pablo'; $aPersona['edad'] = 32; $aPersona['sexo'] = 'Masculino'; echo $aPersona['nombre'], ' tiene ', $aPersona['edad'], ' y es ', $aPersona['sexo']; -
No crees demasiadas funciones, piensa realmente que código vas a reutilizar. Después puedes convertir ese código en una función si lo necesitas.
$iVar = incrementarValor($iVar); function incrementarValor($iValor) { $iValor = $iValor + 10; return $iValor; }reemplaza por:
$iVar = $iVar + 10; -
Trata de utilizar siempre todas las funciones predefinidas. Tienes miles y para todos los gustos.
echo cambiarNLporBR("Esta es una ncadena connsaltos denlínea"); function cambiarNLporBr($sVar) { return str_replace("n", '‘, $sVar); }reemplaza por:
echo nl2br("Esta es unancadena connsaltos denlínea"); -
Si tienes que utilizar muchas funciones, considera hacerlas en C y crear extensiones.
-
Analiza tu código. Este análisis te permitirá conocer cuales partes consumen más tiempo y memoria. Utiliza el depurador Xdebug que ya contiene un analizador. Con esto es muy fácil detectar cuellos de botella.
Aquí tienes otro excelente artículo para leer sobre la optimización de PHP.