Programación en paralelo con PHP

Realizar algunas tareas puede ser algo lento, por lo que a veces es necesario ejecutar procesos en paralelo para agilizar la ejecución de un script. PHP no permite programación concurrente, por lo cual hay que simularlo, y para ello es necesario la utilización de sockets.

El método es sencillo, se crean dos sockets y se comprueba que hayan acabado de ejecutarse:

// Ejecuta un proceso en un socket
function JobStartAsync($server, $url, $port=80,$conn_timeout=30, $rw_timeout=86400) {
$errno = '';
$errstr = '';
set_time_limit(0);
$fp = fsockopen($server, $port, $errno, $errstr, $conn_timeout);
if (!$fp) {
echo "$errstr ($errno)
\n"; return false; } $out = "GET $url HTTP/1.1\r\n"; $out .= "Host: $server\r\n"; $out .= "Connection: Close\r\n\r\n"; stream_set_blocking($fp, false); stream_set_timeout($fp, $rw_timeout); fwrite($fp, $out); return $fp; } // Devuelve falso si el socket está desconectado o un string (que puede ser vacio) si está conectado function JobPollAsync(&$fp) { if ($fp === false) return false; if (feof($fp)) { fclose($fp); $fp = false; return false; } return fread($fp, 10000); } // Ejecución inicial // Se ejecutan dos procesos cualquiera j1 y j2 $fp1 = JobStartAsync('localhost','/jobs/j1.php'); $fp2 = JobStartAsync('localhost','/jobs/j2.php'); while (true) { sleep(1); $r1 = JobPollAsync($fp1); $r2 = JobPollAsync($fp2); if ($r1 === false && $r2 === false) break; echo "r1 = $r1
"; echo "r2 = $r2
"; flush(); @ob_flush(); } echo "

Jobs Complete

";

El autor profundiza algo más y comenta también cómo se resolvería el método divide y vencerás.

Siempre hay que tener cuidado cuando se programa en paralelo ya que podemos tener problemas al acceder simultáneamente a un recurso compartido.

Easy Parallel Processing in PHP

Backgrounds animados con jQuery

Interesante script para jQuery que usa el plugin para modificar la posición del background y que nos permite hacer efectos con el background similares a los que se suelen hacer con Flash.

Mediante un fondo de mayor tamaño que el elemento y con una forma irregular (esquinas, ondas, degradado, …) se trata de que al mover el fondo, el efecto que se produzca sea el de una animación.

El script sería algo así:

$('#nav a')
.css( {backgroundPosition: "0 0"} )
.mouseover(function(){
$(this).stop().animate(
{backgroundPosition:"(0 -250px)"},
{duration:500})
})
.mouseout(function(){
$(this).stop().animate(
{backgroundPosition:"(0 0)"},
{duration:500})
})

Using jQuery for Background Image Animations

Vía / Script & Styles

mylvmbackup: copias de seguridad para MySQL

Ya hace tiempo hablé de mylvnbackup como utilidad para realizar copias de seguridad de MySQL cuando se trataba de entorno Linux. Esta vez hablaré con un poco más de profundidad aprovechando que acaban de lanzar la versión 0.10 de esta aplicación.
Esta aplicación bloqueará para lectura todas las tablas y vaciará el caché de disco del servidor, creando un snapshot del directorio de datos de MySQL, desbloqueando las tablas de nuevo. El snapshot toma poto tiempo y cuando se ha realizado el servidor puede continuar funcionando normalmente mientras que el fichero actual de backup continúa.
El snapshot se monta en un directorio temporal y se comprime usando el comando tar, con un formato de fichero así: YYYYMMDD_hhmmss_mysql.tar.gz.
mylvmbackup

Problemas con los comentarios

He estado teniendo problemas con el SPAM y DreamHost me ha dado un toque de atención (y renombrado la tabla de comentarios) porque se les saturaba el sistema.
Estoy migrando a WordPress, pero la falta de tiempo no me ha dejado acabar el diseño, así que por ahora tengo que cerrar los comentarios para que los de DreamHost no se pongan muy pesados (con razón).
Espero poder abrirlos cuanto antes.

Bluff: gráficas mediante Javascript

Bluff es un script que nos permite realizar gráficas de forma sencilla en Javascript. Es necesario incluir la librería JS.Class para que simule canvas en IE.

canvas.png

Crear gráficas es muy sencillo y solo deberemos incluir un script parecido a este:

<canvas id="example"></canvas>
<script type="text/javascript">
var g = new Bluff.Line('example', 400);
g.theme_37signals();
g.title = 'My Graph';
g.data('Apples', [1, 2, 3, 4, 4, 3]);
g.data('Oranges', [4, 8, 7, 9, 8, 9]);
g.data('Watermelon', [2, 3, 1, 5, 6, 8]);
g.data('Peaches', [9, 9, 10, 8, 7, 9]);
g.labels = {0: '2003', 2: '2004', 4: '2005'};
g.draw();
</script>

Bluff

API de CSSMania

Ayer Gabriel publicó la API para CSSMania, la cual nos ofrece información sobre los diseños web que se pueden encontrar en CSSMania.

Con una simple llamada:

http://cssmania.com/api/api.php?search=xxxxxxxxxxxxx

obtenemos en formato JSON los datos sobre:

  • id: el id de la web
  • url: URL de la web
  • developed: desarrollador del diseño
  • country: país del desarrollador
  • rating: puntuación actual
  • totalscore: suma total de votos
  • numbervotes: número de votos
  • colours_0…5: 5 colores más usados en formato HEX
  • url_screenshot: URL del screenshot en el servidor de CSSMania
  • time_created: fecha de inclusión en CSSMania
  • last_screenshot_version: fecha de última modificación

CSSMania API

Enlaces rápidos (12-09-08)

Últimos enlaces rápidos:

Columnas virtuales en MySQL

MySQL está trabajando en un tipo nuevo de columnas las cuales pueden resultar muy útiles. Se trata de columnas virtuales, las cuales tienen un valor automático dependiente de una función.

Con un ejemplo se puede entender mejor:

create table t1 (
a enum('A','B','C'),
b int,
c virtual int as (if(a<>'A',null,b)) stored unique);

Como se puede ver, el campo c tendrá valor null si el campo a es distinto de ‘A’ y el valor del campo b en el resto de los casos.

¿Qué nos puede aportar esto?, pues mayor velocidad en queries que usen índices funcionales, simplicidad en queries usadas con frecuencia y el uso de índices basados en funciones.

También se podría hacer mediante el uso de triggers, pero si el dato se actualiza, este permanerá igual con triggers y cambiará automáticamente con el uso de las columnas virtuales. También se podrían usar vistas, pero es menos eficiente ya que se crean más objetos usando vistas.

Existen algunas restricciones como que solo se puede usar en MyISAM y InnoDB, pero aún así, estoy deseando poder echar mano a este tipo de columnas.

MySQL virtual columns preview