Red de conocimiento informático - Material del sitio web - Cómo utilizar PHP para crear un servicio back-end tipo bala de alto rendimiento

Cómo utilizar PHP para crear un servicio back-end tipo bala de alto rendimiento

Con la popularidad de WEB2.0, muchos sitios web ahora utilizan la forma de "aluvión" para lograr la interacción.

Barrage, una palabra popular china, originalmente significaba proporcionar un bombardeo intensivo con una cantidad grande o pequeña de artillería. El fenómeno de una gran cantidad de comentarios mostrados en forma de ventanas emergentes de subtítulos (dàn) flotando en la pantalla al mismo tiempo también se llama bombardeo.

Como PHPers, ahora vemos un bombardeo genial en varios sitios web. ¿También queremos agregar la función de bombardeo a nuestros propios sitios web?

En primer lugar, el backend del bombardeo es en realidad muy similar al principio del backend de la sala de chat pública. Un cliente envía un mensaje al servidor y el servidor transmite el mensaje recibido. a otros clientes. Casi no hay diferencia entre ellos en cuanto a la parte trasera, la diferencia está en la parte delantera.

Afortunadamente, tenemos un complemento de bombardeo frontal, que es un complemento jquery, dirección de github: tl, posix, sysvmsg y otras extensiones. PHP solo necesita instalar la extensión más básica, lo que significa que no podemos usar esta extensión en Windows (de hecho, podemos usar swoole en win con la ayuda de cygwin, pero considerando que usamos la extensión swoole para mejorar el rendimiento y familiarizarnos). con futuros procesos de producción Para prepararse para la implementación, se recomienda encarecidamente desarrollar en Linux), luego transfiramos el entorno de desarrollo a Linux.

Luego también se requiere que la versión del kernel de Linux sea 2.3.32 o superior y PHP sea 5.3.10 o superior. Luego usaremos el último CentOS. El php instalado por esta versión de yum es directamente. La última versión de PHP7 no es necesaria. Considere otras cuestiones. Por supuesto, si le gusta la interfaz gráfica, puede usar Ubuntu. Básicamente, otras distribuciones de Linux más recientes cumplen con los requisitos de versión.

Luego instalaremos esta extensión. Se recomienda usar PECL para instalarla. Solo necesita un swoole de instalación de pecl

, lo cual es muy conveniente. Por supuesto, debe compilar e instalar para conocer los pasos específicos, consulte /wiki/page/6.html. Después de instalar la extensión, ingrese php -m en la línea de comando para verificar. la instalación es exitosa.

Entonces comienza oficialmente nuestro viaje de codificación.

Antes de comenzar el viaje de codificación, echemos un vistazo a cómo se ve el prototipo de efecto más básico. Sí, se ve así. Los dos navegadores usaron Websocket para conectarse al servidor de forma completamente independiente. En el servidor, estos dos Un navegador equivale a dos clientes en máquinas completamente diferentes.

Después de ver el efecto, comencemos a hablar del código.

Primero echemos un vistazo al código de muestra del servidor WebSocket en el sitio web oficial.

$serv = new Swoole\Websocket\Server("127.0.0.1", 9502" $serv-gt; on('Open', function($server, $req) {echo "conexión abierta : ".$req-gt; fd;

});

$serv-gt; on('Mensaje', función($servidor, $frame) {echo "mensaje : ".$frame-gt;data;

$server-gt;push($frame-gt;fd, json_encode(["hola", "mundo"]));}); p>

$serv-gt;on('Close', function($server, $fd) {echo "cierre de conexión: ".$fd;

});

$serv-gt;start();

Vemos que la primera línea de este código crea primero un nuevo objeto de servidor WebSocket y el primer parámetro en el método de construcción especifica la IP de monitoreo del servidor. , el segundo parámetro especifica el puerto en el que escucha el servidor. Luego use el método on para configurar una función de devolución de llamada para cada evento, y la última línea del método de inicio comienza oficialmente a ejecutar el servidor.

Este método de escritura es muy similar a la llamada asincrónica en Javascript. Esta es también la función sin bloqueo asincrónica basada en eventos en Swoole. Debido a esta función, cada evento independiente (solicitud) se recibirá. el lado del servidor Después de eso, se procesan de forma asincrónica y no necesitan esperarse entre sí. Esta es también la razón por la que Swoole tiene un alto rendimiento.

Analicemos el significado de cada evento por separado.

$serv-gt;on('Open', function($server, $req) {echo "conexión abierta: ".$req-gt;fd;

}) ;

Como sugiere el nombre, Abrir significa abrir un nuevo enlace y, después de que se activa el evento, se repite la ID del cliente del servidor conectado. La ID única del cliente es el campo fd en el segundo parámetro de. la función de devolución de llamada. Esta es también la identificación única utilizada por el servidor para distinguir a los clientes.

