Escrito el 28/November/2007 por juan_belon
En el editor Zend Studio a veces al guardar se meten caracteres de Unix o Windows lo que hace que algunas líneas en blanco aparezcan entre línea y línea, para eliminarlas simplemente hacemos un reemplazo de
^$\n
por una cadena vacía y asunto arreglado…
He terminado una nueva clase de bases genérica compatible con todas las que PHP conoce así como una clase para utilizar caché web y otra para cargar/escribir configuraciones de aplicaciones.
Pronto verán la luz…
Escrito el 20/November/2007 por juan_belon
Además de las optimizaciones de arrays y otras consideraciones como no usar cadenas muy largas ni ficheros demasiado grandes en PHP, he considerado oportuno mencionar algunas prácticas importantes a tener en cuenta para hacer más eficientes nuestros scripts (llámalo programas XD )
Ahí van algunos consejos:
- No abusar de las Expresiones Regulares: intenta usar llamadas a funciones compatibles con Perl como preg_match, preg_replace en lugar de ereg y ereg_replace,ya que son mucho más rápidas:
<?php
$cadena = ereg_replace("pato","pingüino","A Juan le gustan los pingüinos");
?>
ésta llamada puede llegar a ser hasta 10 veces más lenta que su función equivalente str_replace().
- Donde quiera que sea intenta conseguir crear código estático, de forma que sea invariante dentro de bucles.
- Divide las plantillas de un sitio web en varios ficheros html (cabecera,lado izquierdo,pie,etc.) para que desde PHP no tengas que concatenar grandes cadenas de texto ya que es altamente ineficient incluso para la llamada a echo.
- Evitar usar exec(), shell(),etc. no sólo por ser inseguras sino porque además es mucho más rápida una llamada a una función php , si vas a hacer un "ls -lha" por ejemplo.
- Usar un directorio distinto a /tmp para guardar las sesiones.
- No cargar extensiones de PHP dinámicamente ya que la naturaleza de gestión de memoria bajo UNIX hace que al iniciar la carga del servidor sea más eficiente que hacerlo después separadamente por cada proceso del servidor; además, si se carga en el inicio ,el proceso padre de Apache comparte con sus hijos dichas extensiones cargadas en memoria…
- Llevar cuidado con mysql_unbuffered_query() ya que la consulta podría devolverse demasiado rápido y no le da tiempo a PHP a tomarla de vuelta por lo que puede hacer que el servidor de MySQL bloquee las tablas de la consulta por más tiempo de lo necesario. Sólo es aconsejable si las actualizaciones son poco frecuentes.
- eval() is evil XD (demasiado lento para ser real
)
Más optimizaciones en próximos capítulos.
Suerte y saludos!
Escrito el 15/November/2007 por juan_belon
El
ha comenzado y zenphp forma parte de él.
Granada PHP se ha convertido en una fuente de conocimientos PHP,HTML,JavaScript,Apache y MySQL a lo largo de los casi 2 años que lleva online. Sin embargo ni siquiera hemos empezado a trabajar!
Espero que disfrutéis vuestra visita y ¡muchas gracias por estar ahí!
Escrito el 12/November/2007 por juan_belon
Escribir programas en PHP es muy fácil, porque su sintáxis es muy simple y efectiva. Sin embargo debemos saber ciertos conceptos básicos para escribir programas eficientes, si vas a tener un sitio con mucho tráficos, ésto se convierte en algo realmente importante, ya que esas pequeñas optimizaciones de código en cuanto a eficiencia hacen que no se sobrecarge el servidor atendiendo todas las peticiones de los clientes.
Evitar arrays de arrays ( multidimensionales )
Un array (matriz o vector) es una estructura de datos consistente en un grupo de elementos que son accedidos por una llave o índice. En la mayoría de lenguajes de programación el indice de un array es un número,pero en PHP la llave puede ser cualquier cosa ( string, integers, floats), eso es porque PHP hace un hash con el índice, gracias a esta característica podemos desarrollar programas más flexibles.
Aunque ésto puede tener un efecto negativo si usamos un “array de array”. Ejemplo:
<?php
for($i=0; $i < 60000; $i++)
$f[‘a‘][‘b‘][$i] = $i;
?>
Aunque a veces es necesario usar arrays multidimensionales “array de array” para hacer el código más simple y corto.
<?php
$b = &$f[‘a‘][‘b‘]; //dirección de memoria del array de array
for($i=0; $i < 60000; $i++)
$b[$i] = $i; //Recorrer ahora el array,además de ser mas simple,
// es más rápido en tiempo de ejecución porque se ahorra haces 3 hash
// en cada iteración del bucle for
?>
No usar constantes sin declarar como llaves de un array
PHP procesa en $f[a] ,”a” como una constanste y si “a” no es una constante de PHP ni declarada por el usuario entonces la procesará como ‘a' quedando como $f[’a'], además es mucho más ineficiente por tener que buscar en la tabla de constantes…
Mal hecho:
<?php
inicio_contador_tiempo();
for($i=0; $i < 60000; $i++)
$f[a] = $i;
print _fin_contador_tiempo(“Tiempo de ejecución: “);
?>
Tiempo de ejecución: 0.23406291008 segundos
Bien hecho:
<?php
inicio_contador_tiempo();
for($i=0; $i < 60000; $i++)
$f[‘a‘] = $i;
print _fin_contador_tiempo(“Tiempo de ejecución: “);
?>
Tiempo de ejecución: 0.0413820743561 segundos
Podemos comprobar que la diferencia en tiempo de ejecución es muy grande, el segundo script se ejecuta al menos 6 veces más rápido que el primero, y la única diferencia es el no haber utilizado comillas (dobles o simples,es lo mismo).
No usar llamadas funciones DENTRO de las condiciones de un bucle
Intentar sacar todas las llamadas como "count()" fuera de una condición de un bucle,para que no se ejecute cada iteración, Ejemplo:
Mal hecho:
<?php
$array= range( 1, 10000);
inicio_contador_tiempo();
for($i=0; $i < count($array); $i++)
;
print _fin_contador_tiempo(“Tiempo de ejecución: “);
?>
Tiempo de ejecución: 0.0144419670105 segundos
Bien hecho:
<?php
$array= range( 1, 10000);
inicio_contador_tiempo();
$b = count($array);
for($i=0; $i < $b; $i++)
;
print _fin_contador_tiempo(“Tiempo de ejecución: “);
?>
Tiempo de ejecución: 0.00201916694641 segundos
Otra opción aunque gasta recursos de memoria:
<?php
$array= range( 1, 10000);
inicio_contador_tiempo();
foreach($array as $k => $v);
;
print _fin_contador_tiempo(“Tiempo de ejecución: “);
?>
Tiempo de ejecución: 0.00279021263123 segundos
Podemos comprobar que el primer script tiene un rendimiento peor porque cada iteración llama a count() de la longitud del array. En el segundo se salva en $b, el la solución más rápida porque normalmente un array no cambia de tamaño durante el bucle… El tercer script está a medias entre los dos anteriores en cuanto a tiempo de ejecución pero consume más memoria,sin embargo si el array no tiene índices numéricos es una buena opción para iterarlos.
Seguro que quedan muchas cosas en el tintero de los arrays…
Quien da más ,aporta tu granito de code-arena XD
* Las funciones usadas:
<?php
function inicio_contador_tiempo() {
global $t;
$t = time() + (float)microtime();
}
function _fin_contador_tiempo($s) {
global $t;
$e = time() + (float)microtime();
return $s.($e-$t).“ segundos<br/>“;
}
?>
Mención al que escribió el artículo original y me recordó recordar estas cosas tan importantes al resto de programadores de la comunidad para que luego no nos encontremos basuras sino programas elegantes,funcionales y sencillos de entender
[ http://cesarodas.com/2007/09/php-optimizing-the-use-of-arrays.html ]
Salu2 ó 3 jeje
Escrito el 01/November/2007 por pabloko
Hola, hoy os traigo algo simple pero que os va a evitar tener que escribir todas esas lineas de codigo tan pesadas.
Cuando queremos obtener parametros de un elemento, deberiamos poder saltarnos toda esa pesada escritura de lineas de codigo. Poniendo este codigo
function $(v) { return(document.getElementById(v)); }
para referirnos a elementos solo tendremos que poner $('id_elemento'). Ademas podemos usarlo del modo habitual para sobreescribir propiedades $('id_elemnto').align='center'
Ademas podemos crear otras definiciones que vallamos a usar
function $(v) { return(document.getElementById(v)); }
function $S(v) { return($(v).style); }
Ahora $S('id_elemento') se refiere a los parametros de estilo $S('id_elemento').display='none'
Asi dotaremos nuestra web de rapidez y sencillez
No useis esto si estais usando frameworks como MooTols o JQuery, ya que se produciria un conflicto
A liarla