¿Existe una forma realista de implementar un modelo de subprocesos múltiples en PHP, ya sea de verdad o simplemente simulándolo? Hace algún tiempo, se sugirió que podría forzar al sistema operativo a cargar otra instancia del ejecutable de PHP y manejar otros procesos simultáneos.
El problema con esto es que cuando el código PHP termina de ejecutar la instancia de PHP permanece en la memoria porque no hay forma de eliminarlo desde PHP. Entonces, si está simulando varios hilos, puede imaginar lo que sucederá. Por lo tanto, todavía estoy buscando una forma en que se pueda realizar o simular de manera efectiva múltiples subprocesos desde PHP. ¿Algunas ideas?
php
multithreading
Steve Obbayi
fuente
fuente
Respuestas:
Multi-threading es posible en php
Sí, puedes hacer subprocesos múltiples en PHP con pthreads
De la documentación de PHP :
Prueba simple
Primer intento
Segunda carrera
Ejemplo del mundo real
fuente
¿Por qué no usas popen ?
fuente
El enhebrado no está disponible en stock PHP, pero la programación concurrente es posible mediante el uso de solicitudes HTTP como llamadas asincrónicas.
Con la configuración de tiempo de espera del rizo establecida en 1 y utilizando el mismo session_id para los procesos que desea asociar entre sí, puede comunicarse con las variables de sesión como en mi ejemplo a continuación. Con este método, incluso puede cerrar su navegador y el proceso concurrente todavía existe en el servidor.
No olvide verificar la ID de sesión correcta de esta manera:
startprocess.php
process1.php
verifysession.php
closeprocess.php
fuente
set_time_limit(0);
¡Ay! Nunca, nunca hagas esto.Si bien no puede enhebrar, tiene cierto grado de control de proceso en php. Los dos conjuntos de funciones que son útiles aquí son:
Funciones de control de procesos http://www.php.net/manual/en/ref.pcntl.php
Funciones POSIX http://www.php.net/manual/en/ref.posix.php
Puede bifurcar su proceso con pcntl_fork, devolviendo el PID del niño. Luego puede usar posix_kill para desechar ese PID.
Dicho esto, si matas un proceso padre, se debe enviar una señal al proceso hijo diciéndole que muera. Si php no reconoce esto, puede registrar una función para administrarlo y hacer una salida limpia usando pcntl_signal.
fuente
El uso de hilos es posible gracias a la extensión pthreads PECL
http://www.php.net/manual/en/book.pthreads.php
fuente
Sé que esta es una pregunta antigua, pero para las personas que buscan, hay una extensión PECL escrita en C que ahora brinda la capacidad de subprocesamiento múltiple de PHP, se encuentra aquí https://github.com/krakjoe/pthreads
fuente
Puede usar exec () para ejecutar un script de línea de comando (como php de línea de comando), y si canaliza la salida a un archivo, entonces su script no esperará a que termine el comando.
No puedo recordar la sintaxis de la CLI de php, pero querrías algo como:
Creo que algunos servidores de alojamiento compartido tienen exec () deshabilitado de forma predeterminada por razones de seguridad, pero podría valer la pena intentarlo.
fuente
Podrías simular el enhebrado. PHP puede ejecutar procesos en segundo plano a través de popen (o proc_open). Esos procesos pueden comunicarse con stdin y stdout. Por supuesto, esos procesos pueden ser un programa php. Eso es probablemente lo más cerca que puedas llegar.
fuente
Dependiendo de lo que intentes hacer, también puedes usar curl_multi para lograrlo.
fuente
Sé que esto es muy antiguo, pero puedes mirar http://phpthreadlib.sourceforge.net/
Es compatible con la comunicación bidireccional entre subprocesos y también tiene protecciones integradas para eliminar los subprocesos de los niños (prevención de huérfanos).
fuente
Puede tener la opción de:
fuente
La clase Thread está disponible desde PECL pthreads ≥ 2.0.0.
fuente
¿Qué tal pcntl_fork?
consulte nuestra página del manual para ver ejemplos: PHP pcntl_fork
fuente
pcntl_fork
no funcionará en un entorno de servidor web si tiene activado el modo seguro . En este caso, solo funcionará en la versión CLI de PHP.fuente
Si está utilizando un servidor Linux, puede usar
Si necesitas pasar algunos args
En script.php
O use Symfony https://symfony.com/doc/current/components/process.html
fuente
Al momento de escribir mi comentario actual, no sé sobre los hilos de PHP. Vine a buscar la respuesta aquí mismo, pero una solución es que el programa PHP que recibe la solicitud del servidor web delega toda la formulación de la respuesta a una aplicación de consola que almacena su salida, la respuesta a la solicitud, en un archivo binario y el programa PHP que lanzó la aplicación de consola devuelve ese archivo binario byte por byte como respuesta a la solicitud recibida. La aplicación de consola se puede escribir en cualquier lenguaje de programación que se ejecute en el servidor, incluidos los que tienen soporte de subprocesamiento adecuado, incluidos los programas C ++ que usan OpenMP.
Un truco poco confiable y sucio es usar PHP para ejecutar una aplicación de consola, "uname",
e imprima la salida de ese comando de consola en la salida HTML para averiguar la versión exacta del software del servidor. Luego instale exactamente la misma versión del software en una instancia de VirtualBox, compile / ensamble los binarios completamente autónomos, preferiblemente estáticos, que desee y luego cárguelos al servidor. A partir de ese momento, la aplicación PHP puede usar esos binarios en el rol de la aplicación de consola que tiene un subproceso múltiple adecuado. Es una solución sucia, poco confiable, para una situación, cuando el administrador del servidor no ha instalado todas las implementaciones de lenguaje de programación necesarias en el servidor. Lo que hay que tener en cuenta es que en cada solicitud que la aplicación PHP recibe, la (s) aplicación (es) de la consola finalizan / exit / get_killed.
En cuanto a lo que piensan los administradores del servicio de alojamiento de dichos patrones de uso del servidor, supongo que todo se reduce a la cultura. En el norte de Europa, el proveedor de servicios TIENE QUE ENTREGAR LO QUE SE ANUNCIÓ y si se permitía la ejecución de comandos de consola y se permitía la carga de archivos que no sean malware y el proveedor de servicios tiene derecho a eliminar cualquier proceso del servidor después de unos minutos o incluso después de 30 segundos , los administradores del servicio de alojamiento carecen de argumentos para presentar una queja adecuada. En los Estados Unidos y Europa occidental, la situación / cultura es muy diferente y creo que hay una gran posibilidad de que en los Estados Unidos y / o Europa occidental el proveedor de servicios de alojamiento se niegue a servir a los clientes que utilizan el truco descrito anteriormente. Es solo mi suposición, dada mi experiencia personal con nosotros servicios de alojamiento y dado lo que he escuchado de otros sobre los servicios de alojamiento de Europa occidental. Al momento de escribir mi comentario actual (2018_09_01) no sé nada sobre las normas culturales de los proveedores de servicios de alojamiento del sur de Europa, los administradores de red del sur de Europa.
fuente
Puede ser que me haya perdido algo, pero exec no funcionó tan asíncrono para mí en el entorno de Windows que utilicé en Windows y funcionó de maravilla;)
fuente
Multithreading significa realizar múltiples tareas o procesos simultáneamente, podemos lograr esto en php usando el siguiente código, aunque no hay una forma directa de lograr multihilo en php, pero podemos lograr casi los mismos resultados de la siguiente manera.
}
Test_1.php
Esto ejecutará test_1.php dos veces simultáneamente y ambos procesos se ejecutarán en segundo plano simultáneamente, por lo que de esta manera puede lograr múltiples subprocesos en php.
Este tipo hizo un trabajo realmente bueno Multithreading en php
fuente