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.
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
Enlaces rápidos (18-09-08)
Últimos enlaces rápidos
- PHP developer best practices
- Develop PHP applications with Picasa Web Albums
- jQuery.wysiwyg, enriquece tus textareas
- ¿Cómo será el futuro de los navegadores?
- IPPMooViewer: visor de imágenes Javascript
- Barcelona PHP Conference 2008
- 10 razones para usar Opera
- Online Compression Tool compares Packer, JSMin, Dojo, and YUI Compressor
- 10 principios para PHP
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.

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>
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
Enlaces rápidos (12-09-08)
Últimos enlaces rápidos:
- 75 Really Useful JavaScript Techniques
- Otra colección de scripts jQuery
- Working with jQuery, Part 1: Bringing desktop applications to the browser
- Top WordPress Plugins For Every Type of Blog – The Best of the Best!
- One-Click Upload – A jQuery Plugin
- Empezar un theme de WP desde cero
- jQuery Multi Level CSS Menu
- Crop de imagenes mediante Javascript
- Detectar Google Chrome en Javascript
- Warning: Google Chrome Browser Has Serious Memory & CPU Issues
- Primera vulnerabilidad de seguridad en Google Chrome
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.