Conexiones en paralelo con cURL

Para aquellos que necesiten conexiones múltiples con cURL para acceder a varias web, este ejemplo es un buen comienzo:

<?php
// Create two cURL handlers
$ch1 = curl_init(); $ch2 = curl_init();
// Set options on both
curl_setopt($ch1, CURLOPT_URL, "http://example.com/");
curl_setopt($ch2, CURLOPT_URL, "http://example2.com/");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
$mh = curl_multi_init();
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
$running=null;
do {
curl_multi_exec($mh,$running);
} while ($running > 0);
$data1 = curl_multi_getcontent($ch1);
$data2 = curl_multi_getcontent($ch2);
curl_multi_remove_handle($ch1);
curl_multi_remove_handle($ch2);
curl_multi_close($mh);
?>

Se trata de usar en vez de curl_init usar curl_multi_init y sus funciones asociadas.

Parallel web scraping in PHP: cURL multi functions

Vía / dzone

SplObjectStorage: almacenar objetos únicos en PHP6

La librería SPL trae muchas cosas interesantes y que son un poco desconocidas. Pero en PHP6 traerá más novedades que pueden facilitarnos mucha la programación. En este caso se trata de SplObjectStorage, una clase que nos permitirá crear colecciones de datos únicos de forma muy sencilla, ya que si insertamos dos veces el mismo elemento, la segunda vez lo ignorará. A parte trabaja con los elementos como referencia, por lo que si modificamos el objeto una vez insertado, este será también modificado en la clase que guarda la colección de objetos.

Un ejemplo del mismo es el siguiente:

<?php
/**
*  Test class that we will store in the
*  SplObjectStorage object.
*/
class StorageTest {
private $title;
public function __construct( $title ) {
$this->title = $title;
}
public function __toString() {
return $this->title;
}
}
$storage = new SplObjectStorage();
$obj = new StorageTest( "www.eide.org" );
$storage->attach( $obj );
$storage->attach( $obj );
foreach( $storage as $o ) {
echo $o;
echo "\n";
}
?>

El resultado de esta ejecución solo nos devolverá un resultado.

SplObjectStorage

Detectar caras en imágenes mediante PHP

Excelente extensión para PHP que permite usar OpenCV (Open Source Computer Vision Library) para poder detectar caras en imágenes.
Por ahora dispone de dos funciones: face_count y face_detect, que proporcionan el número de caras encontradas y un array con las coordenadas de la cara. La verdad es que puede ser muy útil para todas las aplicaciones sociales que hay ahora.
Para instalarlo es necesario tener instalado: pkgconfig, libpng, zlib, libjpeg, libtiff y python.
PHP Facedetect Extension
Vía / PHPDeveloper.org

Integrar Google Calendar en nuestras aplicaicones PHP

Un completísimo tutorial de la gente de IBM que nos muestra paso a paso cómo integrar en nuestras aplicaciones PHP los calendarios de eventos de Google Calendar.

Se nos va a indicar cómo realizar las siguientes funcionalidades, explicándonos también el API de Google Calendar:

  • Recuperar eventos de una lista pública
  • Añadir más eventos
  • Modificar o borrar eventos
  • Buscar eventos por palabra clave o rango de fechas

Integrate your PHP application with Google Calendar

Comparativa de velocidades de frameworks PHP

Interesante estudio que muestra la velocidad de tres frameworks PHP (Cake PHP, CodeIgniter y Zend Framework).
Realiza diferentes pruebas: sin usar caché, usando caché propio, usando caché externo, acceso a BD, acceso mediante Active Records, … Los resultados demuestran que CodeIgniter es el más rápido y Cake PHP el más lento.
Es también destacable los datos sobre número de peticiones por segundo cuando se usa un framework a cuando se usa HTML estático. Por eso es recomendable realizar un caché para servir HTML estático.
El autor también realiza una comparativa de funcionalidades entre CodeIgniter y Zend Framework, aunque lo miraría con cuidado, porque dice que CI no admite internacionalización y no es cierto.
PHP framework comparison benchmarks

MemProxy: proxy con PHP y memcached

MemProxy es un script PHP sencillo pero potente, que nos permite tener un servidor proxy de peticiones web y cachea los contenidos en memcached. Tan solo es necesario PHP5.2, la extensión PECL para memcache, servidor web con capacidad de re-escritura y memcached.

