2012-03-18 127 views
18

我認爲php套接字和php流互相重疊。
我已經設法使用套接字或流來創建一個CLI PHP聊天客戶端和一個服務器。Php套接字vs流

這裏一些表示行代碼:
使用套接字:

... 
$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核心的一部分,而套接字是擴展。

我的問題(s)爲(是):

  • 指socket編程的時候是什麼插座之間的區別和溪流?
  • 有沒有什麼能力,與套接字編程有關,一個人可以有另一個不能?
+0

@JamWaffles感謝您的編輯和對我的英語感到抱歉。 – 2012-03-18 21:57:00

+0

沒問題。你的英語幾乎是完美的,所以沒有什麼可擔心的:) – Bojangles 2012-03-18 22:09:39

回答

9

根據手冊,套接字擴展是更低層次的。例如,蒙山插座你有更細粒度的控制創建一個時,並可以選擇SOCK_STREAM,SOCK_DGRAM,SOCK_SEQPACKET等

插座擴展實現了低層次的接口基於流行的socket通信功能BSD套接字,提供了充當套接字服務器和客戶端的可能性。

對於更通用的客戶端套接字接口,請參閱stream_socket_client(),stream_socket_server(),fsockopen()和pfsockopen()。

來源:http://www.php.net/manual/en/intro.sockets.php

+1

*更低級*意味着更快嗎? – Pacerier 2013-07-14 20:18:41

+0

不一定,它只是意味着你對發生的事情有更多的控制權。不過,在某些情況下,您可能會使用更精細的控件來提高速度。 – serans 2013-08-05 15:36:01

4

正如您所指出的,「流」是在PHP核心(內置,總是可用的),而「套接字」是一個很少包括擴展的一部分。除此之外,它們幾乎完全相同。您可以同時使用TCP和UDP兩種流以及阻塞和非阻塞模式,這些模式涵蓋了所有用例的99%。

我能想到的唯一常見的例外是ICMP。例如,'ping'。但是,看起來目前還沒有一種安全的方式來從PHP執行ICMP。這種調用需要通過套接字擴展來實現SOCK_RAW,這需要執行「root」權限。此外,並非所有路由器都會在TCP,UDP和ICMP之外路由其他數據包類型。這限制了套接字擴展的實用性。