PHP 套接字与流

Posted

技术标签:

【中文标题】PHP 套接字与流【英文标题】:Php Sockets vs Streams 【发布时间】:2012-04-03 08:53:23 【问题描述】:

我认为 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 是一个扩展。

我的问题是:

在提到套接字编程时,套接字和流有什么区别? 是否有任何与套接字编程相关的功能,一个可以拥有而另一个不能?

【问题讨论】:

@JamWaffles 感谢您的编辑,对不起我的英语。 没问题。你的英语几乎是完美的,所以没有什么可担心的:) 【参考方案1】:

根据手册,sockets 扩展是更底层的。例如,创建套接字时您可以进行更细粒度的控制,可以选择 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。例如,“平”。但是,目前似乎没有从 PHP 执行 ICMP 的安全方法。此类调用需要通过套接字扩展的 SOCK_RAW,这需要“root”权限才能执行。此外,并非所有路由器都会路由 TCP、UDP 和 ICMP 之外的其他数据包类型。这限制了套接字扩展的有用性。

【讨论】:

以上是关于PHP 套接字与流的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 的多套接字连接

PHP Php套接字客户端

并发使用持久性 PHP 套接字

在 PHP 中打开异步套接字

如何在php套接字中连续运行server.php

PHP 套接字连接优化