php socket set option

socket_set_option

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

socket_set_option — Устанавливает опции для сокета

Описание

Список параметров

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

ВерсияОписание
8.0.0socket теперь экземпляр класса Socket ; ранее был ресурсом ( resource ).

Примеры

Пример #1 Пример использования socket_set_option()

Смотрите также

User Contributed Notes 8 notes

To expand a bit more on what «tim at e2-media dot co dot nz» started.

SO_SNDTIMEO is one of the many constants you can use with socket_set_option.

See http://ca.php.net/manual/en/ref.sockets.php for the available Predefind Constants and visit http://man.he.net/man2/setsockopt for the meaning of the ones relevant.

A more intuitive use of socket_set_option would be to set a time out for a blocking socket (a socket that waits for data to be receive when read from). You would do this like so:

socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array(«sec»=>0, «usec»=>100));

Notice that sec= 0 and usec= 100; Depending on how long you want your program to wait to recieve data, you might want to change these values.

PHP 7.3.6, and probably many previous versions, automatically sets SO_REUSEADDR when you use stream_socket_server().

#ifdef SO_REUSEADDR
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&sockoptval, sizeof(sockoptval));
#endif

I initially thought I’d need to play with context options to turn this on, but no, the simplest single-arg call with no error checking and just an address, works for me.

strace your PHP binary to be 100% sure:

.
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
.

The chances are you ARE using SO_REUSEADDR unless you’re using a 100-year old UNIX clone in a month with a Z in it.

//After setting the cache area
$snd_buf = 1024 * 3 ;
$rcv_buf = 1024 * 3 ;

Setting the socket timeout microseconds (‘usec’) does not work under Windows, at least under PHP/5.2.9:

Источник

socket_set_option

socket_set_option — Устанавливает опции для сокета

Описание

Список параметров

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Примеры

Пример #1 Пример использования socket_set_option()

$rval = socket_get_option($socket, SOL_SOCKET, SO_REUSEADDR);

Список изменений

Коментарии

To set a socket timeout value (assuming you’ve set it blocking) use:

socket_set_option(
$socket,
SOL_SOCKET, // socket level
SO_SNDTIMEO, // timeout option
array(
«sec»=>10, // Timeout in seconds
«usec»=>0 // I assume timeout in microseconds
)
);

To expand a bit more on what «tim at e2-media dot co dot nz» started.

SO_SNDTIMEO is one of the many constants you can use with socket_set_option.

See http://ca.php.net/manual/en/ref.sockets.php for the available Predefind Constants and visit http://man.he.net/man2/setsockopt for the meaning of the ones relevant.

A more intuitive use of socket_set_option would be to set a time out for a blocking socket (a socket that waits for data to be receive when read from). You would do this like so:

socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array(«sec»=>0, «usec»=>100));

Notice that sec= 0 and usec= 100; Depending on how long you want your program to wait to recieve data, you might want to change these values.

Lingering will sometimes not work when you’re working with non-blocking sockets. Even if the socket is set to linger and you keep tying to close until the socket doesn’t return an error and the resource is no longer identifiable as type ‘Socket’, the socket may STILL close without sending everything.

Therefore, in the event that you are using non-blocking sockets (which is preferable if you care at all about signaling), you should set the socket as blocking (socket_set_block()) before calling to close it. This will allow everything to flush before it returns.

Setting the socket timeout microseconds (‘usec’) does not work under Windows, at least under PHP/5.2.9:

?>

Output on Windows box:

Output on Linux box:

//After setting the cache area
$snd_buf = 1024 * 3 ;
$rcv_buf = 1024 * 3 ;

PHP 7.3.6, and probably many previous versions, automatically sets SO_REUSEADDR when you use stream_socket_server().

php_network_bind_socket_to_local_addr() is called at https://github.com/php/php-src/blob/623911f993f39ebbe75abe2771fc89faf6b15b9b/main/streams/xp_socket.c#L675 and defined at https://github.com/php/php-src/blob/61a6a6ec51297506c54f3c6e60ace9b892d0a3e4/main/network.c#L401 and if you take a look you’ll see

#ifdef SO_REUSEADDR
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&sockoptval, sizeof(sockoptval));
#endif

I initially thought I’d need to play with context options to turn this on, but no, the simplest single-arg call with no error checking and just an address, works for me.

strace your PHP binary to be 100% sure:

.
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
.

The chances are you ARE using SO_REUSEADDR unless you’re using a 100-year old UNIX clone in a month with a Z in it.

Источник

Делаем вебсокеты на PHP с нуля

Некоторое время назад я выбирал библиотеку для работы с вебсокетами. На просторах интернета я натыкался на статьи по интеграции node.js с yii, а почти все статьи о вебсокетах на хабре ограничивались инструкциями к тому, как использовать phpdaemon.

Я изучал библиотеки phpdaemon и ratchet, они достаточно монструозны (причём используя ratchet для отправки сообщения конкретному пользователю рекомендовано дополнительно использовать wamp). Мне не совсем было понятно для чего использовать таких монстров, которые требуют установку других монстров. Почитав исходники этих, а также других библиотек, я разобрался как всё устроено и мне захотелось написать простой вебсокет-сервер на php самостоятельно. Это помогло мне закрепить изученный материал и наткнуться на некоторые подводные камни, о которых я не имел представления.

Так я решил написать необходимый для меня функционал с нуля.

Получившийся код и ссылка на демонстрационный чат в конце статьи.

Поставленные цели:

1) разобраться с серверными сокетами в php
2) разобраться с протоколом вебсокетов
3) написать с нуля простой сервер вебсокетов

