10 cosas que probablemente no sepas de PHP

Cuando aprendemos un lenguaje (en este caso PHP) de forma autodidacta o parcialmente (un curso en la empresa), hay veces que usamos lo que conocemos porque con eso nos basta, pero no profundizamos más y nos encontramos con que hay cosas que desconocemos y que nos serían de utilidad. Por eso, el artículo que paso a traducir, nos puede ser de gran ayuda.

  • Usa ip2long() y long2ip() para guardar/recuperar las direcciones IP en la base de datos en vez de un string. Un string de 15 posiciones ocupa más espacio, cuanto menos llenemos la BD mejor que mejor.
  • Valida parcialmente la dirección de email con la función checkdnsrr(). Esta función comprueba que el dominio se corresponde a una dirección IP, así evitamos que se hayan enviado direcciones de correo con servidores erróneos. En el caso de que la validación de la existencia del email sea necesario.
  • Si usas PHP5 utiliza las funciones para acceso a MySQL mysqli_* en lugar de mysql_*, ya que están optimizadas.
  • Aprende lo que te ofrece el operador ternario (?:), te facilitará mucho el desarrollo y la comprensión del código una vez creado.
  • No reinventes la rueda, antes de meterte a hacer lo que ya está hecho, mira si existe en las librerías PEAR.
  • Usa highlight_file() cuando quieras formatear un texto como código PHP.
  • Deshabilita los logs de errores con error_reporting(0), a parte de ganar en rendimiento, evitas mostrar querys o paths de scripts. Yo personalmente recomendaría que te crearas un buen gestor de errores.
  • Usa gzcompress() y gzuncompress() para comprimir strings grandes para que no ocupen demasiado tamaño en la BD, por ejemplo en un campo BLOB.
  • Usa parámetros por referencia (&$param) para poder conseguir que la función te devuelva más valores a parte de que devuelve return.
  • Intenta comprender completamente las “magic quotes” para evitar que te ataquen mediante SQL Injection.

10 things you (probably) didn’t know about PHP.

Vía / dzone

Mejora el rendimiento de PHP

Unos consejos interesantes sobre cómo mejorar el rendimiento de tus páginas cuando usas PHP.

  • Caché de objetos: cada vez que llamas a una página se llama al compilador y se vuelve a procesar, aunque no haya cambiado. Si se cachean los objetos de PHP (parecido a lo que ocurre con JSP), la primera vez se compilaría y la siguiente se usaría la compilada. Una herramienta gratuita que nos permite realizarlo es Turck MMCache for PHP
  • Sistema de plantillas: se trata de una caché de contenido. Es útil cuando existe datos estáticos que se muestran más de una vez y no se quiere que se recargue. Los sistemas de caché también proveen una separación entre código y HTML, que no solo mejorará el rendimiento, sino que además hará más sencilla una futura actualización. La mayoría de los sistemas de plantillas para PHP está disponibles aquí: Smarty Templates, Pear Templates y PHP savant.
  • Sistema distribuido de caché de objetos: se trata de tener la mayoría de la BD en memoria, usando para ello memcached. Claro, que esto realmente puede ser poco útil en sitios que no tengan un elevado número de visitas.
  • Variables de PHP que se deben usar:
    variables_order = ‘GPC’
    register_argc_argv = ‘Off’
    register_globals = ‘Off’ (también útil para temas de seguridad)
    always_populate_raw_post_data = ‘Off’
    magic_quotes_gpc = ‘Off’
    A parte de desactivar los logs de errores, consumen tiempo y recursos y a parte si tienes un error no muestras información que quizás no quieras.
  • Comprensión de salida: mediante PHP, comprimimos la salida usando el formato zip. En esta posibilidad no estoy del todo de acuerdo, porque los recursos que se utilizan en la compresión pueden ser superiores a los que se usan para enviar la página, como ya indicamos en otra ocasión.

Fast PHP

Vía / dzone

Obtener información de páginas remotas con PHP

En ciertos momentos nos puede ser útil obtener información de páginas remotas, por ejemplo si tenemos un listado de páginas favoritas, pues obtener las palabras clave que tengan en el metatag, para poder clasificarlas con tags propias.

El proceso es sencillo mediante PHP, el problema es que algunos servidores, creo que pasa con DreamHost, no permiten el abrir ficheros de forma remota.

Primero debemos leer el fichero:

$url = "http://www.pagina.com/";
$fp = fopen( $url, 'r' );
$cont = "";
while( !feof( $fp ) ) {
$buffer = trim( fgets( $fp, 4096 ) );
$content .= $buffer;
}

Después podemos mirar cual es el título de la página:

