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

StackOverflow https://stackoverflow.com/questions/1613926

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

Функции curl_multi_xyz (), например, curl_multi_exec () позволяет обрабатывать несколько запросов одновременно. Также посмотрите CURLOPT_RANGE , если хотите загрузить несколько сегментов одного и того же файла параллельно. И функции обратного вызова, которые вы можете установить с помощью CURLOPT_READFUNCTION и < a href = "http://docs.php.net/function.curl-setopt" rel = "nofollow noreferrer"> CURLOPT_WRITEFUNCTION позволит вам отправлять некоторые данные о прогрессе в клиент.

Другие советы

Всем критикам "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".И если вы спроектируете свою систему таким образом - вы правы, она очень быстро усложняется.Сделайте шаг назад и используйте то, что дано.У вас есть доступ к каталогам?Бум - у вас очереди.Вы можете совершать веб-звонки?Бум - у вас есть многопоточное (распределенное) приложение.Теперь просто объедините концепции вместе, как того требует ваше приложение.

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

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

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

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

$tr = new teConnections();
$data = $tr->downloadManager(array('http', 'host', path', 'login', 'pass', 'port'), 'file name, compression, streaming); 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top