Как сделать PHP скрипт запустить другой PHP скрипт

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

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

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

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

Ответы

Ответ 1

Это немного взлома 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.

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Пользователь даже не знает, что он вызывается.

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

Ответ 5

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

Я бы использовал метод, описанный в ответе fooobar.com/questions/72811/... (который указывает на этот комментарий в документации PHP) и включить в него следующую script.

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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