Optimización de PHP

Los programadores solemos preocuparnos poco de la optimización de código cuando realizamos un programa. A priori, le damos importancia a dos factores:

Otros factores como rapidez, comprensión del código, optimización, documentación... no son evaluados como criterios primarios. Sin embargo, son muy importantes. En la programación web uno de los criterios más importantes es la optimización, ya que disponemos de un servidor con recursos limitados. Si conseguimos que nuestro código sea más eficiente, dispondremos de menos carga en nuestro servidor.

Esto es especialmente importante cuando tenemos muchas visitas. Por ejemplo optimizar un script PHP que se ejecuta siempre (por ejemplo, el menú o el logotipo) puede ayudar a reducir el uso de recursos. Pero tampoco hay que obsesionarse con la optimización a estos niveles, por ejemplo optimizar un script PHP que no se ejecuta mucho y por tanto no repercute especialmente en el rendimiento del servidor, no vale la pena.

Siempre es bueno tener estos consejos en cuenta:

1. Usar HTML antes que PHP

Si necesitas poner etiquetas HTML hazlo directamente fuera de PHP. Recuerda que puedes abrir y cerrar PHP las veces que quieras.

Si necesitas imprimir, una variable por ejemplo, prefiere echo a print.

2. Minimizar uso de variables

En muchas ocaciones se puede usar directamente el dato recuperado sin usar variable. Favorece siempre que puedas el uso de constantes y variables estáticas antes que variables globales en la medida de lo posible.

Por ejemplo luego de un envio de formulario con GET o POST.

$a = $_GET['a'];
$b = $_POST['b'];
$c = $_REQUEST['c'];

Por ejemplo luego de un SELECT.

$sql = "SELECT * FROM cheques WHERE mov='$mov'";
$res = $mysqli->query($sql) OR die('Revisa el query

'. $sql); $row = $res->fetch_assoc(); $ob = $row['ob'];

Porque no trabajas un poquito mas y usas directamente el dato ?

PHP 5.4 tiene un recolector de basura (garbage collector) propio, el cual va liberando automáticamente la memoria inutilizada para evitar hacer un gasto innecesario de memoria, pero estos algoritmos son complicados y no son perfectos, así ayudale un poco.

Siempre que queramos comprobar la existencia de una variable, es preferible hacer uso de las funciones en el orden en el que voy a escribirlas a continuación:

isset()
empty()
is_array()

Usa la función unset() para destruir variables y liberar memoria, sobre todo con arrays o variables extensas. PHP usa un Garbage Collector, pero en mitad de un script puedes usarlo para maximizar la memoria disponible (útil en servidores limitados).

3. Uso de comillas

Las comillas simples interpretan literales, sin embargo, las comillas dobles además interpolan el valor de variables. Da siempre preferencia a las comillas simples y nunca escribas símbolos de dolar sin escapar (\$) en comillas dobles, ralentiza mucho la ejecución.

$nom = 'Juan';
$nom = "Juan"; //No debes hacer estos
$des = "Hola $nom \n";
$des = 'Hola '. $nom ."\n";

Recuerda que la comilla doble debe primero evaluan or lo que consumen mas ciclos de CPU.

4. Condicionales

Es preferible usar If/else que Switch.

5. Bucles

Los bucles son una comodidad pero la eficiencia en consumo de ciclos CPU entre ellos es significativa. Prefierelos en este orden.

Solo lectura:

foreach()
do{ … }while( … )
while( … ) { … }
for( … ; … ; … ) { … }

Modificar valores:

for( … ; … ; … ) { … }
do{ … }while( … )
while( … ) { … }
foreach()

6. Inclusiones

Las funciones include(), require(), include_once() y require_once() son funciones muy usadas en los proyectos PHP ya que nos permiten reusar codigo. Pero no todas ellas se comportan de la misma manera: require() devuelve un error fatal mientras que include() solo un warning. Include_once() y require_once(), antes de hacer su trabajo de inclusión del código comprueban si éste ya ha sido añadido con anterioridad dentro del mismo script, lo que lo hace más lento.

7. operadores

Hay dos tipos de operadores incrementales: $i++ (posterior) y ++$i (anterior). Es decir ambosincrementan en uno la variablke pero el primero lo hace despuest de mostrar el valor y el segundo antes de mostrar el valor. Si no mostraras el valor que te importa ? pues resulta que el ++$i es mas rapido.

++$i;
$i++;
$i += 1;
$i = $i + 1;

Evita usar ===, <== y >== ya que ademas de comparar el valor comprueban el tipo.

Ver orden de velocidad.

8. Alias

Un alias no es más que un segundo nombre que se le da a una función, el uso de éstos es considerablemente más lento, ya que tiene que llamar a la función principal.

chop -> rtrim
close -> closedir
die -> exit
dir -> getdir
diskfreespace -> disk_free_space
fputs -> fwrite
ini_alter -> ini_set
is_writeable -> is_writable
join -> implode
pos -> current
rewind -> rewinddir
strchr -> strstr
sizeof -> count

9. Funciones

Siempre que sea posible usa las funciones que ya están implementadas en PHP en lugar reiventarlas tu misma, ya que las implementadas en PHP son funciones muy comprobadas y optimizadas.

10. MySQL

Selecciona solo los campos que necesites en tu consulta.

SELECT * FROM obras
SELECT ob,obra FROM obras //Es mas economico

11. Benchmark

PHPBench.com fue construido como una forma de abrir los ojos de la gente al hecho de que no todos los fragmentos de código PHP se ejecutarán a la misma velocidad. Usted puede ser sorprendido por los resultados que esta página genera, pero eso está bien. Esta página también se creó para que pudieras descubrir buenas practicas con estas estadísticas y luego volver a ejecutar estas pruebas en tu propio entorno de servidor para jugar con esta idea tú mismo, usando los ejemplos de código. Estos ejemplos de código se generan automáticamente.

Debes actualizar esta página varias veces para "capturar" el resultado correcto. Los números cambian a veces drásticamente durante cada refresco. Supongo que esto es debido a PHP, que cae en forma aleatoria y también otros procesos que se ejecutan en esta máquina tienen una influencia.

En estas pruebas se uso la función microtime() por motivos de simplicidad.