2011-03-15 17 views
7

Resumen del problema: Pude acelerar el movimiento de las imágenes al cargarlas dramáticamente de lo que eran, a costa de usar concurrencia. Ahora necesito asegurar esa concurrencia contra una condición de carrera. Iba a tener los archivos normales de la encuesta de scripts dependientes para el estado del independiente, pero luego decidí que las tuberías con nombre serían mejores. Pipes para evitar el sondeo y nombrados porque no puedo obtener un PID del guión que los abre (ese es el que necesito usar para hablar con ellos).Tubos con nombre sin bloqueo

Así que cuando se carga una imagen, el cliente envía un POST a través de AJAX a un script que 1) guarda la imagen 2) genera un script paralelo (el independiente) para pasar la imagen y 3) devuelve JSON sobre la imagen el cliente. El cliente inmediatamente solicita la versión en miniatura, que esperamos tenga tiempo suficiente para prepararse mientras se envía la respuesta. Pero si no está listo, Apache mod_rewrite la ruta para apuntar a un segundo script (el dependiente), que espera a que se complete el proceso y luego devuelve los datos de la imagen.

esperaba que esto sea bastante sencillo, pero, mientras se prueba la secuencia de comandos independiente solo a través del terminal, me sale esto:

$ php -f thumb.php -- img=3g1pad.jpg 
successSegmentation fault 

La fuente está aquí: http://codepad.org/JP9wkuba Sospecho que me sale un error de segmentación, ya que FIFO Hice todavía está abierto y ahora huérfano. Pero lo necesito allí para ver el script dependiente, ¿verdad? ¿Y no se supone que es no bloqueante? Supongo que es porque el resto del script se puede ejecutar ... ¿pero no puede terminar? Este sería un trabajo para un archivo normal, como lo había pensado al principio, excepto si ambos están abiertos, no quiero ser un sondeo. Quiero sondear una vez como máximo y terminar con eso. ¿Solo necesito sondear e ignorar la fealdad?

+3

Me doy cuenta de que esto no responderá directamente a su pregunta, pero ¿por qué eligió esta * ruta increíblemente bizarra * en lugar de utilizar una [cola de trabajo/mensaje como Gearman] (http://gearman.org/)? – Charles

+0

@Charles: Hm, había oído hablar de eso, pero no sabía exactamente qué hacía. Pero realmente no necesito otra API para aprender en este momento. – Grault

+8

Los 2 a 4 métodos de los que deberá preocuparse son triviales de aprender en comparación con el esfuerzo necesario para desenterrar el crashtastic pipe qagmire en el que se ha encontrado. :) Gearman incluso le permite [enviar datos de estado de vuelta durante el procesamiento] (http://www.php.net/manual/en/gearmanjob.sendstatus.php), algo que parece tener un buen argumento aquí. (El envío de la información de estado de hecho aumenta significativamente la complejidad del proceso de recuperación del trabajo; va de disparar y olvidar/disparar y esperar a fire-and-loop-while-processing-flags.) – Charles

Respuesta

1

Debe eliminar los archivos FIFO creados y luego finalizar todos los scripts.