En el siguiente ejemplo:

$backend_array = array(
"www.example.com" =>
array(
array("app1.example.com", 80),
array("app2.example.com", 80),
array("app3.example.com", 80),
),
"another.example.com" =>
array(
array("app1.example.com", 8080),
array("app2.example.com", 8080),
array("app3.example.com", 8080),
),
);

las claves de los arrays (www.example.com y another.example.com) son los host names de los sitios en los que se quiere hacer proxy. MemProxy usará el valor de HTTP_HOST para determinar la clave. Esto sería como un hosting virtual basado en nombres.

MemProxy

|

Script PHP para sincronizar estructuras de BD MySQL

Interesante script que permite dados dos estructuras del MySQL, obtenidas por ejemplo usando un mysqldump, ver que diferencias hay entre ambos y devuelve las queries necesarias para igualar las dos estrucuras.

Por ejemplo, si tenemos la estructura siguiente:

CREATE TABLE IF NOT EXISTS `archive` (
`id` int(11) NOT NULL auto_increment,
`topFile` varchar(255) NOT NULL default '',
`msgId` int(11) NOT NULL default '0',
`time` timestamp NOT NULL default CURRENT_TIMESTAMP,
`topTpl` varchar(255) NOT NULL default '',
`file` varchar(255) NOT NULL default '',
`template` varchar(255) NOT NULL default '',
`instanceKey` varchar(255) NOT NULL default '',
`orderby` varchar(25) NOT NULL default '',
PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=10256 ;

Y este otro:

CREATE TABLE IF NOT EXISTS `archive` (
`id` int(11) NOT NULL auto_increment,
`topFile` varchar(255) NOT NULL default '',
`msgId` int(11) NOT NULL default '0',
`time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
`topTpl` varchar(255) NOT NULL default '',
`file` varchar(255) NOT NULL default '',
`template` varchar(255) NOT NULL default '',
`instanceKey` varchar(255) NOT NULL default '',
`encoding` varchar(50) NOT NULL default '',
`orderby` varchar(255) NOT NULL default '',
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=10256 ;

Nos devolvería las siguientes sentencias:

ALTER TABLE `archive` ADD `encoding` varchar(50) NOT NULL;
ALTER TABLE `archive` MODIFY `orderby` varchar(255) NOT NULL;
ALTER TABLE `archive` MODIFY `time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP;
ALTER TABLE `archive` DROP PRIMARY KEY;

Un script bastante útil cuando, debido al despiste, tenemos diferencias entre la base de datos de desarrollo y la de producción y no sabemos qué cambios hemos realizado.

Database structure synchronizer

Usar Akismet en cualquier lugar con PHP

Librería para trabajar con Akismet en cualquier lugar usando PHP. Su uso es muy sencillo y nos permite identificar comentarios como spam.

Tiene 3 funciones básicas en modo estático:

// Comprueba si un comentario es spam
aksimet_check( $vars )
// Re-clasifica un comentario como spam
aksimet_spam( $vars )
// Re-clasifica un comentario como NO spam
aksimet_ham( $vars )

Dentro de la variable $vars se puede indicar: IP del usuario, User Agent, contenido del comentario, referrer, permaling, tipo de comentario, autor del comentario, email del autor del comentario y url del autor del comentario.

Quizás se pudiera usar para saber si una IP es spam o no en cualquier otro tipo de aplicaciones que no estén dirigidas a blogs.

Akismet para PHP

Vía / AskApache

Librería PHP para OpenId

OpenId es un sistema de identificación descentralizado que últimamente está dando mucho de que hablar, algunas veces para bien, y otras no tanto. Aún así, si necesitamos utilizar OpenId en nuestra aplicación, necesitaremos la librería PHP OpenID Library, la cual tiene las siguientes características:

  • Funciona desde PHP 4.3 hasta PHP 5.2.4
  • Licencia Apache Software License
  • Bien documentada, con ejemplos y casos de test
  • Usa CURL pero no depende de esta extensión
  • Incluye módulos para Attribute Exchange, Simple Registration y PAPE
  • Soporta i-names
  • Soporta los protocolos OpenID de forma transparente

PHP OpenID Library