Как сделать 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.