- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу

Тренды маркетинга в 2024 году: мобильные продажи, углубленная аналитика и ИИ
Экспертная оценка Адмитад
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Здравствуйте, Уважаемые!
Столкнулся с проблемой при использовании неблокирующих сокетов. Если с вашей помощью получится найти решение буду премного благодарен.
Я использую функцию fsockopen, после вызова которой перевожу сокет в неблокирующий режим. Проблема заключается в том, что сама fsockopen фактически работает в блокирующем режиме, и, в случае возникновении проблем при соединении с удаленной машиной, естественно блокирует выполнение скрипта в течение своего тайм-аута. Вот от этой блокировки мне и нужно избавиться. Можно сказать, что мне необходимо заранее перевести fsockopen в неблокирующий режим.
Насколько я понимаю, все аналогичные fsockopen решения (например, функция stream_socket_client, низкоуровневый сокет-интерфейс или использование cURL) указанной проблемы не решают.
В поисках решения нашел интересный способ избавления от моей проблемы, но не для РНР. Вот цитата:
А для чего собственно нужно вам это?
KosoyRoman, спасибо за готовность помочь. Не могли бы Вы пояснить, в каком участке Вашего кода содержится ключ к решению моей проблемы? Стыдно признаться, но я увидел лишь стандартное использование библиотеки cURL, не решающее моей проблемы, как мне кажется.
А для чего собственно нужно вам это?
Для чего нужно перевести fsockopen в неблокирующий режим? Чтобы дать возможность скрипту не останавливаться на время тайм-аута этой функции. Т.е. стандартная цель использования неблокирующего режима.
Кот дак вот же мануал ))
http://www.phpclub.net/manrus/f/socket-set-blocking.html
http://www.phpclub.net/manrus/f/socket-set-blocking.html
http://itby.ru/content/view/6002/40/
вот же мануал
Хм... мне казалось, я корректно описал проблему, с которой столкнулся. Давайте, попробую объяснить с другого конца.
Проблема не в том, что я не могу организовать работу с fsockopen, stream_socket_client или cURL (с этим, как раз, все в порядке), а в том, что не получается у меня работать с сокетом в неблокирующем режиме с самого начала соединения. Эта же проблема хорошо описана по ссылке, которую я привел в первом посте. Т.е. мне надо, чтобы к моменту отправки первого бита в сторону удаленной машины (при установлении соединения) сокет уже находился в неблокирующем режиме.
Если же действовать стандартными методами, описанными в мануалах, то установить неблокирующий режим для сокета можно только после установления соединения с удаленной машиной. В подавляющем числе случаев этого достаточно. Я столкнулся с исключением - в отдельных случаях сам процесс установления соединения (когда сокет еще в блокирующем режиме) затягивается. Мне надо уйти от этого затягивания установив неблокирующий режим для функции fsockopen. Или для любой другой аналогичной, хоть для stream_socket_client, хоть для чего-то в cURL или в низкоуровневом интерфейсе сокетов.
Смысл? не дать скрипту подвиснуть? Для этого и ставится таймаут у курла.
Смысл?
Смысл есть.
У Вас есть решение?
не дать скрипту подвиснуть? Для этого и ставится таймаут у курла.
Нет, конечно :) Неблокирующие сокеты немного для другого...
Чтобы предложить решение мне сначала понять задачу. Просто "сделать неблокирующиеся сокеты" на основе функций пхп - не решается. Есть конечно функция
socket_set_nonblock -- Sets nonblocking mode for file descriptor fd
Description
bool socket_set_nonblock ( resource socket )
но не факт насчет там этого вашего первого бита
Чтобы предложить решение мне сначала понять задачу.
Я, вроде, описал подробно. Допускаю, что криво. Можете уточняющие вопросы задать?
Просто "сделать неблокирующиеся сокеты" на основе функций пхп - не решается.
Можно попросить пояснить? Почему не решается? В терминах РНР вроде как решается (за исключением самого начала, да и то, я не уверен, что это не мой косяк).
Есть конечно функция socket_set_nonblock
У нее есть какие-нить принципиальные отличия от socket_set_blocking? За исключением того, что они из разных семейств.
есть специальная опция
curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, '5' );
неужели не работает?
есть специальная опция
curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, '5' );
неужели не работает?
Насколько я в курсе, это мы так просто тайм-аут выставляем. Без перехода в неблокирующий режим.