2012-03-18 34 views
18

Tôi nghĩ rằng các ổ cắm php và luồng php đang chồng lên nhau.
Tôi đã quản lý để tạo một ứng dụng trò chuyện PHP CLI và một máy chủ, sử dụng các ổ cắm hoặc luồng.Ổ cắm Php và các luồng

Dưới đây một số dòng mã minh họa:
Sử dụng ổ cắm:

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

Sử dụng dòng:

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

Vấn đề ở đây là một khách hàng và một máy chủ có thể được thực hiện bằng cách sử dụng ổ cắm chức năng , hoặc là các hàm stream.

Tôi biết rằng Luồng là một phần của lõi PHP và Ổ cắm là một phần mở rộng.

Câu hỏi của tôi (s) là (là):

  • sự khác biệt giữa ổ cắm là gì và suối khi đề cập đến lập trình socket?
  • Có bất kỳ khả năng nào, liên quan đến lập trình ổ cắm không, người đó có thể có trong khi người khác không thể?
+0

@JamWaffles Cảm ơn bạn đã chỉnh sửa và xin lỗi vì tiếng anh của tôi. –

+0

Không sao cả. Tiếng Anh của bạn gần như hoàn hảo, vì vậy không có gì phải lo lắng về :) – Bojangles

Trả lời

9

Theo hướng dẫn, phần mở rộng ổ cắm có mức độ thấp hơn. Ví dụ, whith ổ cắm bạn có quyền kiểm soát-grained tốt hơn khi tạo một, và có thể chọn SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET vv

Phần mở rộng ổ cắm thực hiện một giao diện cấp thấp đến các chức năng giao tiếp ổ cắm dựa trên phổ biến Ổ cắm BSD, cung cấp khả năng hoạt động như một máy chủ socket cũng như một máy khách.

Để có giao diện socket phía máy khách chung hơn, xem stream_socket_client(), stream_socket_server(), fsockopen() và pfsockopen().

nguồn: http://www.php.net/manual/en/intro.sockets.php

+1

Có * mức thấp hơn * có nghĩa là nhanh hơn không? – Pacerier

+0

Không nhất thiết, điều đó có nghĩa là bạn có quyền kiểm soát nhiều hơn những gì đang xảy ra. Bạn có thể sử dụng điều khiển tốt hơn để cải thiện tốc độ trong một số trường hợp. – serans

4

Như bạn chỉ ra, 'suối' là trong PHP lõi (built-in, luôn luôn có sẵn) trong khi 'cắm' là một phần của một phần mở rộng hiếm khi bao gồm. Khác hơn thế, chúng gần như giống hệt nhau. Bạn có thể sử dụng cả TCP và UDP với các luồng với cả hai chế độ chặn và không chặn, bao gồm 99% tất cả các trường hợp sử dụng.

Ngoại lệ chung duy nhất tôi có thể nghĩ là ICMP. Ví dụ: 'ping'. Tuy nhiên, có vẻ như hiện tại không phải là cách an toàn để thực hiện ICMP từ PHP. Các cuộc gọi như vậy yêu cầu SOCK_RAW thông qua phần mở rộng socket, yêu cầu các đặc quyền 'root' thực thi. Ngoài ra, không phải tất cả các bộ định tuyến sẽ định tuyến các loại gói khác ngoài TCP, UDP và ICMP. Điều này giới hạn tính hữu dụng của phần mở rộng socket.