PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

stream_socket_recvfrom> <stream_socket_get_name
Last updated: Fri, 03 Oct 2008

view this page in

stream_socket_pair

(PHP 5 >= 5.1.0)

stream_socket_pair 接続された、区別できないソケットストリームの組を作成する

説明

array stream_socket_pair ( int $domain , int $type , int $protocol )

stream_socket_pair() は、互いに接続されており区別できない ソケットストリームの組を作成します。この関数は、一般に IPC (Inter-Process Communication: プロセス間通信)で使用します。

パラメータ

domain

使用するプロトコルファミリー。STREAM_PF_INETSTREAM_PF_INET6 あるいは STREAM_PF_UNIX

type

使用する接続の型。 STREAM_SOCK_DGRAMSTREAM_SOCK_RAWSTREAM_SOCK_RDMSTREAM_SOCK_SEQPACKET あるいは STREAM_SOCK_STREAM

protocol

使用するプロトコル。STREAM_IPPROTO_ICMPSTREAM_IPPROTO_IPSTREAM_IPPROTO_RAWSTREAM_IPPROTO_TCP あるいは STREAM_IPPROTO_UDP

注意: 各定数についての詳細な情報は ストリーム定数の一覧 を参照ください。

返り値

成功した場合に 2 つのソケットリソースの配列、失敗した場合に FALSE を返します。

例1 stream_socket_pair() の例

この例では、プロセス間通信に stream_socket_pair() を使用する基本的な方法を示します。

<?php

$sockets 
stream_socket_pair(STREAM_PF_UNIXSTREAM_SOCK_STREAMSTREAM_IPPROTO_IP);
$pid     pcntl_fork();

if (
$pid == -1) {
     die(
'フォークできません');

} else if (
$pid) {
     
/* 親プロセス */
    
fclose($sockets[0]);

    
fwrite($sockets[1], "子プロセスの PID: $pid\n");
    echo 
fgets($sockets[1]);

    
fclose($sockets[1]);

} else {
    
/* 子プロセス */
    
fclose($sockets[1]);

    
fwrite($sockets[0], "子プロセスからのメッセージ\n");
    echo 
fgets($sockets[0]);

    
fclose($sockets[0]);
}

?>

上の例の出力は、たとえば 以下のようになります。

子プロセスの PID: 1378
子プロセスからのメッセージ

注意

注意: この関数は Windows 環境にはまだ実装されていません。



add a note add a note User Contributed Notes
stream_socket_pair
Till
03-Aug-2007 12:47
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_recvfrom> <stream_socket_get_name
Last updated: Fri, 03 Oct 2008
 
 
show source | credits | sitemap | contact | advertising | mirror sites