1) Серверные сокеты в php

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

используя расширение php «socket»:

или используя расширение php «stream»:

Я предпочёл второй вариант ввиду его краткости.

Итак, мы создали серверный сокет и теперь хотим обрабатывать новые соединения к нему, для этого опять же есть два варианта

или с использованием stream_select

Т.к. нам в дальнейшем нужно будет одновременно обрабатывать и серверный сокет на предмет новых соединений, и уже существующие подключения, на предмет новых сообщений, то остановимся на втором варианте.

2) Протокол вебсокетов

«Рукопожатие» или handshake:

Считываем значение Sec-WebSocket-Key из пришедшего заголовка от клиента, рассчитываем на его основе Sec-WebSocket-Accept и отправляем итоговый ответ:

обмен сообщениями

Простой сервер вебсокетов

Итак, у нас есть вся необходимая информация.
Используя код простого http сервера из первой части, а также функции handshake, decode и encode из второй мы можем собрать простой сервер вебсокетов.

В приведённом примере можно менять пользовательские сценарии onOpen, onClose и onMessage для реализации необходимого функционала.

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

Источник

socket_set_option

(PHP 4 >= 4.3.0, PHP 5, PHP 7)

socket_set_option — Устанавливает опции для сокета

Описание

Список параметров

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Примеры

Пример #1 Пример использования socket_set_option()

$rval = socket_get_option($socket, SOL_SOCKET, SO_REUSEADDR);

Коментарии

To set a socket timeout value (assuming you’ve set it blocking) use:

socket_set_option(
$socket,
SOL_SOCKET, // socket level
SO_SNDTIMEO, // timeout option
array(
«sec»=>10, // Timeout in seconds
«usec»=>0 // I assume timeout in microseconds
)
);

To expand a bit more on what «tim at e2-media dot co dot nz» started.

SO_SNDTIMEO is one of the many constants you can use with socket_set_option.

See http://ca.php.net/manual/en/ref.sockets.php for the available Predefind Constants and visit http://man.he.net/man2/setsockopt for the meaning of the ones relevant.

A more intuitive use of socket_set_option would be to set a time out for a blocking socket (a socket that waits for data to be receive when read from). You would do this like so:

socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array(«sec»=>0, «usec»=>100));

Notice that sec= 0 and usec= 100; Depending on how long you want your program to wait to recieve data, you might want to change these values.

Lingering will sometimes not work when you’re working with non-blocking sockets. Even if the socket is set to linger and you keep tying to close until the socket doesn’t return an error and the resource is no longer identifiable as type ‘Socket’, the socket may STILL close without sending everything.

Therefore, in the event that you are using non-blocking sockets (which is preferable if you care at all about signaling), you should set the socket as blocking (socket_set_block()) before calling to close it. This will allow everything to flush before it returns.

Setting the socket timeout microseconds (‘usec’) does not work under Windows, at least under PHP/5.2.9:

?>

Output on Windows box:

Output on Linux box:

//After setting the cache area
$snd_buf = 1024 * 3 ;
$rcv_buf = 1024 * 3 ;

PHP 7.3.6, and probably many previous versions, automatically sets SO_REUSEADDR when you use stream_socket_server().

php_network_bind_socket_to_local_addr() is called at https://github.com/php/php-src/blob/623911f993f39ebbe75abe2771fc89faf6b15b9b/main/streams/xp_socket.c#L675 and defined at https://github.com/php/php-src/blob/61a6a6ec51297506c54f3c6e60ace9b892d0a3e4/main/network.c#L401 and if you take a look you’ll see

#ifdef SO_REUSEADDR
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&sockoptval, sizeof(sockoptval));
#endif

I initially thought I’d need to play with context options to turn this on, but no, the simplest single-arg call with no error checking and just an address, works for me.

strace your PHP binary to be 100% sure:

.
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
.

The chances are you ARE using SO_REUSEADDR unless you’re using a 100-year old UNIX clone in a month with a Z in it.

Источник

XCVI. Функции сокетов

Это расширение является ЭКСПЕРИМЕНТАЛЬНЫМ. Поведение этого расширения, имена его функций и всё, что задокументировано, может измениться в последующих релизах РНР без предупреждения. Вы предупреждены и можете использовать это расширение только под вашу ответственность.

Расширение сокетов реализует низкоуровневый интерфейс функций сообщений через сокеты на основе популярных BSD-сокетов, давая возможность работать и как серверу сокетов, и как клиенту.

При использовании этих функций важно помнить, что, хотя многие из них имеют имена, аналогичные их двойникам языка C, они часто имеют разные объявления. Обязательно прочтите описания, чтобы исключить конфликты.

Те, кто мало знаком с программированием сокетов, могут найти соответствующий материал на Unix man-страницах; в web также имеется большое количество учебной информации о программировании сокетов на C, большая часть которой может быть применена, с некоторыми изменениями, для программирования сокетов в PHP. UNIX Socket FAQ может стать хорошим началом.

Пример 1. Сокет: Простой TCP/IP-сервер

Это пример простого talkback-сервера. Измените переменные address и port для ваших установок и запустите. Вы можете затем соединиться с сервером командой вроде этой: telnet 192.168.1.53 10000 (где address и port соответствуют вашим установкам). Всё, что вы напечатаете, будет затем выведено на стороне сервера и возвращено вам обратно. Для отсоединения введите ‘quit’.

Пример 2. Сокет: простой TCP/IP-клиент

Это простой HTTP-клент. Он соединяет со страницей, отправляет HEAD-запрос, возвращает ответ и выходит.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *