2012-03-18 3 views
18

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

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

... 
$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"); 
... 

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

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

Мой вопрос (ы) является (являются):

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

@JamWaffles Спасибо за редактирование и извините за мой английский. –

+0

Нет проблем. Ваш английский почти идеальный, так что не о чем беспокоиться :) – Bojangles

ответ

9

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

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

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

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

+1

Является ли более низким уровнем * быстрее? – Pacerier

+0

Не обязательно, это просто означает, что у вас больше контроля над тем, что происходит. Однако вы можете использовать этот более тонкий элемент управления, чтобы улучшить скорость в некоторых случаях. – serans

4

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

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