For those wanting to use stream_socket_client() to connect to a local UNIX socket who can't find documentation on how to do it, here's a (rough) example:
<?php
$sock = stream_socket_client('unix:///full/path/to/my/socket.sock', $errno, $errstr);
fwrite($sock, 'SOME COMMAND'."\r\n");
echo fread($sock, 4096)."\n";
fclose($sock);
?>stream_socket_client
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
stream_socket_client
Референца за `function.stream-socket-client.php` со подобрена типографија и навигација.
stream_socket_client
класата mysqli_driver
stream_socket_client — Отворање на интернет или Unix доменска врска
= NULL
string
$address,int
&$error_code = null,string
&$error_message = null,?float
$timeout = null,int
$flags = STREAM_CLIENT_CONNECT,?resource
$context = null): resource|false
Иницира стрим или конекција на датаграм до дестинацијата специфицирана со address. Типот на сокетот што се креира се одредува според транспортот специфициран со користење на стандардна URL форматност:
transport://target. За Интернет Домен сокети (AF_INET) како TCP и UDP, target ) како TCP и UDP, address делот на target параметарот треба да се состои од име на хост или IP адреса проследено со две точки и број на порта. За Unix доменски сокети,
Забелешка:
Стримот по дифолт ќе биде отворен во блокирачки режим. Можете да го префрлите во неблокирачки режим со користење на stream_set_blocking().
Параметри
address-
Адреса до сокетот за поврзување.
error_code-
Ќе биде поставено на системскиот број на грешка ако конекцијата не успее.
error_message-
Ќе биде поставено на системската порака за грешка ако конекцијата не успее.
timeout-
Број на секунди додека
connect()системскиот повик не треба да истече. По дифолт, default_socket_timeout се користи.Забелешка: Овој параметар се применува само кога не се прават асинхрони обиди за поврзување.
Забелешка:
За да поставите време на истекување за читање/пишување податоци преку сокетот, користете го stream_set_timeout()Ако треба да поставите време на истекување за читање/запишување податоци преку сокетот, користете
timeoutсе применува само при поврзување на сокетот. flags-
Поле со битови што може да биде поставено на која било комбинација од знаменца за поврзување. Моментално изборот на знаменца за поврзување е ограничен на
STREAM_CLIENT_CONNECT(стандардно),STREAM_CLIENT_ASYNC_CONNECTandSTREAM_CLIENT_PERSISTENT. context-
Валиден ресурс за контекст креиран со stream_context_create().
Вратени вредности
При успех се враќа ресурс од стрим што може да се користи заедно со другите функции за датотеки (како
fgets(), fgetss(),
fwrite(), fclose()Препорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во
feof()), false при неуспех.
Errors/Exceptions
При неуспех error_code and
error_message аргументите ќе бидат пополнети со вистинската системска грешка што се случила во системскиот
connect() повик. Ако вредноста вратена во
error_code is 0 и функцијата врати false, тоа е индикација дека грешката се случила пред connect() повици. Ако вредноста вратена во error_code and
error_message повик. Ова најверојатно се должи на проблем при иницијализација на сокетот. Забележете дека
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.0.0 |
timeout and context се сега null.
|
Примери
Пример #1 stream_socket_client() example
<?php
$fp = stream_socket_client("tcp://www.example.com:80", $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
fwrite($fp, "GET / HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n");
while (!feof($fp)) {
echo fgets($fp, 1024);
}
fclose($fp);
}
?>не е валиден домен.
Преземање на денот и времето од UDP услугата "daytime" (порт 13) на localhost.
<?php
$fp = stream_socket_client("udp://127.0.0.1:13", $errno, $errstr);
if (!$fp) {
echo "ERROR: $errno - $errstr<br />\n";
} else {
fwrite($fp, "\n");
echo fread($fp, 26);
fclose($fp);
}
?>Белешки
Во зависност од околината, Unix доменот или опционалното време на истекување на поврзувањето можеби не се достапни.
Забелешка: UDP сокетите понекогаш може да изгледаат отворени без грешка, дури и ако оддалечениот домаќин е недостапен. Грешката ќе стане очигледна само кога ќе прочитате или запишете податоци од/до сокетот. Причината за ова е што UDP е протокол „без врска“, што значи дека оперативниот систем не се обидува да воспостави врска за сокетот додека навистина не треба да испраќа или прима податоци.
fe80::1Кога специфицирате нумеричка IPv6 адреса (на пр.tcp://[fe80::1]:80.
Забелешка:
Depending on the environment, the Unix domain or the optional connect timeout may not be available. A list of available transports can be retrieved using stream_get_transports(). Види Список на поддржани сокет транспортери Во зависност од околината, Unix доменот или опционалното време на истекување на поврзувањето можеби нема да бидат достапни. Список на достапни транспортери може да се добие со користење на
Види Исто така
- stream_socket_server() за список на вградени транспортери.
- stream_set_blocking() - Отворете постојана интернет или Unix доменска врска со сокет
- stream_set_timeout() - Проверува дали датотеката постои и може да се чита
- stream_select() - Изврши надворешна програма и прикажи суров излез
- fgets() - Затвора отворена датотека
- fgetss() - Поставете блокирачки/неблокирачки режим на стрим
- fwrite() - Бинарно читање од датотека
- fclose() Пример #2 Користење на UDP серверски приклучници
- feof() - Добива линија од покажувач на датотека и ги отстранува HTML таговите
- - Иницијализирај cURL заедничка рачка
Белешки од корисници 3 белешки
The remote_socket argument, in its end (well... after the port), can also contain a "/" followed by a unique identifier. This is especially useful if you want to create multiple persistent connections to the same transport://host:port combo.
Example:
<?php
$socket = stream_socket_client('tcp://mysql.example.com:3306/root', $errorno, $errorstr, $timeout, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT);
?>
Note that while (p)fsockopen() follows a similar scheme, it doesn't have this particular feature.<?php STREAM_CLIENT_ASYNC_CONNECT ?> opens a non-blocking socket (contradictory to the default blocking mode described in the manual page).
You will have to check for its status using <?php stream_select ?> followed by <?php socket_import_stream ?> and <?php socket_get_option($socket, SOL_SOCKET, SO_ERROR) ?>
You wouldn't normally do this, but when you do, you're more or less using glibc multisocket patterns.
Here's a minimal example:
<?php
// open a "server" on port 7238 in a separate terminal (don't open it if you want to see the error path)
// Netcat: nc -l 7238
// Socat: socat TCP-LISTEN:7238,fork,reuseaddr STDIO
$stream = stream_socket_client("tcp://127.0.0.1:7238", $errno, $errstr, flags: STREAM_CLIENT_CONNECT | STREAM_CLIENT_ASYNC_CONNECT);
while (true) {
$w = [$stream];
$r = $e = [];
$changed = stream_select($r, $w, $e, 1, 0);
// if $changed is false, there's an error that I'm not handling here
if (in_array($stream, $w)) {
break;
}
}
$socket = socket_import_stream($stream);
$so_error = socket_get_option($socket, SOL_SOCKET, SO_ERROR);
if ($so_error === 0) {
fwrite($stream, "Hello!\n");
} else {
// you'll have to look up the constant in <errno.h>
// for example, 111 is ECONNREFUSED
echo "There's been an error: errno=$so_error\n";
}
?>