2009-07-10 30 views
13

Estoy tratando de hacer exactamente lo mismo que en mi pregunta previa de Python, pero en PHP. See my previous (answered) questionCómo hacer que el script php ejecute otro script php

El script PHP de la pregunta anterior hace algo y luego ejecuta otro script PHP en el mismo servidor, hace algo y luego se cierra (mientras el segundo script continúa su trabajo). ¿Cómo logro esto?

Tenga en cuenta que el script PHP es también una página web al mismo tiempo (lo que tal vez podemos utilizarlo como en la pregunta anterior, en respuesta a mi pregunta era fragmento que hizo pitón solo url abierta en lugar de ejecutar el subproceso .. . aunque no tengo ni idea si esa es información útil, tal vez sea diferente en PHP, no tengo demasiada experiencia en PHP) ... y quiero hacer que cada script sea independiente, así que si el primer script php terminará Me gustaría que la segunda secuencia de comandos php continúe funcionando aunque la primera haya terminado.

¿Cuál crees que es la forma más elegante de hacer esto? ¿Repetiría el eco del iframe o debería hacerlo de otra manera?

Respuesta

2

Si un usuario va a utilizar un navegador web para llegar al script php, usaría ajax para llamar a la segunda página.

El usuario ni siquiera sabrá que se está llamando.

Ver w3schools para un tutorial sobre AJAX

+17

Votación a la baja para enviar el póster original a W3Schools. Ver: http://w3fools.com/ –

+4

Stackoverflow necesita reemplazar automáticamente para w3schoolds con MDN. https://developer.mozilla.org/en/docs/AJAX –

+0

Malo porque básicamente solo una respuesta de enlace, y no hay explicación de cómo usar ajax de un script php para llamar a otro script php – Andrew

2

Si necesidad este otro script para ser ejecutado, dependiendo del cliente no sería prudente.

Lo que haría es utilizar la técnica descrita en la respuesta a this StackOverflow question (que apunta a this comment in the PHP documentation) e incluir la otra secuencia de comandos como su postprocesamiento.

Sin embargo, ese comentario fue escrito en 2006, y las cosas pueden haber cambiado desde entonces. Por favor, pruebe la técnica (como lo haré, solo por diversión) y vea si le funciona :)

1

Según mi leal saber y entender, no hay forma de ejecutar una segunda página (AJAX es la excepción). Por lo que sé, PHP no es compatible con múltiples hilos (por favor, corríjanme si me equivoco) y la naturaleza 'single-thread' de la web parece derrotarlo de todos modos.

Preferiría ver su aplicación específica y averiguar por qué necesita tener dos páginas separadas para ejecutar, y luego volver a diseñar el proceso para que no lo haga.

Estaría dispuesto a apostar a que una reingeniería terminaría siendo un dolor de cabeza menos desde el punto de vista del desarrollo, así como también lógica y de implementación.

16

Esto es un poco de Unix/Linux de sólo truco que podría no funcionar en servidores web compartidos:

file1.php

<?php 
$somearg = escapeshellarg('blah'); 
exec("php file2.php $somearg > /dev/null &"); 

file2.php

<?php 
//do some stuff that will take a while 
//$argv should contain 'blah', and also it seems the name of the php file 
//this script will continue to run. You might want to set max_execution_time to a sensible value. 
1

Debe consultar pcntl_fork si desea una aplicación multiproceso. También mira ignore_user_abort.

+0

¿Funciona ese método en Apache? Este comentario sobre la documentación (http://us2.php.net/manual/en/function.pcntl-fork.php#49949) dice que no, pero otros dicen algo. – Matchu

+0

Además, ignore_user_abort solo implica que el usuario presiona detener, no el script en sí, cerrando la conexión antes. – Matchu

+0

No, pcntl_fork no funcionará en mod_php. El OP no especificó si el script se usaría para web o cli. – shadowhand

0

Tengo problemas para obtener mi respuesta anterior al trabajo, aunque sospecho que puede ser culpa de mi propio servidor, o tal vez nuevos navegadores que rechazan cerrar la conexión cuando se lo indicaron (realmente no soy experto en cómo ese shtuff funciona).

Si ese método no funciona para usted, ya sea, tratar this article on pseudo-multi-threading in PHP, y ver si tiene más suerte :)

4

Puede hacerlo mediante la colocación de header('Location: second.php'); al final de first.php y otra vez al final de second.php para comenzar a ejecutar third.php y así sucesivamente. Incluso usted puede crear ciclos entre dos scripts, es decir, después de terminar first.php, se iniciará second.php y después de ejecutar second.php de nuevo el first.php, de nuevo second.php y así sucesivamente.

Pero recuerde, esta es una función dependiente del navegador y cuántos script se pueden ejecutar uno después de otro, depende totalmente de cuántas veces ese navegador permita la redirección. Encontré que Mozilla permite 23 redirecciones, eso significa que puedes ejecutar 23 scripts uno tras otro.

3

Para ejecutar una segunda secuencia de comandos en el mismo servidor

$appUrl = $_SERVER['HTTP_HOST']; 
$path = 'second.php';//your path here 
$appUrl = 'http://'.$appUrl.'/'.$path; 
file_get_contents($appUrl); 
+1

file_get_contents acaba de obtener el contenido, ¿verdad? ¿Cómo ayuda a ejecutar el archivo? Corrígeme si me equivoco, lo siento, estoy aprendiendo. –

+0

Sí, estoy de acuerdo ... file_get_contents acaba de recibir el texto del archivo ... no lo ejecutó – jcansell

+0

obtiene el contenido de la página web significa que se ejecuta, – user889030

0

Si la secuencia de comandos a distancia es accesible como página web sencilla a través de http, puede intentar variante con petición HTTP GET, donde el tiempo de espera de respuesta ajustado a un mínimo de tiempo, por ejemplo, a través de CURL:

if($curl = curl_init()) { 
    curl_setopt($curl, CURLOPT_URL, 'http://your_site/your_script.php'); 
    curl_setopt($curl, CURLOPT_TIMEOUT, 1); 
    curl_exec($curl);  
    curl_close($curl); 
} 

pero tendrá demora de 1 segundo en la ejecución del primer script.

Cuestiones relacionadas