php - precio - the legend of zelda: a link between worlds descargar
¿Es sabio usar PHP para un demonio? (17)
Como otros han señalado, varias versiones de PHP tienen problemas con sus recolectores de basura. Por supuesto, si sabe que su versión no tiene tales problemas, elimine ese problema. El punto es que no sabe (a ciencia cierta) hasta que escriba el demonio y lo ejecute a través de valgrind para ver si el PHP instalado se filtra o no en una máquina determinada. Entonces, en esa mano, puede escribirlo solo para descubrir que lo que Zend cree que está arreglado podría tener errores, o está tratando con una versión un poco más antigua de PHP o alguna extensión. Icky.
El otro problema son las señales algo buggy. En mi experiencia, los manejadores de señales no siempre se ingresan correctamente con PHP, especialmente cuando la señal se pone en cola en lugar de fusionarse. Puede que no sea un problema para usted, es decir, si solo necesita manejar SIGINT / SIGUSR1 / SIGUSR2 / SIGHUP.
Por lo tanto, sugiero:
Si el demonio es simple, sigue adelante y usa PHP. Si parece que va a ser bastante complejo, o asignar mucha memoria, puede considerar escribirlo en C después de crear un prototipo en PHP.
Soy una persona C bastante dura morir. Sin embargo, no veo nada de malo en forjar algo rápido usando PHP (más allá de los casos que expliqué). Tampoco veo nada incorrecto en el uso de PHP para crear prototipos de algo que puede o no ser reescrito posteriormente en C. Por ejemplo, el manejo de la base de datos será mucho más sencillo si usa PHP, en lugar de administrar las devoluciones de llamada utilizando otras interfaces en C. esa instancia, para un ''one off'', seguramente lo hará mucho más rápido.
Deseo crear un proceso en segundo plano y me han dicho que generalmente están escritos en C o algo por el estilo. Recientemente descubrí que PHP se puede usar para crear un demonio y esperaba obtener algún consejo si debería usar PHP de esta manera.
Aquí están mis requisitos para un demonio.
- Compruebe continuamente si se ha agregado una fila a la tabla de la base de datos MySQL
- Ejecute los comandos FFmpeg en lo que se recuperó de la base de datos
- Insertar salida en la tabla MySQL
No estoy seguro de qué otra cosa puedo ofrecer para ayudar a tomar esta decisión. Solo para agregar, no he hecho C antes. Solo Java y PHP y scripts bash básicos.
¿Hace eso una gran diferencia de rendimiento?
Por favor, permita mi ignorancia, estoy aprendiendo! :)
Gracias a todos
Cron trabajo? Sí.
¿Demonio que corre para siempre? No.
PHP no tiene un recolector de basura (o al menos, la última vez que lo comprobé no lo tenía). Por lo tanto, si crea una referencia circular, NUNCA se limpia, al menos no hasta que finalice la ejecución del script principal. En el proceso del daemon esto es aproximadamente nunca.
Si han agregado un GC en las nuevas versiones, entonces sí puedes.
Ejecutándose como un trabajo cron con una periodicidad sensiblemente determinada, un script PHP puede hacer el trabajo, y la estabilidad de la producción es ciertamente alcanzable. Es posible que desee limitar el número de instancias FFMpeg simultáneas y asegurarse de tener un registro completo de aplicaciones y un manejo de excepciones. He implementado procesos de sondeo que se ejecutan continuamente en Java, así como el script de PHP cron de cada diez minutos, y ambos hacen el trabajo muy bien.
Es posible que desee considerar hacer un trigger mysql que ejecute un comando del system (es decir, FFmpeg) en lugar de un demonio. Si algún retraso no es un problema, también puede poner algo en cron que se ejecute cada pocos minutos para verificar. Cron sería mi elección, si es una opción.
Para responder a su pregunta, PHP está perfectamente bien para ejecutarse como un demonio. No tiene que hacerse en C.
Php no es mejor ni peor para este tipo de cosas que cualquiera de los otros lenguajes de scripting comunes. Tiene acceso bastante completo a todas las llamadas de sistema y utilidades de biblioteca que necesitaría para realizar este tipo de trabajo. Si se siente más cómodo usando PHP para scripting, php hará el trabajo por usted.
El único inconveniente es que PHP no es tan ubicuo como, por ejemplo, Perl o Python, que se instala en casi todos los sabores de Unix. Php solo se encuentra en sistemas que van a ofrecer contenido web dinámico. No es que un intérprete de Php sea demasiado grande o costoso de instalar también, pero si su mayor preocupación es llevar su programa a muchos sistemas, eso puede ser un pequeño obstáculo.
Por lo que has descrito, me gustaría ir con un demonio. Asegúrese de pegar un sueño en el bucle de sondeo, para no bombardear la base de datos cuando no haya nuevas tareas. Un cronjob funciona mejor para el flujo de trabajo / tipo de informe de trabajos, donde no hay algún evento en particular que active la siguiente ejecución.
Como se mencionó, PHP tiene algunos problemas con la administración de memoria. Debe asegurarse de probar su código para detectar pérdidas de memoria, ya que éstas se acumularían con el tiempo, en un script de larga ejecución. PHP no tiene recolección de basura real: se basa en el conteo de referencias, lo que significa que las referencias cíclicas causarán fugas. Si eres consciente de esto, puedes codificar alrededor de esto.
Seré contrario y te recomiendo que pruebes el demonio php. Aparentemente es el idioma que mejor sabes. Es probable que incorpore un temporizador en cualquier caso, por lo que puede duplicar la frecuencia de consulta en la base de datos. Realmente no hay penalización siempre y cuando no esté haciendo un ingenuo bucle en una consulta.
Si es algo que no se ejecuta con frecuencia, también puede ejecutar el php desde cron, lo que le permite a usted o al código vaciar la cola y luego morir.
Pero no tenga miedo de seguir con lo que mejor sabe, como una primera aproximación.
Trate de no usar los desencadenantes. Impondrán un acoplamiento innecesario, y no son divertidos de probar y depurar.
Si combinas las respuestas de Kent Fredric, tokenmacguy y Domster, obtienes algo útil.
PHP probablemente no sea bueno para largos tiempos de ejecución, así que mantengamos cada ciclo de ejecución corto y asegurémonos de que el sistema operativo se encargue de la limpieza de cualquier memoria. Como una herramienta para iniciar su script php cron puede ser una buena herramienta. Y si lo haces así, no hay mucha diferencia entre los idiomas.
Sin embargo, la pregunta sigue en pie. ¿Es php incluso capaz de ejecutarse como un demonio normal durante mucho tiempo (algunos años)? ¿O una variedad de hojas de memoria consumirán a todos tus carneros y matarán al sistema?
/ Johan
Si lo hace, preste atención a las fugas de memoria. PHP 5.2 tiene algunos problemas con su recolector de basura, de acuerdo con this (corregido en 5.3). Quizás es mejor usar cron, por lo que el script comienza a limpiar cada ejecución.
Si sabes lo que estás haciendo seguro. Necesitas entender bien tu sistema operativo. Por lo general, PHP no es adecuado para la mayoría de los demonios porque no está enlazado y no tiene un sistema decente basado en eventos para todas las tareas. Sin embargo, si se adapta a sus necesidades, entonces no hay problema. PHP moderno (5.3+) es realmente estable y no tiene ninguna pérdida de memoria. Siempre que habilite el GC y no implemente sus propias fugas de memoria, etc. estará bien.
Aquí están las estadísticas de un demonio que estoy ejecutando: tiempo de actividad 17 días (último reinicio debido a la actualización de PHP). bytes escritos: conexiones de 200 GB: cientos de conexiones manejadas, cientos de miles de artículos / solicitudes procesadas: millones
node.js es generalmente más adecuado aunque tiene algunas molestias menores. Se han realizado algunos intentos de mejorar PHP en las mismas áreas, pero en realidad no son tan buenos.
Un problema con la daemonización correcta de un script PHP es que PHP no tiene interfaces para las llamadas dup () o dup2 (), que son necesarias para separar los descriptores de archivos.
Un trabajo cron probablemente funcionaría bien, si no se requieren acciones casi instantáneas.
Estoy a punto de poner en funcionamiento, un sistema que he construido, basado en el daemon ''beanstalkd'' de la cola. Envío varios mensajes pequeños desde (en este caso, PHP) llamadas a la página web al demonio, y un script PHP luego los recoge de la cola y realiza varias tareas, como cambiar el tamaño de las imágenes o revisar las bases de datos (a menudo pasa información a través de un Memcache). tienda en linea).
Para evitar procesos de larga ejecución, lo envolví en un script BASH, que, dependiendo del valor devuelto por el script ("exit (1);"), reiniciará el script, por cada (digamos) 50 tareas que se realizan . Si se reinicia porque lo planeo, lo hará al instante, cualquier otro valor de salida (el valor predeterminado es 0, así que no lo uso) se detendría unos segundos antes de que se reiniciara.
Un trabajo cron y un poco de scripts de bash deben ser todo lo que necesita por los sonidos de este. Puedes hacer cosas como:
$file=`mysqlquery -h server < "select file from table;"`
ffmpeg $file -fps 50 output.a etc.
así que bash sería más fácil escribir, portar y mantener IMHO que usar PHP.
Ve a por ello. Tuve que hacerlo una vez también. Como han dicho otros, no es lo ideal, pero se logrará. Usando Windows, ¿verdad? Bueno.
Si solo lo necesitas para correr ocasionalmente (Una vez por hora, etc.). Crea un nuevo acceso directo a tu Firefox, colócalo en algún lugar relevante. Abra las propiedades del acceso directo, cambie "Destino" a:
"C:/Program Files/Mozilla Firefox/firefox.exe" http://localhost/path/to/script.php
Vaya a Panel de control> Tareas programadas Apunte su nueva tarea programada hacia el acceso directo.
Si lo necesita para ejecutarse constantemente o pseudo-constantemente, necesitará condimentar un poco el script.
Comience su guión con
set_time_limit(0);
ob_implicit_flush(true);
Si la secuencia de comandos utiliza un bucle (como while ), debe borrar el búfer:
$i=0;
while($i<sizeof($my_array)){
//do stuff
flush();
ob_clean();
sleep(17);
$i++;
}
Yo no lo recomendaría. PHP no está diseñado para la ejecución a largo plazo. Está diseñado principalmente con páginas de corta duración.
En mi experiencia, PHP puede tener problemas con la pérdida de memoria para algunas de las tareas más grandes.
Me sentiría inclinado a realizar esta tarea con un trabajo cron, en lugar de encuestar la base de datos en un demonio.
Es probable que su comando FFmpeg tarde un poco en hacerlo, ¿verdad? En ese caso, ¿es realmente necesario estar sondeando constantemente la base de datos? ¿No sería una manera más sencilla de lograr lo mismo un cronjob que se ejecuta cada minuto (o cada cinco, diez o veinte minutos)?
Si decide seguir la ruta del daemon, hay un excelente módulo PEAR llamado System_Daemon
que recientemente he usado con éxito en una instalación de PHP v5.3.0. Está documentado en el blog de los autores: http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php
Si tiene instalado PEAR, puede instalar este módulo usando:
pear install -f System_Daemon
También deberá crear un script de inicialización: /etc/init.d/<your_daemon_name>
Entonces tú puedes:
- Iniciar Daemon:
/etc/init.d/projNotifMailDaemon start
- Stop Daemon:
/etc/init.d/projNotifMailDaemon stop
Los registros se guardan en: /var/log/<your_daemon_name>.log