![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
Levsha |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 30.9.2005 Репутация: нет Всего: 4 |
Я осуществляю загрузку сразу нескольких страниц других сайтов стандартным методом "fopen-fgets-fclose". Страниц примерно 15.
Как понимаю, при загрузке страницы чужого сервера, тратится время на:
Следовательно даже не зависимо от ширины или скорости канала моего сервера, скорость загрузки сраниц будет доооолгой. Вопрос, возможно ли организовать загрузку сразу нескольких страниц одновременно? Примерно, я планирую что бы это выглядело так:
где $text соответсвенно будет массивом -------------------- Предлагаем создание сайта в Хабаровске - http://web-alt.ru. А ты сдал анализы? Самый полный анализ сайта! |
|||
|
||||
sTa1kEr |
|
||||||
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 11 Всего: 146 |
Для создания нескольких потоков существует 2 способа:
1. Для каждого нового потока запускать отдельный интерпретатор PHP. Это наиболее простой, но и наиболее корявый способ. Так же каждый новый псевдопоток будет съедать около 15мб памяти. Методика этого способа следующая: создаем отдельный скрипт вся работа которого заключается в том, что бы загрузить нужный сайт, URL сайта будет передаватся первым параметром. Затем просто запускаем этот скрипт для каждого URL-а. Для того что бы не ожидать окончание работы каждого такого скрипта, можно запустить его в фоновом режиме (для этого в конце команды нужно добавить &):
Но такой способ не будет работать в Windows. Другой способ не ждать окончания работы скрипта - это использовать proc-open
Вот и вся наука. 2. Более правильный способ. Заключается он в использовании Stream Functions совместно с stream_set_blocking() и stream_select(). Включение режима "non-blocking" позволяет не ждать когда поток будет доступен для чтения, а stream_select() позваляет из массива потоков выбирать тот поток(и), который доступен для чтения/записи данных в данный момент. Написал пример работы с потоками:
|
||||||
|
|||||||
Vbif |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 25.2.2006 Где: Реутов Репутация: нет Всего: нет |
Жаль что такое чудо будет работать лишь на php5
|
|||
|
||||
Levsha |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 30.9.2005 Репутация: нет Всего: 4 |
sTa1kEr, благодарю
![]() Выглядит это так:
Но есть проблема, при выдаче результата, скрипт также выдает серверные заголовки типа:
Как их убрать? Где именно они добавляются? Добавлено через 12 минут и 5 секунд И еще: как скачать ссылку типа http://sait.ru/script/fail.php?name=web&z=0&c=110 ? -------------------- Предлагаем создание сайта в Хабаровске - http://web-alt.ru. А ты сдал анализы? Самый полный анализ сайта! |
||||
|
|||||
Levsha |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 30.9.2005 Репутация: нет Всего: 4 |
Снимаю вопрос: ссылка должна выглядеть вот так tcp://sait.ru:80/script/fail.php?name=web&z=0&c=110 Я Провел тест на время генерации страницы, вместо предидущих 19.38749сек я получил 8.105515сек ![]() ![]() Осталась только проблема серверных заголовков. Конечно переменную можно просто обработать, и убрать все что идет до первого тега, но имхо это неправильно. -------------------- Предлагаем создание сайта в Хабаровске - http://web-alt.ru. А ты сдал анализы? Самый полный анализ сайта! |
|||
|
||||
vasac |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1060 Регистрация: 4.5.2006 Репутация: нет Всего: 36 |
||||
|
||||
sTa1kEr |
|
||||||
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 11 Всего: 146 |
На 4ом не будет работать только функция stream_socket_client и соответственно асинхронное соединение. Вместо нее можно использовать обычный fsockopen. Все остальное будет работать и на 4ом PHP.
Вообще-то не совсем так... Коннектится нужно к tcp://sait.ru:80, а в запрос посылать уже полный урл.
Я бы разделил хидеры от контента через explode (вместо строчек 40-44):
Да, есть такое. Надо будет протестировать. Жаль только, что еще сыроват и плохо задокументирован. |
||||||
|
|||||||
teroni |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 15.5.2007 Где: Днепропетровск Репутация: 1 Всего: 22 |
||||
|
||||
Levsha |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 30.9.2005 Репутация: нет Всего: 4 |
Некоторые сайты говорят в ответ:
Запрос идет такой
Может что-то неправильно?
Спасибо за еще одну гениальную идею ![]() -------------------- Предлагаем создание сайта в Хабаровске - http://web-alt.ru. А ты сдал анализы? Самый полный анализ сайта! |
||||||
|
|||||||
sTa1kEr |
|
||||
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 11 Всего: 146 |
Нет, не видел, да и наврядтли она будет, пока на амереканских зеркалах php.net нету нормально документации. Levsha, Да... я когда писал этот пример не учел что хост может выдать ошибку или его вовсе не существует. Нужно добавить проверку.
Сразу после stream_socket_client(). Добавлено через 11 минут и 28 секунд Так же на всякий случай еще можно проверять 3ий параметр stream_select(). Доработанный код:
|
||||
|
|||||
Levsha |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 30.9.2005 Репутация: нет Всего: 4 |
sTa1kEr, но сайт то существует, более того, запрос перепроверял через браузер.
Все должно быть... -------------------- Предлагаем создание сайта в Хабаровске - http://web-alt.ru. А ты сдал анализы? Самый полный анализ сайта! |
|||
|
||||
vasac |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1060 Регистрация: 4.5.2006 Репутация: нет Всего: 36 |
Здесь должен указывать путь к документу на сайте, а не URL |
|||
|
||||
sTa1kEr |
|
|||
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 11 Всего: 146 |
Levsha, вы в $urls пишете ссылки вида tcp://sait.ru:80/script/fail.php?name=web&z=0&c=110 ?
|
|||
|
||||
Levsha |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 30.9.2005 Репутация: нет Всего: 4 |
Все, нашел, мой был косяк
Добавлено через 1 минуту и 39 секунд
Да. Проглядел Host: $url -------------------- Предлагаем создание сайта в Хабаровске - http://web-alt.ru. А ты сдал анализы? Самый полный анализ сайта! |
|||
|
||||
sTa1kEr |
|
|||
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 11 Всего: 146 |
Код для *полных* URL-ов. Версия: 0.0.3 Pre Alpha
|
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Для профи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |