Red de conocimiento informático - Aprendizaje de programación - php ejecuta script de Linux script phplinux

php ejecuta script de Linux script phplinux

¿Tutorial de subprocesos múltiples en PHP?

Cómo implementar subprocesos múltiples en el shell PHP

Primero escribe un código PHP simple para alargar el tiempo de ejecución del script y ver el efecto más fácilmente, ¡DUERME, jaja! Primero mire el código de test.php: ls

Código PHP:

for($i=0; $i10; $i){

echo $ i;

sleep(10);

}gt;

Mira el código del script de shell nuevamente, es muy simple

#! /bin/bash

foriin12345678910

do

/usr/bin/php-q/var/www/html/test.php

hecho

¿Notas que hay un símbolo en la línea que solicita el código php? Si no lo agrega, no podrá realizar subprocesos múltiples. Esto significa enviar el servicio a un segundo plano para su ejecución, de modo que cada vez que solicite el siguiente archivo, no tenga que esperar todo el código php. para ejecutarse en el bucle del shell, pero al mismo tiempo, esto realiza subprocesos múltiples. Ejecute el siguiente shell para ver el efecto. Ejecute el proceso php una vez y luego use el temporizador de Linux para solicitar este shell con regularidad. Al procesar algunas tareas que requieren subprocesos múltiples, como descargas por lotes, ¡es muy bueno!

Ejecutando multithreading en php usando un servidor web

Supongamos que estamos ejecutando el archivo a.php. Pero solicito al servidor WEB que ejecute otro b.php en mi programa, entonces ambos archivos se ejecutarán al mismo tiempo. (Nota: después de enviar una solicitud de enlace, el servidor WEB ejecutará la solicitud independientemente de si el cliente sale)

A veces, lo que queremos ejecutar no es otro archivo, sino parte del código del archivo. . ¿Qué debemos hacer?

De hecho, puedes controlar qué parte del programa a.php se ejecutará mediante un parámetro.

Aquí tienes un ejemplo:

//a.php, b.php

Código PHP:------------- -------------------------------------------------- ------------------

functionrunThread()

{

$fp=fsockopen('localhost ' , 80, $errno, $errmsg);

fputs($fp, "GET/b.php?act=brnrn"); //El segundo parámetro aquí es la solicitud especificada en el protocolo HTTP. Encabezado

//Si no comprende, consulte la definición en RFC

fclose($fp);

}

functiona()

{

$fp=fopen('result_a.log','w');

fputs($fp,'Setin) '.Fecha( 'h:i:s', hora()).(doble)microtiempo()." rn");

fclose($fp);

}

funciónb()

{

$fp=fopen('result_b.log','w');

fputs( $fp,' Setin'.Date('h: i. s', time()).(double)microtime()." rn"); >

}

if(!isset($_GET))$_GET='a';

if($_GET=='a')

{

runThread();

a();

.p>}

elseif($_GET==' b')b (); gt;

---------------------------------- ------ ------------------------------------------

Abra result_a.log y result_b.log, compare el tiempo de acceso de los dos archivos. Notarás que los dos archivos se ejecutan en subprocesos diferentes. Algunas veces son exactamente iguales.

Este es sólo un ejemplo sencillo, pero se puede mejorar de otras maneras.

Dado que PHP puede ejecutarse en múltiples subprocesos, existe un problema de sincronización. Sabemos que PHP no admite de forma nativa subprocesos múltiples. Por tanto, no habrá métodos sincronizados similares a Java. Entonces, ¿qué hacemos?

1. Intenta no acceder a los mismos recursos. para evitar conflictos. Pero puedes operar simultáneamente con la base de datos. Porque la base de datos admite operaciones concurrentes. Por lo tanto, no escriba datos en el mismo archivo en PHP multiproceso. Si debe escribir, sincronice usando otros métodos... por ejemplo, llamando a grey para bloquear el archivo. O cree un archivo temporal y espere a que desaparezca en otro hilo while(file_exits('xxx')); Esto es lo mismo que cuando el archivo temporal existe, lo que indica que está siendo operado por el hilo

Si ya no hay un archivo, significa que otros hilos lo han publicado.

2. Después de ejecutar fputs, intente no leer datos del socket ocupado por runThread. Porque para lograr subprocesos múltiples, es necesario utilizar el modo sin bloqueo.