$start = '<title>';
$end = '<\/title>';
preg_match( "/$start(.*)$end/s", $content, $match );
$title = $match[1]; 

Y por último obtener las metatags, usando para ello la función de PHP get_meta_tags, lo cual nos facilita el trabajo:

$metatagarray = get_meta_tags( $url );
$keywords = $metatagarray[ "keywords" ];
$description = $metatagarray[ "description" ];

Puedes verlo con una explicación más extensa en el artículo original.

Get Remote Web Page Information Using PHP

| | |

Laboratorio: acceder a contenido dinámico de forma estática (caché)

La verdad es que el título puede ser un tanto difícil de entender. Pero explicando que es lo que quiero decir, supongo que será fácil de entender. En este caso se trata totalmente de “laboratorio”, ya que es una idea que se me ha ocurrido y que su implementación puede que no se pueda necesitar, ya que se trataría de un ejemplo muy a la medida. Aunque bien pensado, se trata de una caché.

El problema de acceder a contenido dinámico (sobre todo pasa en Java) es sobrecargar el acceso a un mismo script (o JSP), a parte de que el acceso a contenido estático es mucho más rápido que el acceso a un contenido dinámico. El problema es cuando queremos acceder a contenido dinámico de forma estática.

Imaginemos un mapa tipo Google Maps, tenemos la Tierra totalmente vectorizada y dividimos el mapa en cuadrículas (x e y). Para acceder a una imagen queremos que sea de forma estática para agilizar la carga de la página y no sobrecargar el servidor, pero la imágen no se puede cargar porque no existe, se tiene que crear dinámicamente.

¿Cual es la solución?, controlar la página de error 404, para que cuando no exista la imagen que deseamos la cree y así la próxima vez ya podamos acceder a ella de forma estática.

Para ello tendremos que modificar el fichero .htaccess para que cuando no encuentre la imagen la cree y la devuelva.

ErrorDocument 404 /sentidoweb/imagenes-estaticas/createimage.php

Y tendremos que crear un script PHP para que cree la imagen y la devuelva. En este caso hemos añadido unas condiciones, y es que la imagen tiene que ser png y que tiene que tener el nombre con el siguiente formato (en expresión regular): /\d{1,2}_\d{1,2}\.png/ .

<?php
$url = $_SERVER["REQUEST_URI"];
// Si es una imagen PNG
if (preg_match("/\.png$/", $url)) {
$nombreImagen = substr($url, strrpos($url, "/")+1);
// Si el nombre de la imagen tiene el formato que deseo
if (preg_match("/^\d{1,2}_\d{1,2}\.png$/", $nombreImagen)) {
// Obtengo que imagen tengo que crear
$aux = substr($nombreImagen, 0, strlen($nombreImagen)-4);
$coords = split("_", $aux);
// Creo la imagen
header("Content-type: image/png");
$img = imagecreate(50, 50);
$cFondo = imagecolorallocate($img, 0, 133, 133);
$cTexto = imagecolorallocate($img, 255, 255, 255);
imagestring($img, 1, 5, 5,  '['.$coords[0].', '.$coords[1].']', $cTexto);
imagepng($img, $nombreImagen);
imagepng($img);
}
}
?>

Está claro que esto no funcionaría para nada si el contenido dinámico se actualiza con frecuencia.

|

Métodos mágicos en PHP 5

Ya he comentado alguna vez el peligro de no estar a la última de las novedades que salen en un lenguaje de programación. En este caso voy a hablar de PHP5. La nueva versión nos ofrece una serie de métodos que el autor define como “mágicos”, supongo que por el hecho de que nos pueden dar una funcionalidad un tanto especial.

  • __construct: se utiliza para la construcción de objetos, logicamente este si es conocido si te has informado sobre las novedades de PHP5 referente a objetos.
  • __toString: controla lo que devuelve el objeto cuando se transforma en una cadena de texto, por ejemplo cuando hacemos un echo. Puede sernos muy util sobre todo para las trazas.
  • __clone: muy usado en Java, nos permite controlar la clonación de un objeto. Aunque no lo parezca, puede ser muy útil.
  • __set_state: devuelve la llamada a la función var_export(), así cuando queremos exportar un objeto, devolvemos el código PHP válido que deseamos. En esta es en la función que más se detiene el autor del artículo y merece la pena echarle un vistazo a fondo.

The Magic __set_state Method

Vía / Good PHP Tutorials

| | |

Laboratorio: búsqueda y reemplazo masivo en ficheros

Debido a la compra de Ideasapiens.com y para no perder el contenido actual, Jose Luis Antunez ha querido migrarlo a ideasapiens.blogsmedia.com.

