CURL как менеджер загрузок с несколькими подключениями и отображением прогресса в PHP - PullRequest
7 голосов
/ 23 октября 2009

Я хотел использовать расширение CURL для PHP, чтобы создать какой-то менеджер загрузок, и я подумал, позволит ли CURL реализовать эти 2 функции, о которых я думаю:

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

2) Постоянно обновлять на экране (текстовое или графическое, не имеет значения) ход загрузки.

Позволяет ли CURL для PHP что-либо из этого? Если да, то можете дать какие-нибудь подсказки?

Ответы [ 5 ]

6 голосов
/ 23 октября 2009

Всем критикам «PHP не подходит для многозадачности»:

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

Очень легко настроить PHP для работы в этой среде.

  1. Установите max_execution_time = 0, чтобы позволить сценариям работать бесконечно
  2. Установите ignore_user_abort = true, чтобы разрешить выполнение сценариев даже после клиент прервал

Разработка облегченных веб-сервисов REST для одной задачи. Разработайте их так, чтобы вам было все равно, когда они возвращаются, например, в системе очередей. Запись в очередь является поточно-ориентированной, а удаление из очереди - поточно-ориентированной, если выполняется с некоторыми базовыми мьютексами на уровне ОС.

«разветвлять» веб-сервисы так же просто, как открыть файл:

fclose(fopen("http://somewebservice....php?a1=v1&a2=v2&....")); // Launch a web service and continue...

Мало того, что этот подход является многопоточным, но он также является распределенным. Веб-сервис может быть локальным или расположен по всему миру. PHP, конечно, не волнует.

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

Слишком часто, когда разработчики думают, что они «многопоточные», они думают: «О боже, я должен обрабатывать форки и execs, а также ждать и PID». И если вы разрабатываете свою систему таким образом - вы правы, она очень быстро усложняется. Сделай шаг назад и используй то, что дано. У вас есть доступ к каталогам? Бум - у вас есть очереди. Вы можете совершать веб-звонки? Boom - у вас есть многопоточное (распределенное) приложение. Теперь просто объедините понятия, как того требует ваше приложение.

1 голос
/ 23 октября 2009

PHP не является многопоточным, и, если вы попытаетесь принудительно заставить его таким образом с помощью нескольких файловых вызовов или разветвления, результаты, как правило, будут неоптимальными. Я бы предложил против этого, ОДНАКО, было бы возможно сделать что-то подобное со смесью js, php (возможно, не curl, но пользовательский php file stream ) и long polling

0 голосов
/ 23 декабря 2010

Нет, это не так. Это невозможно, потому что менеджер загрузок вызывает класс, который обрабатывает загрузку 5 раз - это экземпляр класса PHP.

Это пример вызова класса:

$tr = new teConnections();
$data = $tr->downloadManager(array('http', 'host', path', 'login', 'pass', 'port'), 'file name, compression, streaming); 
0 голосов
/ 23 октября 2009

Функции curl_multi_xyz (), такие как curl_multi_exec(), позволяют обрабатывать несколько запросов одновременно. Также посмотрите на CURLOPT_RANGE, если вы хотите загрузить несколько сегментов одного и того же файла параллельно. А функции обратного вызова, которые вы можете установить с помощью CURLOPT_READFUNCTION и CURLOPT_WRITEFUNCTION, позволят вам отправлять клиенту какие-то данные о ходе выполнения.

0 голосов
/ 23 октября 2009

Возможно, загляните в curl_multi_init ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...