Lograr el multithreading en PHP

Jinku Hu 30 enero 2023
  1. Use la extensión de concurrencia paralela Parallel para lograr subprocesos múltiples en PHP
  2. Use la función popen() para lograr multiproceso en PHP
Lograr el multithreading en PHP

Multithreading es una forma de ejecución de programa, donde un solo proceso crea varios hilos y se ejecutan simultáneamente. Este tutorial analizará los subprocesos múltiples en PHP y demostrará cómo lograrlo.

Use la extensión de concurrencia paralela Parallel para lograr subprocesos múltiples en PHP

Usando la extensión de concurrencia paralela Parallel, podemos lograr subprocesos múltiples en PHP.

La extensión proporciona un hilo de interpretación parallel\Runtime. Podemos crear un objeto de la clase parallel\Runtime() y así crear un hilo.

La clase proporciona un método run() que programa las tareas para que se ejecuten en paralelo. Podemos pasar Closure como parámetro al método run.

El parámetro generalmente se llama task, y también podemos especificar un array como segundo parámetro del método. El contenido del array se pasa a la tarea.

Hay algunos requisitos antes de descargar la extensión de concurrencia paralela Parallel. La versión de PHP debe ser 8.0 y Zend Thread Safe (ZTS) debe estar habilitado.

El encabezado <pthread.h> es otro requisito. Podemos descargar la extensión desde pecl de la siguiente manera.

pecl install parallel

Podemos probar la ejecución paralela del programa utilizando el bucle for.

Por ejemplo, podemos ejecutar un bucle dentro del método run() y otro bucle fuera del método. En tales condiciones, la ejecución del código será paralela.

Por ejemplo, cree un objeto $rt de la clase parallel\Runtime y luego invoque el método run() con el objeto. Dentro del método run(), escribe una función anónima.

Primero, escribe un bucle for para imprimir el signo + cincuenta veces dentro de la función. A continuación, fuera del método run(), escriba otro bucle for para imprimir el signo - cincuenta veces.

Como el bucle dentro del método run() se ejecuta en un subproceso separado, el bucle fuera del método run() se ejecutará simultáneamente. Como resultado, los signos - y + se imprimen simultáneamente, como se muestra en la sección de salida a continuación.

Por lo tanto, podemos usar la extensión de concurrencia paralela para lograr subprocesos múltiples en PHP.

Código de ejemplo:

$rt = new \parallel\Runtime();

$rt->run(function(){
 for ($i = 0; $i < 50; $i++)
 echo "+";
});

for ($i = 0; $i < 50; $i++) {
 echo "-";
}

Producción :

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Use la función popen() para lograr multiproceso en PHP

Podemos usar la función popen() para abrir procesos paralelos en PHP.

La función bifurca el proceso y, como resultado, se logra un procesamiento paralelo. Los procesos no comparten los recursos.

De esta manera, podemos lograr subprocesos múltiples en PHP. La función popen() crea una tubería al proceso bifurcado.

Podemos recorrer la función popen() y crear varios procesos para lograr subprocesos múltiples. La función popen() toma command como primer parámetro y mode como segundo parámetro.

El modo puede ser r o w.

Por ejemplo, cree un bucle for que se repite cinco veces. Dentro del bucle, cree otro bucle for que se repita cinco veces.

Dentro del bucle secundario, cree un array $proceso que almacene la función popen(). Configure el archivo PHP message.php y el modo r como el primer y segundo parámetro.

A continuación, cree otro bucle secundario y utilice la función pclose() para cerrar el $proceso.

Aquí, los cinco procesos se ejecutan en paralelo en el primer bucle secundario. Los procesos se terminan en el segundo bucle secundario con la función pclose().

Así es como podemos lograr subprocesos múltiples usando la función popen() en PHP.

Código de ejemplo:

for ($i=0; $i<5; $i++) {
 
 for ($j=0; $j<5; $j++) {
 $process[$j] = popen('message.php', 'r');
 }

 for ($j=0; $j<5; ++$j) {
 pclose($process[$j]);
 }
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook