2012-01-30 3 views
0

У меня есть PHP-скрипт, который выполняет множество проверок, а затем загружает файл на сервер и выводит оригинал.
Для загрузки файла я используюАсинхронный PHP?

system("/usr/local/bin/wget -O ..."); 

Итак, PHP ждет загрузки, чтобы закончить, а затем выводит файл.
Вопрос в том, можно ли отправить «ping» где-нибудь (другой php-файл?) Для начала загрузки, а затем, не дожидаясь результата, просто продолжите выполнение.

+0

это помогает http://stackoverflow.com/questions/1296085/download-file-using-jquery? –

+0

Нет, извините. jQuery здесь нечего делать – Jim

ответ

1

Используйте pcntl_fork(), чтобы развернуть текущий процесс в дочерний процесс. Загружайте файл в дочерний процесс, пока ваш родительский процесс может продолжить выполнение своей задачи.

$pid = pcntl_fork(); 

if ($pid == -1) 
{   
    // Fork failed    
    exit(1); 
} 
else if ($pid) 
{ 
    // The parent process 
    //continue what you want to do here 
} 
else 
{ 
    // the child process 
    // do the system call here 
} 

После выполнения некоторых работ, если теперь нужно родительский процесс ждать, пока дочерний процесс не завершится, вы можете pcntl_waitpid($pid).

Прочитайте here для получения дополнительной документации по методам pcntl.

+0

Функции pcntrl не рекомендуются для использования в веб-средах и работают только в системах * nix - http://uk.php.net/manual/en/intro.pcntl.php –

+0

Поскольку он отметил вопрос linux, я думаю, мы можем с уверенностью предположить, что он запускает его в Linux-окне. Что касается вашего другого вопроса, вы правы. Функции Pcnlt выполняются только из CLI. – xbonez

+0

По-прежнему «не рекомендуется для использования в веб-средах» - как в случае, это будет Crash And Burn в самый опасный момент. – Piskvor

2

Используйте функции curl_multi_* для параллельной обработки нескольких загрузок. PHP не нуждается в какой-либо поддержке потоков, а процесс forking - это просто хак.

+0

У меня нет нескольких загрузок, файл только один. Я просто хочу продолжить выполнение, пока файл загружается. – Jim

0

А общий дизайн скороговорки будет применить шаблон Command Design: http://en.wikipedia.org/wiki/Command_pattern

Вы можете реализовать это в вашем веб-среде или вы могли бы установить какой-то сервер очереди, как: http://www.rabbitmq.com/ и т.д. и т.п.

Это зависит от ваших систем, доступа к ним и ваших знаний, чтобы увидеть, какое решение лучше всего подходит. Это более сложный вопрос, слишком далеко отсюда.

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

Смежные вопросы