Zend, los creadores de PHP, han lanzado la versión 3 de su producto Zend Plataform, un servidor pensado para empresas ejecuten sus aplicaciones realizadas en PHP.
La nueva versión ofrece un clustering más robusto, una aplicación de monitorización que usa el protocolo SNMP para conectarse a otras aplicaciones. A parte incluye el software opensource Business Intelligence and Reporting Tools (BIRT) para la generación de informes.
Esto puede ser un paso para que las empresas usen PHP para la creación de sus aplicaciones, sustituyendo asà a Java u otros lenguajes. Zend bulks up PHP app server for business
Las caracterÃsticas que nos ofrece son las siguientes:
Ajax: facilita la inclusión de Ajax en nuestra aplicación.
Pencil: para poder actualizar el HTML de forma sencilla, ofrece una herramienta llamada Pencil, se trata de decir a Xaja donde es que se quiere escribir en el HTML.
DOM Mapping: para manipular desde PHP el DOM del HTML.
LiberÃa de etiquetas: para hacer más sencillo el desarrollo de los programadores.
Reverse Ajax: lo explicado anteriormente, que nos permite enviar datos al servidor.
Base de datos: una herramienta para acceder de forma sencilla a los datos.
La API de Google para acortar URLs permite acortar URLs, recuperar info del link original y las URLs acortadas de un usuario, aunque para usarlo se necesita crear una clave y dar de alta proyecto.
El resto es fácil, acceso mediante CURL y listo:
define('GOOGLE_API_KEY', '[insert your key here]');
define('GOOGLE_ENDPOINT', 'https://www.googleapis.com/urlshortener/v1');
function shortenUrl($longUrl)
{
// initialize the cURL connection
$ch = curl_init(
sprintf('%s/url?key=%s', GOOGLE_ENDPOINT, GOOGLE_API_KEY)
);
// tell cURL to return the data rather than outputting it
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// create the data to be encoded into JSON
$requestData = array(
'longUrl' => $longUrl
);
// change the request type to POST
curl_setopt($ch, CURLOPT_POST, true);
// set the form content type for JSON data
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/json'));
// set the post body to encoded JSON data
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($requestData));
// perform the request
$result = curl_exec($ch);
curl_close($ch);
// decode and return the JSON response
return json_decode($result, true);
}
$response = shortenUrl('http://phpriot.com');
echo sprintf(
'%s was shortened to %s',
$response['longUrl'],
$response['id']
);
Para mí, uno de los mayores fracasos de Twitter es su API, una limitación de su uso increíble para algo que le podría dar mucho juego a la aplicación. Ahora mismo no sé en cuánto está el límite, pero la posibilidad de realizar una aplicación basada en Twitter es una pesadilla.
Para aquellos que no quieran sufrir lo que hemos sufrido con TwitterPoster (los espacios en blanco es porque la gente actualiza su imagen y no podemos recuperar la de todos los usuarios por el límite en el API de Twitter), les recomiendo usar Twitter mediante CURL.
Os paso un script sencillito que he realizado:
<?php
// Primer hacemos login
$url ="https://twitter.com/sessions";
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
// Por si tienen limitación por navegador
curl_setopt($ch, curlOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)");
// Poned una ruta para las cookies
curl_setopt ($ch, CURLOPT_COOKIEJAR, '/temp/');
curl_setopt ($ch, CURLOPT_COOKIEFILE, '/temp/');
curl_setopt ($ch, CURLOPT_POSTFIELDS, "username_or_email=[usuario]&password=[contraseña]");
// Para que funcione el https
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, curlOPT_SSL_VERIFYHOST, 2);
curl_exec ($ch);
// Cargamos el home, porque Twitter añade dos campos ocultos para poder publicar por web
$url ="http://twitter.com/home";
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec ($ch);
// Recuperamos los campos ocultos
preg_match('//', $result, $match);
$authenticity_token = $match[1];
preg_match('//', $result, $match);
$siv = $match[1];
// Insertamos el texto
$res = $url ="http://twitter.com/status/update";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_POSTFIELDS, 'siv='.$siv.'&authenticity_token='.$auth.'&status=[texto]');
curl_exec ($ch);
curl_close ($ch);
unset($ch);
?>
¿Qué fallo tiene este script? pues que si cambian el HTML (campos de formulario, …) o las URLs deja de funcionar, pero al menos no tenemos limitaciones. Eso sí, es más costoso para sus servidores y para los nuestros, porque en vez de hacer una llamada, hacemos 3, y en nuestro caso, a parte parseamos una página para obtener dos campos ocultos.
Cuando tienes una aplicación web, los procesos cron son muy útiles para automatizar tareas de todo tipo: mantenimiento, background, … El problema que nos podemos encontrar es cuando el tiempo que tarda en ejecutarse un cron supera el tiempo de espera entre ejecuciones, con lo que nos encontramos con dos cron ejecutándose en el mismo momento, pudiendo repercutir negativamente en la propia tarea del cron.
Para evitar esta situación, el script al que hago referencia nos va a venir muy bien, porque añade bloqueos al cron para evitar que dos procesos se ejecuten. Una solución sencilla es crear un fichero, y si el fichero existe, pues no ejecutar el cron. El problema que tiene esto es que si el cron termina abruptamente, el fichero seguirá existiendo por no haberse borrado y el resto de procesos cron no se ejecutarán.
El autor en este script añade la posibilidad de saber si el cron sigue ejecutándose o se terminó incorrectamente, para lo cual en el fichero de bloqueo guarda el PID del proceso cron que lo crea y comprueba si el PID sigue existiendo. Este script sólo es útil en entornos linux.
Interesante script que nos permite cargar paquetes al estilo Java desde PHP. Aunque ya existen los phar, que es un paquete de PHP, esto puede resultar una posibilidad o al menos un método a tener en cuenta para importar varios archivos simultáneamente.
read()))
{
/* Reject parent, current directories and sub directories */
if(($file == '.') ||
($file == '..') ||
(is_dir($d->path . "/" . $file)))
{
continue;
}
require_once($basePath . $importFilePath . "/" . $file);
}
} else {
/* If a single file is specified */
$importFile = str_replace(".", "/", $classPath) . ".php";
require_once($basePath . $importFile);
}
}
?>