Неблокирующий fsockopen

123
[Удален]
#11
Кот:

Можно попросить пояснить? Почему не решается? В терминах РНР вроде как решается (за исключением самого начала, да и то, я не уверен, что это не мой косяк).

Потому что пхп использует системные вызовы для установки сокетов. И там ровно такой же механизм.


У нее есть какие-нить принципиальные отличия от socket_set_blocking? За исключением того, что они из разных семейств.

Да, есть - это её полная противоположность ☝

socket_set_blocking это псевдоним для функции socket_set_block - которая устанавливает блокировку сокетов, а socket_set_nonblock - запрещает их блокировку. Но работоспособность все равно зависит от системы.

neolord добавил 21.02.2009 в 20:04

Кот:
Я, вроде, описал подробно. Допускаю, что криво. Можете уточняющие вопросы задать?

уточняющий вопрос - что вы хотите получить? Какая цель запрета блокировки сокетов?

К
На сайте с 03.02.2005
Offline
74
#12
neolord:
Потому что пхп использует системные вызовы для установки сокетов. И там ровно такой же механизм.

Разверните, плз, если не сложно. Такой же механизм, как и где?

Я про термины РНР говорил - есть способы установить сокет в неблокирующее состояние. Способы работают. Так почему не решается-то (в терминах РНР)?

neolord:
Да, есть - это её полная противоположность

Давайте без издевательств (понятно же, что в виду имелось) :)

Это полнофункциональные псевдонимы? Или есть недокументированные особенности?

neolord:
уточняющий вопрос - что вы хотите получить? Какая цель запрета блокировки сокетов?

Цель - не ждать, а продолжать выполнение скрипта. Это более-менее стандартная цель использования неблокирующих сокетов, не находите? :)

N
На сайте с 06.05.2007
Offline
419
#13
Кот:
Цель - не ждать, а продолжать выполнение скрипта. Это более-менее стандартная цель использования неблокирующих сокетов, не находите?

нет. цель - получение результата. если так дальше пойдет, вас начнут подозревать в сканировании портов, например.

так какой результат работы скрипта? вы могли просмотреть ряд очевидных технических схем.

Кнопка вызова админа ()
К
На сайте с 03.02.2005
Offline
74
#14
netwind:
цель - получение результата.

Вы считаете, это корректный ответ на вопрос уважаемого neolord-а? Я так не считаю, поэтому ответил максимально конкретно.

netwind:
если так дальше пойдет, вас начнут подозревать в сканировании портов, например.

Хорошо еще, что не в совращении малолетних или попытке завладения табельным оружием :)

А почему уклон подозрений в "криминал"? Неблокирующие сокеты только в неблаговидных целях используют? Или это "презумпция виновности" в действии? :)

netwind:
так какой результат работы скрипта? вы могли просмотреть ряд очевидных технических схем.

А как это может помочь в решении моей конкретной проблемы с fsockopen? Альтернативные технические схемы мне известны (часть из них даже реализована). Я прекрасно понимаю, что мне с радостью укажут на эти альтернативные схемы и решения, заполнив тему оффтопом. Но это не решит мою проблему - перевод fsockopen (или аналога) в неблокирующий режим.

[Удален]
#15
Кот:
Разверните, плз, если не сложно. Такой же механизм, как и где?
Я про термины РНР говорил - есть способы установить сокет в неблокирующее состояние. Способы работают. Так почему не решается-то (в терминах РНР)?

Механизм тот же что и в ОС под которой запущен пхп. Раз есть способы, в чем ваш вопрос?

Кот:

Это полнофункциональные псевдонимы? Или есть недокументированные особенности?

Ровно одно и то же.

netwind:
нет. цель - получение результата

Вот! И я о том же =) Но ТС упорно продолжает философствовать.

Кот:
Цель - не ждать, а продолжать выполнение скрипта. Это более-менее стандартная цель использования неблокирующих сокетов, не находите?

Т.е. вы хотите добиться возможности поддерживать сокет вне потока выполнения скрипта? Продолжать выполнять далее написанные команды? Т.е. вы хотите синхронизацию сокетов отключить? :) Или распаралеллить процесс? Или создать перманентный сокет?

neolord добавил 21.02.2009 в 21:03

Кот:
перевод fsockopen (или аналога) в неблокирующий режим.

В документации на пхп утверждается для этого есть единственная команда - socket_set_nonblock. И очень сомнительно что вы получите имено то что ожидаете (продолжение работы скрипта при получении данных из сокета). Вопрос закрыт. Поставьте другой вопрос если хотите услышать что-то конструктивное.

К
На сайте с 03.02.2005
Offline
74
#16
neolord:
Механизм тот же что и в ОС под которой запущен пхп. Раз есть способы, в чем ваш вопрос?

