Подтвердить что ты не робот

Php Sockets vs Streams

Я думаю, что php-сокеты и php-потоки перекрывают друг друга.
Мне удалось создать клиентский интерфейс CLI PHP и сервер, используя либо сокеты, либо потоки.

Вот некоторые иллюстрации строк кода:
Использование сокетов:

...
$main_socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Cannot create socket.\n");
@socket_bind($main_socket, $host, $port) or die("Could not bind to socket $host : $port.\n");
@socket_listen($main_socket, 5) or die("Could not set up socket listener\n");
...

Использование потоков:

...
$main_socket = @stream_socket_server ("tcp://$host:$port", $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN) or die("Cannot create socket.\n");
$clients = array($main_socket);
$clients_peername = array(array('port' => $port));

fputs(STDOUT, "Waiting for connections...\n");
...

Дело в том, что клиент и сервер могут быть сделаны используя либо функции сокетов, либо потоковые функции.

Я знаю, что Streams является частью ядра PHP, а Sockets - это расширение.

Мой вопрос есть (есть):

  • В чем разница между сокетами и потоками при обращении к программированию сокетов?
  • Существуют ли какие-либо возможности, связанные с программированием сокетов, которые могут быть доступны, а другие не могут?
4b9b3361

Ответ 1

Согласно руководству, расширение сокетов более низкоуровневое. Например, у сокетов, которые у вас есть более тонкое управление при его создании, и вы можете выбрать SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET и т.д.

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

Для более общего интерфейса сокетов на стороне клиента см. stream_socket_client(), stream_socket_server(), fsockopen() и pfsockopen().

источник: http://www.php.net/manual/en/intro.sockets.php

Ответ 2

Как вы указали, "потоки" находятся в ядре PHP (встроенный, всегда доступен), в то время как "сокеты" являются частью редко включаемого расширения. Кроме этого, они почти идентичны. Вы можете использовать как TCP, так и UDP с потоками как с режимами блокировки, так и без блокировки, который охватывает 99% всех случаев использования.

Единственное общее исключение, о котором я могу думать, это ICMP. Например, "ping". Тем не менее, похоже, что в настоящее время нет надежного способа делать ICMP с PHP. Для таких вызовов требуется SOCK_RAW через расширение сокета, для которого требуются привилегии "root". Кроме того, не все маршрутизаторы будут маршрутизировать другие типы пакетов за пределами TCP, UDP и ICMP. Это ограничивает полезность расширения сокета.