¿
Implementar subprocesos múltiples en PHP? Cuando veas este título, debes pensar que estoy loco... Pero, de hecho, realmente lo hago.
Estos son algunos de mis métodos, que de hecho son posibles.
que PHP en sí no admite subprocesos múltiples, pero nuestro servidor WEB admite subprocesos múltiples.
En otras palabras, varias personas pueden acceder a él al mismo tiempo. Esta también es la base para implementar subprocesos múltiples en PHP. Supongamos
que estamos ejecutando el archivo a.php ahora. Pero también solicito al servidor WEB que ejecute otro b.php en el programa
,por lo que los dos archivos se ejecutarán al mismo tiempo
(PD: después de una solicitud de enlace)
.se envía, el servidor WEB lo ejecutará, independientemente de si el cliente ha salido)
A
veces, lo que queremos ejecutar no es otro archivo, sino una parte del código de este archivo.
Puede usar parámetros para controlar qué programa se ejecuta a.php.
Aquí hay un ejemplo:
//a .php.
Código PHP:----------------------------------------------- - ----------------------------------
<?php
función ejecutar hilo()
{
$fp = fsockopen('localhost', 80, $errno, $errmsg);
fputs($fp, "GET /a.php?act=brnrn"); //El segundo parámetro aquí es el encabezado de solicitud especificado en el protocolo HTTP.
//Si no lo entiende, consulte la definición en RFC
fclose($fp);
}
función a()
{
$fp = fopen('result_a.log', 'w');
fputs($fp, 'Establecido en ' . Fecha('h:i:s', hora()) . (doble)microtime() . "rn");
fclose($fp);
}
función b()
{
$fp = fopen('result_b.log', 'w');
fputs($fp, 'Establecido en ' . Fecha('h:i:s', hora()) . (doble)microtime() . "rn");
fclose($fp);
}
if(!isset($_GET['acto'])) $_GET['acto'] = 'a';
si($_GET['actuar'] == 'a')
{
ejecutar hilo();
a();
}
else if($_GET['actuar'] == 'b') b();
?>
------------------------------------------------ --------------------------------
Abra result_a.log y result_b.log y compare los tiempos de acceso de los dos archivos. Encontrará que estos dos se están ejecutando en subprocesos diferentes.
Algunas veces son exactamente iguales.
Lo anterior es solo un ejemplo simple y puede mejorarlo en otras formas.
Ahora que el subproceso múltiple está disponible en PHP, surge un problema, es decir, la sincronización. Sabemos que PHP en sí no admite subprocesos múltiples, por lo que no existe ningún método como
sincronizar en Java. 1.
Intente no acceder al mismo recurso para evitar conflictos. Pero puede operar la base de datos al mismo tiempo. Debido a que la base de datos admite operaciones concurrentes,no escriba datos en el mismo archivo
en PHP multiproceso
. Si desea escribir, use otros métodos para la sincronización, por ejemplo, llame a Flock para bloquear el archivo, etc. O cree un archivo temporaly espere a que el archivo desaparezca en otro hilo mientras (file_exits('xxx')); equivalente a Cuando este archivo temporal existe, significa que el subproceso realmente está funcionando
. Si no existe dicho archivo, significa que otros subprocesos lo han liberado.
2. Intente no leer datos de este socket después de que runThread ejecute fputs. Para lograr subprocesos múltiples, es necesario Se usa el modo sin bloqueo, es decir, regresa inmediatamente cuando se usa una función
como
fgets , por lo que habrá problemas al leer y escribir datos. No es multiproceso. Tiene que esperar el retorno anterior antes de ejecutarel siguiente programa. Entonces, si necesita intercambiar datos, finalmente puede usar archivos o datos externos para completarlo. $fp) para lograrlo.
Habiendo dicho todo esto, ¿tiene esto algún significado práctico? ¿Cuándo es necesario utilizar este método?
La respuesta es sí. Como todos sabemos, en una aplicación que lee continuamente los recursos de la red, la velocidad de la red es un cuello de botella. Adopte este método, puede
leer diferentes páginas con múltiples hilos al mismo tiempo.
Creé un programa que puede buscar información en sitios web de centros comerciales como 8848 y soaso. También existe un programa que lee información comercial y directorios de empresas del sitio web de Alibaba y también utiliza
esta tecnología. Porque ambos programas tienen que conectarse continuamente a sus servidores para leer información y guardarla en la base de datos. La utilización de esta tecnología elimina el cuello de botella de esperar una respuesta.