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.
stream_socket_pair
(PHP 5 >= 5.1.0)
stream_socket_pair — Soket akımlarınca ayırt edilebilen bir bağlantı çifti oluşturur
Açıklama
$alan
, int $tür
, int $protokol
)stream_socket_pair() işlevi, soket akımlarınca ayırt edilebilen bir bağlantı çifti oluşturur. Bu işlev genellikle süreçler arası iletişimde kullanılır.
Değiştirgeler
-
alan -
Kullanılacak protokol ailesi:
STREAM_PF_INET,STREAM_PF_INET6veyaSTREAM_PF_UNIX -
tür -
Kullanılacak iletişim türü:
STREAM_SOCK_DGRAM,STREAM_SOCK_RAW,STREAM_SOCK_RDM,STREAM_SOCK_SEQPACKETveyaSTREAM_SOCK_STREAM -
protokol -
Kullanılacak protokol:
STREAM_IPPROTO_ICMP,STREAM_IPPROTO_IP,STREAM_IPPROTO_RAW,STREAM_IPPROTO_TCPveyaSTREAM_IPPROTO_UDP
Bilginize: Bu sabitlerle ilgili açıklamalar için Akım sabitleri listesine bakınız.
Dönen Değerler
Başarısızlık durumunda FALSE. aksi takdirde iki soket özkaynağı içerem
bir dizi döner.
Sürüm Bilgisi
| Sürüm: | Açıklama |
|---|---|
| 5.3.0 | Bu işlev artık Windows üzerinde de kullanılabiliyor. |
Örnekler
Örnek 1 - stream_socket_pair() örneği
Süreçler arası iletişimde stream_socket_pair() işlevinin kullanılımını gösteren bir örnek:
<?php
$sockets = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
$pid = pcntl_fork();
if ($pid == -1) {
die('süreç çatallanamadı');
} else if ($pid) {
/* ebeveyn */
fclose($sockets[0]);
fwrite($sockets[1], "child PID: $pid\n");
echo fgets($sockets[1]);
fclose($sockets[1]);
} else {
/* çocuk */
fclose($sockets[1]);
fwrite($sockets[0], "alt süreçten bir ileti var\n");
echo fgets($sockets[0]);
fclose($sockets[0]);
}
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
child PID: 1378 alt süreçten bir ileti var
