Master-X
Регистрация
|
Вход
Форум
|
Новости
|
Статьи
Главная
»
Форум
»
Программинг, Скрипты, Софт, Сервисы
»
Тема:
Php: несколько параллельных закачек
Новая тема
Ответить
цитата
25/11/07 в 20:50
Guest
задача:
есть нескольк урлов которые надо скачать
для ускорения хочется эти процессы запустить параллельно
как на Php такое реализуется?
цитата
25/11/07 в 21:45
Heavy
curl_multi_*
ежели не просто скачать, а еще много чего наделать, то запускать параллеьно Н-процессов.
цитата
25/11/07 в 22:35
proc3nt
Вариантов несколько:
Запускать несколько копий скрипта
(метод в лоб)
мульти курл - оптимально со сложностью и производительностью
не блокирующие сокеты - разбираться жозенько, производительность выигрывает
Каждый выбирает свое
цитата
25/11/07 в 22:38
HardKenny
http://dyuss.od.ua/2007/07/06/mnogopotochnost-v-php/
цитата
25/11/07 в 22:40
HardKenny
proc3nt писал:
не блокирующие сокеты - разбираться жозенько, производительность выигрывает
Каждый выбирает свое
Но при кривых руках тачка дохнет ;)
цитата
26/11/07 в 01:50
Heavy
HardKenny писал:
http://dyuss.od.ua/2007/07/06/mnogopotochnost-v-php/
Метод дергать аяксом несколько копий скрипта подходит для очень узкого круга задач.
Более коректно будет делать один запрос на сервер, по которому запустится диспетчер и породит несколько потоков обработки с требуемыми параметрами, дождется окончания их выполнения, обработает результат и куда-то сохранит или что-то сделает. Никто не мешает делать и промежуточную статсу состояния процесса. И вот уже эту "статсу" стоит тянуть аяксом, раз в н-сек - плюса минимально три - для запуска скрипта не нужно перегружать страницу, для обновления статистики перегруз не нужен, и самый приятный в некоторых моментах - открыв страницу в другом браузере и даже на другом компе - вы все так же будете видеть процесс работы в "реалтайме"
цитата
26/11/07 в 03:43
Stek
как и сказали, мультикурл или отдельно вызывать через exec (system) программу для скачивания , к примеру wget
цитата
26/11/07 в 05:19
Pentarh
неблокирующие сокеты + селект форева
цитата
26/11/07 в 12:43
Heavy
Pentarh писал:
неблокирующие сокеты + селект форева
Оффтопик:
бро, какой у тебя был бы размер счастья, если бы на пыхе можно было асмовые инструкции писать? ;) не тот это язык и системно правильные подходы к сожалению или тормозят или сбойны
цитата
26/11/07 в 14:18
Stek
php - это для создания страниц вообще то, а не для полноценных приложений
Поэтому правильнее в данном случае запустить 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
Стиль "изложения" мне понравился.
Благодаря usleep у тя машина не совсем дохнет. Тем не менее процессор занят намного больше чем надо при слабом трафе.
Я-бы использовал select на полную эффективность. А именно грузил-бы полный вектор в фунцкию и timeout в select ставил бы на остаток времени. Тем самым usleep нафиг был бы не нужен.
цитата
05/12/07 в 03:08
Sirgey
э... а где тот php с которого ты писал?
цитата
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
>
последняя »
Новая тема
Ответить
Эта страница в полной версии