CURL как менеджер загрузок с несколькими подключениями и отображением прогресса в PHP
Вопрос
Я хотел использовать расширение 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 для работы в этой среде очень просто.
- Установите max_execution_time = 0, чтобы разрешить выполнение сценариев на неопределенный срок.
- Установите 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);