Как заставить скрипт php запускать другой скрипт php - PullRequest
13 голосов
/ 10 июля 2009

Я пытаюсь сделать то же самое, что и в моем предыдущем вопросе по Python, но на PHP. См. Мой предыдущий (ответ) вопрос

PHP-скрипт из предыдущего вопроса что-то делает, а затем запускает другой PHP-скрипт на том же сервере, что-то делает, а затем завершает работу (в то время как второй скрипт все еще продолжает работать). Как мне этого добиться?

Обратите внимание, что PHP-скрипт одновременно является веб-страницей (поэтому, возможно, мы сможем использовать его, как и в предыдущем вопросе, где ответом на мой вопрос был фрагмент, в котором python просто открытый URL вместо запуска подпроцесс ... хотя я и понятия не имею, полезна ли эта информация, может быть, она отличается от PHP, я не слишком разбираюсь в PHP) ... и я хочу сделать каждый скрипт независимым - так что если сначала скрипт php закончит Я бы хотел, чтобы второй скрипт php продолжал работать, хотя первый закончился .

Как вы думаете, какой самый элегантный способ сделать это? Будет ли эхо iframe работать или я должен делать это по-другому?

Ответы [ 9 ]

17 голосов
/ 10 июля 2009

Это небольшой взлом только для Unix / Linux, который может не работать на общих веб-серверах:

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.
4 голосов
/ 12 ноября 2010

Вы можете сделать это, разместив header('Location: second.php'); в конце first.php и снова в конце second.php, чтобы начать выполнение third.php и так далее. Даже вы можете создавать циклы между двумя сценариями, то есть после завершения first.php, будет запущен second.php и после выполнения second.php снова first.php, снова second.php и т. Д.

Но помните, что это зависит от браузера, и сколько сценариев может быть выполнено один за другим, полностью зависит от того, сколько раз этот браузер разрешает перенаправление. Я обнаружил, что mozilla допускает 23 перенаправления, это означает, что вы можете выполнять 23 сценария один за другим.

3 голосов
/ 29 августа 2012

Чтобы запустить второй скрипт на том же сервере

$appUrl = $_SERVER['HTTP_HOST'];
$path = 'second.php';//your path here
$appUrl = 'http://'.$appUrl.'/'.$path;
file_get_contents($appUrl);
2 голосов
/ 10 июля 2009

Если вам нужно , то этот другой скрипт для запуска, в зависимости от клиента, не будет мудрым.

Я бы использовал метод, описанный в ответе на этот вопрос StackOverflow (который указывает на этот комментарий в документации PHP ), и включил другой скрипт в качестве вашего пост-обработки.

Однако этот комментарий был написан в 2006 году, и с тех пор все могло измениться. Пожалуйста, попробуйте эту технику (как я буду делать, просто для удовольствия) и посмотрите, подходит ли она вам:)

2 голосов
/ 10 июля 2009

Если пользователь будет использовать веб-браузер для доступа к php-скрипту, я бы использовал ajax для вызова второй страницы.

Пользователь даже не узнает, что его вызывают.

См. w3schools для учебника по AJAX

1 голос
/ 10 июля 2009

Вам нужно посмотреть pcntl_fork , если вы хотите многопоточное приложение. Также посмотрите на ignore_user_abort .

1 голос
/ 10 июля 2009

Насколько мне известно, нет никакой возможности запустить вторую страницу (AJAX является исключением). Насколько я знаю, PHP не поддерживает несколько потоков (пожалуйста, исправьте меня, если я ошибаюсь), и «однопотоковая» природа сети, похоже, в любом случае побеждает его.

Я бы предпочел взглянуть на ваше конкретное приложение и выяснить, почему вам нужно запустить две отдельные страницы, а затем перестроить процесс так, чтобы этого не произошло.

Я бы хотел поспорить, что реинжиниринг закончится не столько головной болью с точки зрения разработки, сколько логикой и реализацией.

0 голосов
/ 31 мая 2015

Если ваш удаленный скрипт доступен как простая веб-страница через http, вы можете попробовать вариант с http get request, где время ожидания ответа установлено на минимальное время, например через 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);
}

но у вас будет задержка в 1 секунду при выполнении вашего первого скрипта.

0 голосов
/ 10 июля 2009

У меня проблемы с получением моего предыдущего ответа на работу, хотя я подозреваю, что это может быть ошибка моего собственного сервера, или, возможно, новые браузеры отказывают в закрытии соединения при получении инструкции (я действительно не профессионал в том, как это штуфф работает).

Если и этот метод вам не подходит, попробуйте эту статью о псевдо-многопоточности в PHP и посмотрите, повезет ли вам:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...