stream_socket_pair
(PHP 5 >= 5.1.0, PHP 7)
stream_socket_pair — Создаёт пару связанных неразличимых потоковых сокетов
Описание
$domain
, int $type
, int $protocol
)stream_socket_pair() создаёт пару связанных неразличимых потоковых сокетов. Эта функция обычно используется в IPC (межпроцессном взаимодействии).
Список параметров
-
domain
-
Используемое семейство протоколов:
STREAM_PF_INET
,STREAM_PF_INET6
илиSTREAM_PF_UNIX
-
type
-
Используемый тип взаимодействия:
STREAM_SOCK_DGRAM
,STREAM_SOCK_RAW
,STREAM_SOCK_RDM
,STREAM_SOCK_SEQPACKET
orSTREAM_SOCK_STREAM
-
protocol
-
Используемый протокол:
STREAM_IPPROTO_ICMP
,STREAM_IPPROTO_IP
,STREAM_IPPROTO_RAW
,STREAM_IPPROTO_TCP
orSTREAM_IPPROTO_UDP
Замечание: Пожалуйста, обратитесь к разделу Список потоковых констант за подробной информацией по каждой константе.
Возвращаемые значения
Возвращает массив array с двумя потоковыми ресурсами в случае успеха, или
FALSE
в случае неудачи.
Список изменений
Версия | Описание |
---|---|
5.3.0 | Теперь эта функция доступна на Windows платформах. |
Примеры
Пример #1 Пример использования stream_socket_pair()
Этот пример демонстрирует основы использования функции stream_socket_pair() в межпроцессном взаимодействии.
<?php
$sockets = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_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 сообщение от дочернего процесса
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Другие базовые расширения
- Потоки
- set_socket_blocking
- stream_bucket_append
- stream_bucket_make_writeable
- stream_bucket_new
- stream_bucket_prepend
- stream_context_create
- stream_context_get_default
- stream_context_get_options
- stream_context_get_params
- stream_context_set_default
- stream_context_set_option
- stream_context_set_params
- stream_copy_to_stream
- stream_encoding
- stream_filter_append
- stream_filter_prepend
- stream_filter_register
- stream_filter_remove
- stream_get_contents
- stream_get_filters
- stream_get_line
- stream_get_meta_data
- stream_get_transports
- stream_get_wrappers
- stream_is_local
- stream_notification_callback
- stream_register_wrapper
- stream_resolve_include_path
- stream_select
- stream_set_blocking
- stream_set_chunk_size
- stream_set_read_buffer
- stream_set_timeout
- stream_set_write_buffer
- stream_socket_accept
- stream_socket_client
- stream_socket_enable_crypto
- stream_socket_get_name
- stream_socket_pair
- stream_socket_recvfrom
- stream_socket_sendto
- stream_socket_server
- stream_socket_shutdown
- stream_supports_lock
- stream_wrapper_register
- stream_wrapper_restore
- stream_wrapper_unregister
Коментарии
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.