Я пытаюсь сделать то же самое, что и в предыдущем Python вопросе, но в PHP. См. Мой предыдущий (ответный) вопрос
PHP-скрипт из предыдущего вопроса что-то делает, а затем запускает другой скрипт PHP на том же сервере, что-то делает, а затем завершает работу (второй скрипт продолжает работу). Как мне это достичь?
Обратите внимание, что PHP-скрипт одновременно является веб-страницей (так что, возможно, мы можем использовать его, как в предыдущем вопросе, где ответ на мой вопрос был фрагментом, который заставлял python просто открывать url вместо запуска подпроцесса … хотя я не есть подсказка, если это полезная информация, может быть, она отличается от PHP, я не слишком опытен в PHP) … и что я хочу, чтобы каждый скрипт был независимым, поэтому, если первый скрипт php завершится, мне бы хотелось, чтобы второй скрипт PHP продолжайте работать, хотя первый закончен .
Как вы считаете, самый элегантный способ сделать это? Будет ли повторяться iframe, или я должен делать это по-другому?
Это немного взлома 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.
Вы можете сделать это, разместив header('Location: second.php');
в конце first.php и снова в конце second.php, чтобы начать выполнение third.php и так далее. Даже вы можете создавать циклы между двумя сценариями, то есть после окончания first.php, запускается second.php и после выполнения second.php снова first.php, снова second.php и так далее.
Но помните, что это функция, зависящая от браузера, и сколько сценариев может выполняться одна за другой, полностью зависит от того, сколько раз браузер разрешает перенаправление. Я обнаружил, что mozilla разрешает 23 перенаправления, что означает, что вы можете выполнять 23 скрипта один за другим.
Чтобы запустить второй скрипт на том же сервере
$appUrl = $_SERVER['HTTP_HOST']; $path = 'second.php';//your path here $appUrl = 'http://'.$appUrl.'/'.$path; file_get_contents($appUrl);
Если пользователь будет использовать веб-браузер для доступа к скрипту php, я бы использовал ajax для вызова второй страницы.
Пользователь даже не знает, что он вызывается.
См. W3schools для учебника по AJAX
Если вам нужен этот другой скрипт для запуска, в зависимости от клиента не будет разумным.
Я бы использовал метод, описанный в ответе на этот вопрос StackOverflow (который указывает на этот комментарий в документации PHP ) и включает другой скрипт в качестве последующей обработки.
Однако этот комментарий был написан в 2006 году, и с тех пор все изменилось. Пожалуйста, дайте технику попробовать (как я буду делать, просто для удовольствия) и посмотреть, работает ли это для вас 🙂
Насколько я знаю, нет никакой возможности запустить вторую страницу (исключение AJAX). Насколько я знаю, PHP не поддерживает несколько потоков (пожалуйста, поправьте меня, если я ошибаюсь), и «однопоточный» характер сети, похоже, все равно победит.
Я бы предпочел взглянуть на ваше конкретное приложение и выяснить, почему вам нужно запустить две отдельные страницы, а затем перестроить процесс, чтобы он этого не сделал.
Я был бы готов поспорить, что реинжинер закончит меньше головной боли с точки зрения развития, а также логики и реализации.
Вы должны посмотреть в pcntl_fork, если хотите многопоточное приложение. Также посмотрите на ignore_user_abort .
У меня возникли проблемы с получением моего предыдущего ответа на работу, хотя я подозреваю, что это может быть ошибка моего собственного сервера или, возможно, новые браузеры, отказывающиеся закрыть соединение при указании (я действительно не профессионал в отношении того, как работает этот shtuff) ,
Если этот метод не работает для вас, попробуйте эту статью на псевдо-многопоточном в PHP и посмотрите, есть ли у вас больше удачи 🙂
Если ваш удаленный скрипт доступен как простая веб-страница через 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 секунду.