php - remove - strip_tags()
Escribir aplicaciones PHP sin bloqueo. (5)
Quiero escribir aplicaciones no bloqueantes. Utilizo apache2, pero estaba leyendo sobre nginx y su ventaja con respecto a los procesos de apache. Estoy considerando cambiar apache para nginx. Mi pregunta es, ¿es posible escribir aplicaciones web sin bloqueo con php y nginx?
¿O es una mejor idea probar y hacer esto con python, utilizando algún proxy inverso como uwsgi o gunicorn con nginx? ¿O es la solución para aprender nodejs?
Escribir aplicaciones no bloqueantes en PHP es posible, pero probablemente no sea el mejor entorno para hacerlo, ya que no se creó teniendo eso en cuenta. Usted obtiene un control bastante decente sobre sus procesos secundarios utilizando la biblioteca de control de procesos PCNTL pero obviamente nunca le ofrecerá la misma facilidad de uso que otros entornos pueden brindarle!
No sé Python muy bien, pero personalmente te recomendé que vayas con nodejs ! Es una tecnología bastante nueva, eso es cierto, ¡pero todo no está bloqueado allí y está destinado a ser así! Básicamente, lo que tienes es un solo hilo (que puedes extender como quieras en esta versión de noticias) y, literalmente, todo (excepto que le dices que lo haga de otra manera) será impulsado por eventos, dejando espacio para continuar en la cola del proceso como ¡esperado!
Nodejs es realmente fácil de aprender, si alguna vez te topaste con aplicaciones web, ¡sabes que de todos modos javascript! Todavía no está muy documentado, pero hay muchos módulos listos para usar que puede descargar y usar de inmediato.
Por lo que yo sé, hay varias bibliotecas disponibles para crear aplicaciones no bloqueantes.
- Skyray, una biblioteca de redes para PHP escrita en C http://github.com/bixuehujin/skyray
- reactphp, como se mencionó anteriormente escrito en PHP puro
- swoole, https://github.com/swoole/swoole-src
- phpdaemon, https://github.com/kakserpom/phpdaemon
Por cierto: soy el autor de Skyray, y uno de los desarrolladores de swoole.
Si desea tener una aplicación sin bloqueo sin mucho esfuerzo, puede intentar usar el pushpin . Lo uso en una de mis aplicaciones y funciona muy bien. Puede encontrar más información en la publicación del blog del autor. Agregué esto sobre el proyecto existente, casi sin cambiar el código existente.
Si desea utilizar el nodo, asegúrese de que esta sea la herramienta adecuada para el trabajo. Verifique las preguntas de desbordamiento de pila, porque ya hay respuestas a esa pregunta. Pregúntese, si su idea de aplicación se ajusta a las capacidades del nodo. Prueba por qué y cuándo usar node js? y ¿Cómo decidir cuándo usar NodeJS? por ejemplo.
Todavía no he visto chincheta, pero estoy escribiendo esta respuesta para apuntar a otro marco que admite aplicaciones no bloqueantes en PHP:
Reaccionar http://reactphp.org/
Es compatible con la vinculación de un servidor a HTTP, o WebSocket, y puede utilizarse con software de servidor web como Nginx reenviando (utilizando proxy_pass) las solicitudes a través de HTTP. Incluso puede utilizar HTTPS en el servidor web y reenviarlo sin cifrar. (Falta soporte SSL en React.)
No parece haber soporte FastCGI o UWSGI todavía, al menos no en el proyecto ascendente.
El estilo es similar a la escritura de node.js, se adjuntan cierres de PHP 5.3+ a los eventos y se usan los sockets no bloqueantes de forma transparente debajo. Hay buenos ejemplos en ese sitio web, así que no los repetiré aquí porque no solicitó un caso de uso específicamente.
ACTUALIZADO: Acabo de ver el sitio web de chinchetas y no es un marco o herramienta para escribir aplicaciones PHP sin bloqueo como se solicita en el título de la pregunta. Sin embargo, parece que sería útil como parte de una solución.
https://github.com/swoole/swoole-src es una buena opción para escribir aplicaciones php sin bloqueo
Aquí hay un ejemplo:
$fp = stream_socket_client("tcp://127.0.0.1:80", $code, $msg, 3);
$http_request = "GET /index.html HTTP/1.1/r/n/r/n";
fwrite($fp, $http_request);
swoole_event_add($fp, function($fp){
echo fread($fp, 8192);
swoole_event_del($fp);
fclose($fp);
});
swoole_timer_after(2000, function() {
echo "2000ms timeout/n";
});
swoole_timer_tick(1000, function() {
echo "1000ms interval/n";
});