$serv-gt;on('Mensaje', función($servidor, $frame) {echo "mensaje: ".$frame-gt;data;

$servidor- gt; push($frame-gt; fd, json_encode(["hello", "world"]) });

Como sugiere el nombre, Message representa el evento en el que el mensaje llega al servidor. y se activa cuando ocurre el evento. Después de eso, echo envía los datos al servidor, que es el campo de datos del segundo parámetro de la función de devolución de llamada. Además, también vemos que llama a $server-gt;push, que es el método push en el primer parámetro de la función de devolución de llamada. Es un método para que el servidor envíe datos al cliente. a enviar. ID del cliente, el segundo son los datos a enviar, el significado aquí es enviar la matriz ["hola", "mundo"] al cliente que envió el mensaje al servidor (la matriz escrita en cuadrado). brackets es la nueva versión de PHP5.4 Características, si es PHP5.3, utilice la función tradicional de fábrica de matrices para generar datos de matriz después de la serialización json.

$serv-gt;on('Close', function($server, $fd) {echo "cierre de conexión: ".$fd;

});

El último evento Cerrar es más fácil de entender. Es un evento de cierre. Por supuesto, no es el servidor el que se cierra, sino el cliente. Puede entenderse como un evento en el que el cliente se desconecta del servidor. . El significado del código en la función de devolución de llamada es hacer eco de la ID del cliente que está desconectado del servidor.

Ahora que la API básica está clara, miremos el código, que solo tiene veinte líneas.

/cw1997/danmu-demo/blob/master/server.php$server = new swoole_websocket_server("0.0.0.0", 1997);$server-gt;on('open', function (swoole_websocket_server $servidor, $request) {echo "servidor: protocolo de enlace exitoso con fd{$request-gt; fd}\n"; //$request-gt; id del cliente}); server-gt; on('mensaje', función (swoole_websocket_server $servidor, $frame) {echo "recibir de {$frame-gt; fd}: {$frame-gt; datos}, código de operación: {$frame-gt; opcode}, fin: {$frame-gt;finish}\n"; //$frame-gt; fd es la identificación del cliente, $frame-gt; data son los datos enviados por el cliente //El servidor los envía a los datos del cliente se generan usando $server-gt; push('client id', 'content')$data = $frame-gt;data;

foreach($server-gt;connections as $fd ){

$server-gt; push($fd, $data) //Transmisión en bucle

}

});

$servidor-gt; on('cerrar', función ($ser, $fd) {echo "cliente {$fd} cerrado\n";

}); >$ server-gt; start();

El código de transmisión principal aquí en realidad utiliza un miembro que no se ha mencionado antes, que es el miembro de conexiones del objeto swoole_websocket_server. Este miembro guarda todas las conexiones. fd del servidor WebSocket, que es la identificación del cliente. Por lo tanto, solo necesitamos usar foreach en el evento del mensaje para atravesar el miembro y realizar un bucle para enviar todos los mensajes de bombardeo recibidos por el servidor a otros clientes conectados al servidor.

Ahora que hemos terminado de hablar del back-end, hablemos del front-end.

No hay mucho código de interfaz/cw1997/danmu-demo/blob/master/index.htmlvar ws = new WebSocket("ws://192.168.1.107:1997"); .onopen = function(){

console.log("Apretón de manos exitoso");

ws.send('¡¡¡hola mundo!!!');

};

p>

ws.onmessage = function(e){

console.log("mensaje:" e.data);

var tiempo = jQuery('#danmu' ).data("nowtime") 1; var text_obj = '{ "text": "' e.data '", "color": "verde", "tamaño": " 1", "position": "0" , "time": "' time '", "isnew": " "}'; //Construye un objeto danmu de cadena console.log(text_obj) con el atributo innew agregado;

var new_obj = eval('(' text_obj ')'); //Convertir a objeto js jQuery('#danmu').danmu("add_danmu", new_obj); el complemento};

ws.onerror = function(){

console.log("error");

};

El código principal está aquí. Utilice el nuevo WebSocket ("ws://192.168.1.107:1997") para crear un objeto de conexión de cliente WebSocket y realizar las operaciones correspondientes a través de varios eventos del objeto. ¿Es similar al servidor? Para obtener más explicaciones del código, consulte los comentarios en el código fuente. Aquí no se proporciona más introducción.

Después de ver esto, creo que, como PHPer, también puedes desarrollar tu propio sistema de bombardeo. Lo que se muestra aquí es sólo la plataforma de bombardeo más básica y primitiva. También aprendimos que las tecnologías involucradas en el desarrollo de una plataforma de bombardeo usando PHP incluyen extensiones WebSocket y Swoole, e incluso encontramos muchas herramientas con las que los desarrolladores junior rara vez entran en contacto, como PECL y Linux.

De hecho, PHP combinado con la extensión Swoole puede hacer muchas cosas, como conectar varios electrodomésticos, conectar varias interfaces de hardware para realizar el control en tiempo real de los electrodomésticos en la Web y combinarlo con Raspberry Pi. para construir un automóvil inteligente. Control remoto en la web, etc. Te esperan varias formas novedosas de jugar. ¿Quién dijo que PHP sólo puede usarse para desarrollo web? En realidad, hay muchas cosas que PHP puede hacer con la extensión Swoole. Swoole es como su título promocional: redefinir PHP.