2012-03-18 15 views
18

Penso che le prese php e i flussi di php si sovrappongano.
Sono riuscito a creare un client di chat CLI PHP e un server, utilizzando socket o flussi.Php Socket vs Stream

Qui alcune linee di codice che illustrano:
usando socket:

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

Uso flussi:

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

Il punto è che un client e un server potrebbero essere resi usando sia le funzioni sockets , o funzioni di streaming.

So che Streams fa parte del core PHP e Sockets è un'estensione.

La mia domanda (s) è (sono):

  • Qual è la differenza tra prese e corsi d'acqua quando si parla di programmazione socket?
  • Esistono funzionalità correlate alla programmazione di socket, che è possibile avere mentre l'altra non può?
+0

@JamWaffles Grazie per la modifica e mi dispiace per il mio inglese. –

+0

Nessun problema. Il tuo inglese è quasi perfetto, quindi non c'è nulla di cui preoccuparsi :) – Bojangles

risposta

9

Secondo il manuale, l'estensione delle prese è più di basso livello. Per esempio, whith prese avete un controllo più dettagliato durante la creazione di uno, e può scegliere SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET, ecc

L'estensione presa implementa un'interfaccia a basso livello per le funzioni di comunicazione presa sulla base del popolare Socket BSD, che offrono la possibilità di agire come server socket e come client.

Per un'interfaccia socket lato client più generica, vedere stream_socket_client(), stream_socket_server(), fsockopen() e pfsockopen().

fonte: http://www.php.net/manual/en/intro.sockets.php

+1

* più basso livello * significa più veloce? – Pacerier

+0

Non necessariamente, significa solo avere più controllo su ciò che sta succedendo. Tuttavia, in alcuni casi è possibile utilizzare il controllo più sottile per migliorare la velocità. – serans

4

Come lei ha sottolineato, 'flussi' sono nel core di PHP (built-in, sempre disponibile), mentre 'prese' sono parte di un'estensione raramente incluso. Oltre a questo, sono quasi identici. È possibile utilizzare sia TCP che UDP con flussi sia con modalità di blocco che senza blocco, che copre il 99% di tutti i casi d'uso.

L'unica eccezione comune che posso pensare è ICMP. Ad esempio, "ping". Tuttavia, sembra che al momento non ci sia un modo sicuro per fare ICMP da PHP. Tali chiamate richiedono SOCK_RAW tramite l'estensione socket, che richiede l'esecuzione dei privilegi "root". Inoltre, non tutti i router instraderanno altri tipi di pacchetti al di fuori di TCP, UDP e ICMP. Ciò limita l'utilità dell'estensione socket.