En otras palabras, funciones como fgets deben regresar inmediatamente.... Por eso leer y escribir datos puede resultar problemático. Si se utiliza el modo de bloqueo, el programa no puede considerarse multiproceso. Debe esperar el regreso de arriba antes de ejecutar el siguiente programa. Por lo tanto, si es necesario intercambiar datos, se puede hacer fuera del archivo o dentro de los datos. Si desea hacer esto, puede usar socket_set_nonblock($fp).

Dicho todo esto, ¿tiene esto algún significado práctico? ¿Cuándo es necesario utilizar este método?

La respuesta es sí. Todos sabemos esto. En aplicaciones que leen constantemente recursos de red, la velocidad de la red es el cuello de botella. Si utiliza varios formularios de este tipo, puede leer diferentes páginas simultáneamente en varios hilos.

Hice un programa que puede buscar información en sitios web de centros comerciales como 8848 y soaso. Otro programa que lee información comercial y directorios de empresas del sitio web de Alibaba también utiliza esta tecnología. Porque ambos programas se conectan constantemente a sus servidores, leen información y la guardan en la base de datos. El uso de esta técnica elimina el cuello de botella de esperar una respuesta.

Tres formas de implementar subprocesos múltiples mediante simulación PHP

El lenguaje PHP en sí no admite subprocesos múltiples. Para resumir los métodos en Internet para simular subprocesos múltiples en PHP, en términos generales, todos utilizan las capacidades de subprocesos múltiples de los buenos socios de PHP. Buenos socios de PHP se refieren a LINUX, APACHE y LAMP.

Además, al ser una simulación, no es un verdadero subproceso múltiple. Es simplemente multiprocesamiento. Proceso e hilo son dos conceptos diferentes. Bueno, aquí te explicamos cómo hacerlo, todo desde Internet.

1. Utilice el sistema operativo LINUX

para ($i=0; $i10; $i){

echo$i;

sleep(5);

} gt;

Guarde el contenido anterior como test.php y luego escriba un código SHELL

Esta es mi primera ¡Primera vez que uso el sistema operativo LINUX! /bin/bash

foriin12345678910

hacer

php-qtest.php

hecho

2. proceso secundario de bifurcación (de hecho, esto también se usa en el sistema operativo LINUX)

declare(ticks= 1);

$bWaitFlag=FALSE //Si esperar el proceso secundario; proceso para finalizar

$intNum=10; //Número total de procesos

$pids=array(); //Matriz de PID del proceso

echo(" Startn");

for($i= 0; $i$intNum; $i ){

$pids=pcntl_fork(); /// Generar un proceso hijo, probar ejecute el código debajo de la línea actual y no herede los datos del proceso principal

if(!$pids){

// Código de proceso del proceso secundario segment_Start

$str="";

dormir(5 $i);

for($j=0;$j$i;$j){$str.= "*";}

echo "$i-gt;".time()." $strn";

exit();

// código de proceso de subproceso segment_End

}

}

if($bWaitFlag)

{

for($ i=0;$i$intNum;$i) {

pcntl_waitpid($pids, $status, WUNTRACED);

echo "wait$i-gt;".time( ). "n";

}

}

echo("Endn");

3. PHP no admite subprocesos múltiples, APACHE sí lo admite, ¿verdad?

Supongamos que estamos ejecutando el documento a.php ahora. Pero solicito al servidor WEB en el programa que ejecute otro b.php

y luego los dos documentos se ejecutarán al mismo tiempo. (El código es el mismo que el anterior)

Por supuesto, también puedes dejar el subproceso múltiple en JAVA y llamarlo desde PHP, jaja.

system('javamultiThread.java'); gt;

Información ampliada: PHP es un lenguaje de programación de código abierto general. PHP es un lenguaje de programación ejecutado en el lado del servidor, similar al lenguaje C, y es un lenguaje de programación de red de uso común. La sintaxis única de PHP es una combinación de C, Java, Perl y la propia sintaxis de PHP. La sintaxis única de PHP es una mezcla de C, Java, Perl y la sintaxis propia de PHP. Es fácil de aprender y se utiliza ampliamente, principalmente en el campo del desarrollo de redes.