НЕ ЗАНИМАЮСь ФИНАНСАМИ!
С нами с 16.03.03
Сообщения: 1251
Рейтинг: 653
|
Добавлено: 25/11/07 в 20:50 |
задача:
есть нескольк урлов которые надо скачать
для ускорения хочется эти процессы запустить параллельно
как на Php такое реализуется?
|
|
|
|
С нами с 01.03.06
Сообщения: 629
Рейтинг: 620
|
Добавлено: 25/11/07 в 21:45 |
curl_multi_*
ежели не просто скачать, а еще много чего наделать, то запускать параллеьно Н-процессов.
|
|
|
|
С нами с 18.01.06
Сообщения: 322
Рейтинг: 487
|
Добавлено: 25/11/07 в 22:35 |
Вариантов несколько:
Запускать несколько копий скрипта (метод в лоб)
мульти курл - оптимально со сложностью и производительностью
не блокирующие сокеты - разбираться жозенько, производительность выигрывает
Каждый выбирает свое
|
|
|
|
С нами с 08.04.07
Сообщения: 30
Рейтинг: 5
|
Добавлено: 25/11/07 в 22:38 |
|
|
|
|
С нами с 08.04.07
Сообщения: 30
Рейтинг: 5
|
Добавлено: 25/11/07 в 22:40 |
proc3nt писал: |
не блокирующие сокеты - разбираться жозенько, производительность выигрывает
Каждый выбирает свое |
Но при кривых руках тачка дохнет ;)
|
|
|
|
С нами с 01.03.06
Сообщения: 629
Рейтинг: 620
|
Добавлено: 26/11/07 в 01:50 |
Метод дергать аяксом несколько копий скрипта подходит для очень узкого круга задач.
Более коректно будет делать один запрос на сервер, по которому запустится диспетчер и породит несколько потоков обработки с требуемыми параметрами, дождется окончания их выполнения, обработает результат и куда-то сохранит или что-то сделает. Никто не мешает делать и промежуточную статсу состояния процесса. И вот уже эту "статсу" стоит тянуть аяксом, раз в н-сек - плюса минимально три - для запуска скрипта не нужно перегружать страницу, для обновления статистики перегруз не нужен, и самый приятный в некоторых моментах - открыв страницу в другом браузере и даже на другом компе - вы все так же будете видеть процесс работы в "реалтайме"
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 26/11/07 в 03:43 |
как и сказали, мультикурл или отдельно вызывать через exec (system) программу для скачивания , к примеру wget
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
0
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 26/11/07 в 05:19 |
неблокирующие сокеты + селект форева
|
|
|
|
С нами с 01.03.06
Сообщения: 629
Рейтинг: 620
|
Добавлено: 26/11/07 в 12:43 |
Pentarh писал: |
неблокирующие сокеты + селект форева |
Оффтопик: бро, какой у тебя был бы размер счастья, если бы на пыхе можно было асмовые инструкции писать? ;) не тот это язык и системно правильные подходы к сожалению или тормозят или сбойны
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 26/11/07 в 14:18 |
php - это для создания страниц вообще то, а не для полноценных приложений
Поэтому правильнее в данном случае запустить 10 wget через system , чем самому сидеть и долго дебагить скрипт под задачу, которая для php не предназначена.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
0
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 26/11/07 в 15:41 |
Ну в частности, если стоит задача, например, мультифида, то счет идет на милисекунды и каждая оная здесь дорогА. Таймаут тоже очень важен, иначе одна закачка тормознет все остальные.
Чес говоря, такие задачи гораздо удобнее на перле писать.
Если запустить в бекграунд вгеты, ты не можешь их контролировать. К тому же это 10 форков считай.
Писать форканутое приложение - это заморачиваться с IPC.
А так открыл 10 неблокирующих сокетов, послал всем коннект, и поехали
while ($socket_num <= 10) {
if (select(...)) { //сокет готов?
fgets(..); //читаем
}
// следующий
}
(довольно примитивно, но понятно)
1. Нет заморочек и побочек с форками
2. Нет заморочек с IPC
3. Все сокеты под абсолютным контролем и программу ни на милисекунду не блокируют и могу быть закрыты в любом состоянии.
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 26/11/07 в 15:57 |
Вот к этому и идет, что изначально все от сути задачи зависит.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
0
|
|
|
С нами с 16.11.07
Сообщения: 9
|
Добавлено: 03/12/07 в 11:19 |
|
|
|
|
С нами с 16.04.05
Сообщения: 754
Рейтинг: 352
|
Добавлено: 04/12/07 в 05:37 |
Я за сокеты (решение Пентарха), имхо это самое правильное. Думается что курлом будет медленне + памяти больше скушается. А код от применения курла в данном случае меньше не станет (может и больше станет)
|
|
|
|
С нами с 11.06.03
Сообщения: 1266
Рейтинг: 950
|
Добавлено: 04/12/07 в 13:54 |
Бабушка на двое сказала.
Имейте ввиду, что нужно будет самому код формирования/разбора протокола HTTP писать.
|
|
|
|
С нами с 11.06.03
Сообщения: 1266
Рейтинг: 950
|
Добавлено: 04/12/07 в 13:58 |
HardKenny писал: | Но при кривых руках тачка дохнет ;) |
Это у тех кто боится функции select
|
|
|
|
С нами с 11.06.03
Сообщения: 1266
Рейтинг: 950
|
Добавлено: 04/12/07 в 14:01 |
Pentarh писал: | while ($socket_num <= 10) {
if (select(...)) { //сокет готов?
fgets(..); //читаем
}
// следующий
}
|
Меня интересует строчка
Там что дальше селекты на другие сокеты? Вот тут тачка и сдохнет.
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 04/12/07 в 14:41 |
нет, там конец цикла и всякие проверки.
|
|
|
|
С нами с 16.04.05
Сообщения: 754
Рейтинг: 352
|
Добавлено: 04/12/07 в 20:36 |
Если не сложно, кинь пример мульти-сокетового гета (php код) я заценю как ты это делаешь, может поучусь. У меня в общем - то есть работающий пример, есть то что я писал сам - сравню.
Только плиз законченое творение, допустим дёргающее список урлов из массива $urls
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 04/12/07 в 20:43 |
|
|
|
|
С нами с 11.06.03
Сообщения: 1266
Рейтинг: 950
|
Добавлено: 04/12/07 в 22:04 |
Стиль "изложения" мне понравился.
Благодаря usleep у тя машина не совсем дохнет. Тем не менее процессор занят намного больше чем надо при слабом трафе.
Я-бы использовал select на полную эффективность. А именно грузил-бы полный вектор в фунцкию и timeout в select ставил бы на остаток времени. Тем самым usleep нафиг был бы не нужен.
|
|
|
|
С нами с 16.04.05
Сообщения: 754
Рейтинг: 352
|
Добавлено: 05/12/07 в 03:08 |
э... а где тот php с которого ты писал?
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 05/12/07 в 18:24 |
где то в гугле или яндексе по запросам асинхронные/неблокирующие сокеты php
|
|
|
|
С нами с 16.04.05
Сообщения: 754
Рейтинг: 352
|
Добавлено: 09/12/07 в 01:05 |
написал счас простенький пример по мануалу (нормальных примеров не на гуглил).
Такой вопрос: когда включаю нонблокинг - бывает что некоторые сокеты, сразу после того как в них записал выдаются селектом как готовные к чтению, читаю - а там пусто.
Ну я их соответственно закрываю, так ничего не получив.. (это фигово). Как отследить другими способами что сокет можно уже закрывать (по окончанию текста как - то ненадёжно получается)?
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 09/12/07 в 01:30 |
1. открываем массив сокетов
2. проходим по массиву
- если не писали еще в сокет, засылаем туда запрос (на этом этапе селект надо делать на write а не на read)
- если писали, делаем селект на read и читаем
- если при чтении поймали eof, закрываем сокет
|
|
|
|