(PHP 5 >= 5.1.0)
stream_socket_pair — Creates a pair of connected, indistinguishable socket streams
$domain
, int $type
, int $protocol
)stream_socket_pair() creates a pair of connected, indistinguishable socket streams. This function is commonly used in IPC (Inter-Process Communication).
domain
The protocol family to be used: STREAM_PF_INET
,
STREAM_PF_INET6
or
STREAM_PF_UNIX
type
The type of communication to be used:
STREAM_SOCK_DGRAM
,
STREAM_SOCK_RAW
,
STREAM_SOCK_RDM
,
STREAM_SOCK_SEQPACKET
or
STREAM_SOCK_STREAM
protocol
The protocol to be used: STREAM_IPPROTO_ICMP
,
STREAM_IPPROTO_IP
,
STREAM_IPPROTO_RAW
,
STREAM_IPPROTO_TCP
or
STREAM_IPPROTO_UDP
Note: Please consult the Streams constant list for further details on each constant.
Returns an array with the two socket resources on success, or
FALSE
on failure.
版本 | 说明 |
---|---|
5.3.0 | This function is now available on Windows platforms. |
Example #1 A stream_socket_pair() example
This example shows the basic usage of stream_socket_pair() in Inter-Process Comunication.
<?php
$sockets = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
$pid = pcntl_fork();
if ($pid == -1) {
die('could not fork');
} else if ($pid) {
/* parent */
fclose($sockets[0]);
fwrite($sockets[1], "child PID: $pid\n");
echo fgets($sockets[1]);
fclose($sockets[1]);
} else {
/* child */
fclose($sockets[1]);
fwrite($sockets[0], "message from child\n");
echo fgets($sockets[0]);
fclose($sockets[0]);
}
?>
以上例程的输出类似于:
child PID: 1378 message from child
Till (2007-08-02 08:47:38)
This is some freak-example how to use this feature to fork to a
bc-command on a Solaris-Server:
<?
$sockets=stream_socket_pair(STREAM_PF_UNIX,STREAM_SOCK_STREAM,
STREAM_IPPROTO_IP);
passthru('
perl -e \'
use strict; my ($x,@x);
open(STDIN,"-|","/bin/pfiles $$");
while (<>) { $x=$1 if(/^ +([0-9]+):/); push(@x,$x) if(/AF_UNIX/); }
print "Starting bc -l 0<&$x[1] 1>&$x[1] $x[0]<&- $x[0]>&- ...\n\n";
exec("bash","-c","bc -l 0<&$x[1] 1>&$x[1] $x[0]<&- $x[0]>&- &");\'');
fclose($sockets[0]);
fwrite($sockets[1],"666*999\n");
print "666*999 = ".fgets($sockets[1])."\n";
fwrite($sockets[1],"./696\n");
print "./696 = ".fgets($sockets[1])."\n";
fwrite($sockets[1],"quit\n");
fclose($sockets[1]);
?>
The big problem is, that there seems to be no way to obtain the real
filedescriptors of the two sockets, but you need them, if you want to
redirect some program's STDOUT and STDIN to one of these sockets.
I misused the /bin/pfiles command on a Solaris UNIX to find them.
Another (non-php-) problem is, that, if you use php in Apache, there
will be already a lot of open filedescriptors and the filedescriptors
of the sockets will be greater than 9. That's why I had to use the bash.
I think it is awful, but it works. Would be great, if someone
would come up with a better idea.