Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Php: несколько параллельных закачек
цитата
25/11/07 в 20:50
 Guest
задача:
есть нескольк урлов которые надо скачать
для ускорения хочется эти процессы запустить параллельно
как на Php такое реализуется?
цитата
25/11/07 в 21:45
 Heavy
curl_multi_*
ежели не просто скачать, а еще много чего наделать, то запускать параллеьно Н-процессов.
цитата
25/11/07 в 22:35
 proc3nt
Вариантов несколько:
Запускать несколько копий скрипта icon_smile.gif (метод в лоб)
мульти курл - оптимально со сложностью и производительностью
не блокирующие сокеты - разбираться жозенько, производительность выигрывает
Каждый выбирает свое icon_smile.gif
цитата
25/11/07 в 22:40
 HardKenny
proc3nt писал:

не блокирующие сокеты - разбираться жозенько, производительность выигрывает
Каждый выбирает свое icon_smile.gif

Но при кривых руках тачка дохнет ;)
цитата
26/11/07 в 01:50
 Heavy
HardKenny писал:
Метод дергать аяксом несколько копий скрипта подходит для очень узкого круга задач.
Более коректно будет делать один запрос на сервер, по которому запустится диспетчер и породит несколько потоков обработки с требуемыми параметрами, дождется окончания их выполнения, обработает результат и куда-то сохранит или что-то сделает. Никто не мешает делать и промежуточную статсу состояния процесса. И вот уже эту "статсу" стоит тянуть аяксом, раз в н-сек - плюса минимально три - для запуска скрипта не нужно перегружать страницу, для обновления статистики перегруз не нужен, и самый приятный в некоторых моментах - открыв страницу в другом браузере и даже на другом компе - вы все так же будете видеть процесс работы в "реалтайме" icon_smile.gif
цитата
26/11/07 в 03:43
 Stek
как и сказали, мультикурл или отдельно вызывать через exec (system) программу для скачивания , к примеру wget
цитата
26/11/07 в 05:19
 Pentarh
неблокирующие сокеты + селект форева smail49.gif
цитата
26/11/07 в 12:43
 Heavy
Pentarh писал:

неблокирующие сокеты + селект форева smail49.gif

Оффтопик: бро, какой у тебя был бы размер счастья, если бы на пыхе можно было асмовые инструкции писать? ;) не тот это язык и системно правильные подходы к сожалению или тормозят или сбойны
цитата
26/11/07 в 14:18
 Stek
php - это для создания страниц вообще то, а не для полноценных приложений icon_smile.gif

Поэтому правильнее в данном случае запустить 10 wget через system , чем самому сидеть и долго дебагить скрипт под задачу, которая для php не предназначена.
цитата
26/11/07 в 15:41
 Pentarh
Ну в частности, если стоит задача, например, мультифида, то счет идет на милисекунды и каждая оная здесь дорогА. Таймаут тоже очень важен, иначе одна закачка тормознет все остальные.

Чес говоря, такие задачи гораздо удобнее на перле писать.

Если запустить в бекграунд вгеты, ты не можешь их контролировать. К тому же это 10 форков считай.

Писать форканутое приложение - это заморачиваться с IPC.

А так открыл 10 неблокирующих сокетов, послал всем коннект, и поехали
while ($socket_num <= 10) {
if (select(...)) { //сокет готов?
fgets(..); //читаем
}
// следующий
}

(довольно примитивно, но понятно)
1. Нет заморочек и побочек с форками
2. Нет заморочек с IPC
3. Все сокеты под абсолютным контролем и программу ни на милисекунду не блокируют и могу быть закрыты в любом состоянии.
цитата
26/11/07 в 15:57
 Stek
Вот к этому и идет, что изначально все от сути задачи зависит.
цитата
03/12/07 в 11:19
 zavul0n
в CURL можно установить многопоточность
"Загрузка в несколько потоков с multi_curl и PHP"
http://php.southpark.com.ua/2007/zagruzka-v-neskolko-potokov-s-multi_curl-i-php/

Последний раз редактировалось: zavul0n (04/12/07 в 19:57), всего редактировалось 1 раз
цитата
04/12/07 в 05:37
 Sirgey
Я за сокеты (решение Пентарха), имхо это самое правильное. Думается что курлом будет медленне + памяти больше скушается. А код от применения курла в данном случае меньше не станет (может и больше станет)
цитата
04/12/07 в 13:54
 Sha

Бабушка на двое сказала.
Имейте ввиду, что нужно будет самому код формирования/разбора протокола HTTP писать.
цитата
04/12/07 в 13:58
 Sha
HardKenny писал:
Но при кривых руках тачка дохнет ;)

Это у тех кто боится функции select
цитата
04/12/07 в 14:01
 Sha
Pentarh писал:
while ($socket_num <= 10) {
if (select(...)) { //сокет готов?
fgets(..); //читаем
}
// следующий
}

Меня интересует строчка Код:
// следующий

Там что дальше селекты на другие сокеты? Вот тут тачка и сдохнет.
цитата
04/12/07 в 14:41
 Pentarh
нет, там конец цикла и всякие проверки.
цитата
04/12/07 в 20:36
 Sirgey


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

Только плиз законченое творение, допустим дёргающее список урлов из массива $urls
цитата
04/12/07 в 20:43
 Pentarh
у меня на перле. я писал с примера на пхп
http://pentarh.com/multi-example.txt
цитата
04/12/07 в 22:04
 Sha

Стиль "изложения" мне понравился. smail100.gif
Благодаря usleep у тя машина не совсем дохнет. Тем не менее процессор занят намного больше чем надо при слабом трафе.
Я-бы использовал select на полную эффективность. А именно грузил-бы полный вектор в фунцкию и timeout в select ставил бы на остаток времени. Тем самым usleep нафиг был бы не нужен.
цитата
05/12/07 в 03:08
 Sirgey
э... а где тот php с которого ты писал? icon_smile.gif
цитата
05/12/07 в 18:24
 Pentarh
где то в гугле или яндексе по запросам асинхронные/неблокирующие сокеты php
цитата
09/12/07 в 01:05
 Sirgey
написал счас простенький пример по мануалу (нормальных примеров не на гуглил).

Такой вопрос: когда включаю нонблокинг - бывает что некоторые сокеты, сразу после того как в них записал выдаются селектом как готовные к чтению, читаю - а там пусто.

Ну я их соответственно закрываю, так ничего не получив.. (это фигово). Как отследить другими способами что сокет можно уже закрывать (по окончанию текста как - то ненадёжно получается)?
цитата
09/12/07 в 01:30
 Pentarh
1. открываем массив сокетов
2. проходим по массиву
- если не писали еще в сокет, засылаем туда запрос (на этом этапе селект надо делать на write а не на read)
- если писали, делаем селект на read и читаем
- если при чтении поймали eof, закрываем сокет
Стр. 1, 2, 3  >  последняя »


Эта страница в полной версии