Bambino
Новичок
Проясните некоторые вопросы по сокетам
Сразу скажу, что учел правила форума и посетил фак, дитэйл и поиск по слову "сокет". Прочитав 9 страниц топиков, ответа на свои вопросы не нашел. Поиск в интернете тоже не привел в положительному результату, поэтому ваши советы - последняя надежда.
Итак, стоит задача осуществлять несколько http-соединений, которое определяется некой переменной $maxthreads, одновременно (необходимо для прокси-чекера). Т.е. необходимо использование неблокирующих сокетов, дабы скрипт не останавливался... Для создания одного коннекта использую fsockopen и socket_set_blocking. Теперь собственно вопросы:
1. Эти несколько соединений (читай сокетов) должны создаваться сразу? Т.е. некий цикл:
Если алгорит такой, то не будет ли задержки на время пока будут созданы все сокеты? Ведь, если "стандартное" (как в хелпе по fsockopen) время таймаута коннекта 30с и будут проблемные хосты, то получается скрипт зависнет на 30 с? Другой вариант... создается, например, 5-й сокет, а 3-й уже готов для чтения... Как осуществить это чтение, а затем продолжить открывать новые сокеты?
2. В какой момент нужно использовать socket_select? Ведь работа должна осуществляться непрерывно, т.е. один сокет отработал.. закрылся... его идентификатор удаляется из массива сокетов, т.е. появляется возможность создать новый коннект (сокет), пока количество сокетов будет меньше значения $maxthreads.
3. рассмотрим пример из хелпа по socket_select:
Вопрос: может ли быть такое, что сокет сказал, что данные есть, но их меньше 4Кб? Я правильно понимаю, что работа скрипта продолжается и при следующем сигнале socket_select, если в буфере соединения накопится 4Кб, данные будут прочитаны? А если данных в буфере будет больше 4Кб? Тогда следующая порция будет опять считана при следущем сигнале socket_select?
4. Нужно ли использовать таймаут для socket_select? если я правильно понял это время в течение которого функция будет ожидать сокет, который готов что-то "сказать"?
5. socket_set_timeout работает независимо от того блокирующий или неблокирующий сокет используется? Эту функцию нужно использовать перед каждой операцией чтения/записи или можно один раз глобально?
6. Находил в Инете варианты псевдо-многопоточности... там где в цикле создается сокет (как я привел в первом вопросе) и после создания опять бегаем по массиву сокетов и читаем из них... Но если есть такая возможность, то я не пойму принцип использования socket_select... ведь эту функцию тоже нужно опрашивать в цикле, как я понимаю...
7. Есть ли разница между socket_select и stream_select по отношению к сокетам?
Вообщем детали есть, по отдельности все понятно, но собрать воедино не получается.
Т.е. я не могу увидеть принципиальный алгоритм... В винде вроде понятно, имеем цикл сообщений и события.. пришло событие готовности чтения - читаем, пришло событии готовности записи - пишем... но пхп не событийный и головоломка не складывается... прошу помощи... надеюсь вопросы не очень запутаны...
Сразу скажу, что учел правила форума и посетил фак, дитэйл и поиск по слову "сокет". Прочитав 9 страниц топиков, ответа на свои вопросы не нашел. Поиск в интернете тоже не привел в положительному результату, поэтому ваши советы - последняя надежда.
Итак, стоит задача осуществлять несколько http-соединений, которое определяется некой переменной $maxthreads, одновременно (необходимо для прокси-чекера). Т.е. необходимо использование неблокирующих сокетов, дабы скрипт не останавливался... Для создания одного коннекта использую fsockopen и socket_set_blocking. Теперь собственно вопросы:
1. Эти несколько соединений (читай сокетов) должны создаваться сразу? Т.е. некий цикл:
PHP:
while ( $maxthreads > count ( $sockets ) ) {
$sock = fsockopen ( ... );
socket_set_blocking ( $sock, false );
}
2. В какой момент нужно использовать socket_select? Ведь работа должна осуществляться непрерывно, т.е. один сокет отработал.. закрылся... его идентификатор удаляется из массива сокетов, т.е. появляется возможность создать новый коннект (сокет), пока количество сокетов будет меньше значения $maxthreads.
3. рассмотрим пример из хелпа по socket_select:
PHP:
$talking_socket = socket_select ( ... );
if ( !$talking_socket ) {
// обработка ошибок (кстати каких?)
} else {
// здесь по идее мы должны читать из "говорящего" сокета
fread ( $sockets[$talking_socket], 4096 );
}
4. Нужно ли использовать таймаут для socket_select? если я правильно понял это время в течение которого функция будет ожидать сокет, который готов что-то "сказать"?
5. socket_set_timeout работает независимо от того блокирующий или неблокирующий сокет используется? Эту функцию нужно использовать перед каждой операцией чтения/записи или можно один раз глобально?
6. Находил в Инете варианты псевдо-многопоточности... там где в цикле создается сокет (как я привел в первом вопросе) и после создания опять бегаем по массиву сокетов и читаем из них... Но если есть такая возможность, то я не пойму принцип использования socket_select... ведь эту функцию тоже нужно опрашивать в цикле, как я понимаю...
7. Есть ли разница между socket_select и stream_select по отношению к сокетам?
Вообщем детали есть, по отдельности все понятно, но собрать воедино не получается.
Т.е. я не могу увидеть принципиальный алгоритм... В винде вроде понятно, имеем цикл сообщений и события.. пришло событие готовности чтения - читаем, пришло событии готовности записи - пишем... но пхп не событийный и головоломка не складывается... прошу помощи... надеюсь вопросы не очень запутаны...
Просто как я уже писал.. потеря времени для меня трагедия.. 