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 — Crea un pareja de flujos de socket conectados e indistinguibles
Descripción
$domain
, int $type
, int $protocol
)stream_socket_pair() crea un pareja de flujos de socket conectados e indistinguibles. Esta fnción se usa normalmente en IPC (Inter-Process Communication, Comunicación entre Procesos).
Parámetros
-
domain -
La familia de protocolos que se va a usar:
STREAM_PF_INET,STREAM_PF_INET6oSTREAM_PF_UNIX -
type -
El tipo de comunicación que se va a usar:
STREAM_SOCK_DGRAM,STREAM_SOCK_RAW,STREAM_SOCK_RDM,STREAM_SOCK_SEQPACKEToSTREAM_SOCK_STREAM -
protocol -
El protocolo que se va a usar:
STREAM_IPPROTO_ICMP,STREAM_IPPROTO_IP,STREAM_IPPROTO_RAW,STREAM_IPPROTO_TCPoSTREAM_IPPROTO_UDP
Nota: Por favor, consulte la lista de constantes de Flujos para más detalles de cada constante.
Valores devueltos
Devuelve un array con los dos recursos de socket si se tuvo éxito, o
FALSE si falló.
Historial de cambios
| Versión | Descripción |
|---|---|
| 5.3.0 | Esta función ahora está disponible en plataformas Windows. |
Ejemplos
Ejemplo #1 Un ejemplo de stream_socket_pair()
Este ejemplo muestra el uso básico de stream_socket_pair() en Comunciación entre Proceses (IPC).
<?php
$sockets = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
$pid = pcntl_fork();
if ($pid == -1) {
die('no se pudo bifurcar');
} else if ($pid) {
/* padre */
fclose($sockets[0]);
fwrite($sockets[1], "PID hijo: $pid\n");
echo fgets($sockets[1]);
fclose($sockets[1]);
} else {
/* hijo */
fclose($sockets[1]);
fwrite($sockets[0], "mensaje desde el hijo\n");
echo fgets($sockets[0]);
fclose($sockets[0]);
}
?>
El resultado del ejemplo sería algo similar a:
PID hijo: 1378 mensaje desde el hijo