El problema que se encontró fue tener que editar del código fuente de cada documento web la secuencia de texto www.ideasapiens.com a ideasapiens.blogsmedia.com. De esa forma los enlaces apuntarían al subdominio y accesos internos correspondientes donde ahora se alojarán los contenidos.

Para realizar esa búsqueda y reemplazo masivo, antes de pensar en alguna aplicación de escritorio que lo realizara, pensamos en un script para la shell de Linux que con una simple línea se pudiera hacer. Bueno, tan simple no nos resultó y gracias a la ayuda de Dani lo pudimos sacar (teníamos la shell un tanto oxidada).

find . -type f -name "*.php" -exec sed -i s/www\.ideasapiens\.com/ideasapiens\.blogsmedia\.com/g {} \;

Viendo las complicaciones que estábamos teniendo con la shell (por una tontería, dicha sea la verdad), Gabriel nos pasó el siguiente PHP, obteniendo el mismo resultado.

Read More “Laboratorio: búsqueda y reemplazo masivo en ficheros”

Qcodo: otro framework de PHP

qcodo.pngYa hemos hablado en otras ocasiones sobre frameworks para PHP. La lista va aumentando e intentaremos comentaros los nuevos frameworks que vayan apareciendo.
En este caso se trata de Qcodo, cuya más importante característica es que ahorrará tiempo al desarrollador mediante el uso de la tecnología ActiveRecord, la cual generará código para la utilización de la BD automáticamente. Para ello se conectará a la BD y mediante ingeniería inversa generará el código necesario para usar la BD.
La verdad es que en las presentaciónes y demostraciones podemos ver cosas que hacen que este framework sea muy llamativo y nos haga cómodo el desarrollo.
Qcodo
Vía / Download Squad

|

Video tutoriales de PHP

phpvideotutorials.pngLa idea es muy buena, el trabajo que debe llevar es bastante. Se trata de video-tutoriales sobre PHP, que nos van explicando desde como instalar WAMP a las partes básicas del PHP.
Por ahora solo hay 8 lecciones pero parece que se van ampliando poco a poco. Si te asusta el inglés, no te preocupes que se entiende bastante bien, salvo la parte inicial en la que le da por contarte su vida, algún chiste o una historia de un pollo en bikini (si, increible).
PHP Video Tutorials
Vía / dzone

| |

Selecciona tu hoja de estilos mediante PHP

En 456 Berea Street nos muestran una forma muy interesante para poder mostrar tu página con diferentes hojas de estilo. Tiene el inconveniente de que solo admite dos estilos entre los que elegir.

Funciona aunque el javascript esté desactivado, pero no cuando estan desactivadas las cookies, pero no daría error, tan solo visitaríamos siempre la misma página.

El funcionamiento es sencillo, disponemos de dos directorios, cada cual con las hojas de estilo que nos interesa. Habrá un enlace a una página que cuando accedemos a ella nos cambiará de directorio, guardará el valor en una cookie y nos devolverá a la página a la página desde la que hemos hecho la llamada o a la raíz si no existía esa página. Y luego en cada página deberemos obtener el valor del directorio de las cookies y usarlo para recuperar la hoja de estilo correspondiente.

El script que se encarga de cambiar de directorio es el siguiente:

<?php
$layout = (isset($_COOKIE['layout']) && ($_COOKIE['layout'] == "zoom")) ? "main" : "zoom";
setcookie("layout", $layout, time()+31536000, '/');
$ref = (isset($_SERVER['HTTP_REFERER'])) ? $_SERVER['HTTP_REFERER'] : "http://{$_SERVER['SERVER_NAME']}/";
header("Location: $ref");
?>

Y luego en cada página tendremos que incluir lo siguiente:

Para recuperar el directorio.

$layout = (isset($_COOKIE['layout']) && ($_COOKIE['layout'] == "zoom")) ? "zoom" : "main";

Para seleccionar el estilo correcto.

<style type="text/css" media="screen,projection">
@import '/css/<?php echo $layout; ?>.css';
</style>

Build your own PHP style sheet switcher

| |

Crea tu motor de búsqueda con Google y PHP

google.pngAlgunas veces nos podemos encontrar con la necesidad de incluir un motor de búsquedas en nuestra aplicación web, no me refiero a uno interno, sino a uno que busque dentro de todo Internet.

Normalmente se soluciona mediante un formulario que llama a la página de Google, pero eso puede ser un tanto “feo” y no ser exáctamente lo que buscamos.

Si lo que quieres es un script que llame al API de Google para poder recibir las resultados de una búsqueda a Google y luego mostrarla, verás como se hace en la traducción que hacemos del siguiente artículo.

Read More “Crea tu motor de búsqueda con Google y PHP”