Php сокеты против потоков - PullRequest
22 голосов
/ 18 марта 2012

Я думаю, что 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 - это расширение.

Мой вопрос (ы):

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

Ответы [ 2 ]

11 голосов
/ 20 марта 2012

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

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

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

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

6 голосов
/ 19 июня 2015

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...