Вопрос родился из Вашего утверждения о неразрешимости задачи "сделать неблокирующиеся сокеты" на основе функций пхп. Мне было интересно, что Вы имели в виду.

neolord:
Ровно одно и то же.

Ок, спасибо.

neolord:
Но ТС упорно продолжает философствовать.

Я ответил на Ваш конкретный вопрос в контексте моих проблем с fsockopen

neolord:
Т.е. вы хотите добиться возможности поддерживать сокет вне потока выполнения скрипта? Продолжать выполнять далее написанные команды? Т.е. вы хотите синхронизацию сокетов отключить? Или распаралеллить процесс? Или создать перманентный сокет?

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

neolord:
В документации на пхп утверждается для этого есть единственная команда - socket_set_nonblock.

Я в курсе того, что утверждается в документации.

neolord:
И очень сомнительно что вы получите имено то что ожидаете (продолжение работы скрипта при получении данных из сокета).Вопрос закрыт. Поставьте другой вопрос если хотите услышать что-то конструктивное.

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

[Удален]
#17

В приведенном документе вот что предлагается

if(fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1)
{
/*
* Не получилось...
*/
}

Если вы знакомы с документацией, вы должны были заметить строчку

The socket_set_nonblock() function sets the O_NONBLOCK flag on the socket specified by the socket parameter.
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Вы столько тут разглагольствуете, вы эту функцию пробовали? "не получилось"? Пора менять язык реализации.

neolord добавил 21.02.2009 в 22:15

Кот:
продолжение работы скрипта при получении данных из сокета

Не поделитесь фрагментом кода? Хочется на это посмотреть, как это вы многопоточную интерпретацию замутили в пхп.

К
На сайте с 03.02.2005
Offline
74
#18
neolord:
Вы столько тут разглагольствуете

Не больше Вашего :) Если посмотреть внимательно, то все мои разглагольствования состоят из повторения моего вопроса.

neolord:
вы эту функцию пробовали?

Пробовал socket_set_blocking, которая "Ровно одно и то же". Не факт, что пробовал применительно ко всему арсеналу средств работы с сокетами. Не факт, что то, что пробовал было попробовано корректно. От того и создал тему в этом разделе, чтобы сократить временные издержки на эксперименты, если кто-то успешно решивший проблему сочтет возможным поделиться своим опытом.

neolord, Вы же, вроде, для себя мой вопрос закрыли. Или не до конца еще? :)

P.S. Вам самому не приходилось на практике решать сходные задачи? Про флаг я в курсе.

[Удален]
#19
Кот:
Не больше Вашего :) Если посмотреть внимательно, то все мои разглагольствования состоят из повторения моего вопроса.


Пробовал socket_set_blocking, которая "Ровно одно и то же". Не факт, что пробовал применительно ко всему арсеналу средств работы с сокетами. Не факт, что то, что пробовал было попробовано корректно. От того и создал тему в этом разделе, чтобы сократить временные издержки на эксперименты, если кто-то успешно решивший проблему сочтет возможным поделиться своим опытом.
neolord, Вы же, вроде, для себя мой вопрос закрыли. Или не до конца еще? :)
P.S. Вам самому не приходилось на практике решать сходные задачи? Про флаг я в курсе.

ОМГ, ТС, просто ОМГ.

socket_set_blocking это псевдоним функции socket_set_block! И она *устанавливает* блокировку сокетов

вам же требуется socket_set_nonblock, которая *запрещает* блокировку сокетов. Вы ЭТУ функцию пробовали? Если она возвращает фолс, значит при вашем методе работы с сокетом неблокирующийся сокет попросту невозможно поднять.

На практике подобные задачи я решал как надо, с распаралелливанием процессов, иначе какой вам толк от такого сокета, если все равно требуется его синхронизировать для получения данных. И естественно это было написано на Си. Тем более зачем это в пхп я вообще не понимаю.

Кстати применительно именно к fsockopen все та же документация рекомендует использовать функцию stream_set_blocking

bool stream_set_blocking ( resource stream, int mode )

Для установки неблокирующегося режима нужно в mode поставить нолик.

Только вот эффективность этого метода в случае fsockopen мне представляется спорным, т.к. при вызове этой команды могут сразу начать передаваться данные (ответ сервера, доступность файла), причем в блокирующемся режиме, и только потом можно блокировку снять.

К
На сайте с 03.02.2005
Offline
74
#20
neolord:
ОМГ, ТС, просто ОМГ.
socket_set_blocking это псевдоним функции socket_set_block! И она *устанавливает* блокировку сокетов
вам же требуется socket_set_nonblock, которая *запрещает* блокировку сокетов.

В омг уверены? На досуге посмотрите справку по socket_set_blocking. И обратите внимание на второй параметр. Буду рад, если дело дойдет до извинений с Вашей стороны.

Добавил позже: я смотрю, пост дополнили, пока я писал ответ :)

123

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий