2009-07-10 4 views
13

Я пытаюсь сделать то же самое, что и в предыдущем Python вопросе, но в PHP. See my previous (answered) questionКак заставить php-скрипт запускать другой скрипт php

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

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

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

ответ

2

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

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

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

+17

Вниз-голосование за отправку оригинального плаката в W3Schools. См.: Http://w3fools.com/ –

+4

Для использования stackoverflow необходимо автоматически заменить w3schoolds на MDN. https://developer.mozilla.org/en/docs/AJAX –

+0

Плохо, потому что в основном просто ответ на ссылку, и нет объяснения того, как использовать ajax из скрипта php для вызова другого php-скрипта. – Andrew

2

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

Что я буду делать, это использовать технику, описанную в ответе на this StackOverflow question (что указывает на this comment in the PHP documentation) и включить другой скрипт в качестве последующей обработки.

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

1

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

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

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

16

Это немного 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. 
1

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

+0

Этот метод работает на Apache? Этот комментарий к документации (http://us2.php.net/manual/en/function.pcntl-fork.php#49949) говорит «нет», но другие говорят, что это любопытно. – Matchu

+0

Кроме того, ignore_user_abort включает в себя только кнопку остановки пользователя, а не сам скрипт, который рано закрывает соединение. – Matchu

+0

Нет, pcntl_fork не будет работать в mod_php. ОП не указывал, будет ли сценарий использоваться для Интернета или кли. – shadowhand

0

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

Если этот метод не работает для вас, либо, попробуйте this article on pseudo-multi-threading in PHP, и посмотреть, если у вас есть лучше удачи :)

4

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

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

3

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

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

file_get_contents просто получает его содержимое, не так ли? Как это помогает выполнить файл? Исправьте меня, если я ошибаюсь, извините, я учусь. –

+0

Да, я согласен .. file_get_contents только что получил текст файла .. он не выполнил его – jcansell

+0

вы получаете контент веб-страницы, это означает его исполнение, – user889030

0

Если удаленный скрипт доступен как простой веб-страницы с помощью 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 секунду при выполнении первого скрипта.