Stream socket client error 0

(PHP 5, PHP 7, PHP 8)

(PHP 5, PHP 7, PHP 8)

stream_socket_clientОткрыть соединение с интернет-сокетом или с доменным сокетом Unix

Описание

stream_socket_client(
    string $address,
    int &$error_code = null,
    string &$error_message = null,
    ?float $timeout = null,
    int $flags = STREAM_CLIENT_CONNECT,
    ?resource $context = null
): resource|false

Замечание:

По умолчанию поток будет открыт в блокирующем режиме. Вы можете
переключить его в неблокирующий режим, используя функцию
stream_set_blocking().

Список параметров

address

Адрес удалённого сокета для соединения.

error_code

Будет присвоен номер системной ошибки, если соединение не удалось установить.

error_message

Будет присвоено сообщение о системной ошибке, если соединение не удалось установить.

timeout

Число секунд, в течение которых должно произойти время ожидания системного
вызова connect(). По умолчанию используется значение default_socket_timeout.

Замечание:

Этот параметр применяется только если не происходит попытка
асинхронного соединения.

Замечание:

Чтобы указать время ожидания для чтения/записи данных через сокет, используйте функцию
stream_set_timeout(), так как параметр
timeout применяется только при создании соединения через
сокет.

flags

Поле битовой маски, которое может принимать значение любой комбинации флагов соединения.
В настоящее время набор флагов соединения ограничен следующими значениями
STREAM_CLIENT_CONNECT (по умолчанию),
STREAM_CLIENT_ASYNC_CONNECT и
STREAM_CLIENT_PERSISTENT.

context

Действующий ресурс контекста, созданный при помощи функции stream_context_create().

Возвращаемые значения

В случае успешного выполнения возвращается ресурс потока, который может быть
использован с другими файловыми функциями (такими, как
fgets(), fgetss(),
fwrite(), fclose(), и
feof()), в случае возникновения ошибки возвращается false.

Ошибки

В случае неудачного вызова функции аргументы error_code и
error_message будут заполнены системной ошибкой,
которая произошла при системном вызове
connect(). Если значение, возвращённое в аргументе
error_code равно 0 и функция
возвратила значение false, это означает, что ошибка
произошла до вызова connect(). Это произошло
скорее всего из-за проблемы инициализации сокета. Примите во внимание,
что аргументы error_code и
error_message всегда будут передаваться по ссылке.

Список изменений

Версия Описание
8.0.0 timeout и context теперь допускают значение null.

Примеры

Пример #1 Пример использования stream_socket_client()


<?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.0rnHost: www.example.comrnAccept: */*rnrn");
while (!
feof($fp)) {
echo
fgets($fp, 1024);
}
fclose($fp);
}
?>

Пример #2 Использование UDP-соединения

Получения дня и времени от UDP-сервиса «daytime» (порт 13)
на localhost.


<?php
$fp
= stream_socket_client("udp://127.0.0.1:13", $errno, $errstr);
if (!
$fp) {
echo
"ОШИБКА: $errno - $errstr<br />n";
} else {
fwrite($fp, "n");
echo
fread($fp, 26);
fclose($fp);
}
?>

Примечания

Внимание

UDP-сокеты иногда могут открываться без ошибки,
даже если удалённый хост недоступен. Ошибка станет заметной
только когда вы будете читать или писать данные из/в сокет.
Причина этого в том, что UDP — это протокол без соединения,
что означает, что операционная система не пытается установить
соединение с сокетом до тех пор, пока ей в действительности
не нужно отправить или получить данные.

Замечание: При указании числового адреса IPv6
(например, fe80::1) вы должны заключать его в квадратные скобки. Например,
tcp://[fe80::1]:80.

Замечание:

В зависимости от окружения, Unix-домены или произвольное
время ожидания соединения могут быть недоступны. Список доступных
транспортов может быть получен используя функцию stream_get_transports().
Смотрите список встроенных транспортов на странице Список поддерживаемых транспортных протоколов.

Смотрите также

  • stream_socket_server() — Создаёт интернет-сокет или доменный сокет Unix
  • stream_set_blocking() — Установить блокирующий/неблокирующий режим в потоке
  • stream_set_timeout() — Установить значение времени ожидания для потока
  • stream_select() — Запускает эквивалент системного вызова select() на заданных массивах
    потоков со временем ожидания, указанным параметрами seconds и microseconds
  • fgets() — Читает строку из файла
  • fgetss() — Читает строку из файла и удаляет HTML-теги
  • fwrite() — Бинарно-безопасная запись в файл
  • fclose() — Закрывает открытый дескриптор файла
  • feof() — Проверяет, достигнут ли конец файла
  • Функции cURL

nicholas at nicholaswilliams dot net

14 years ago


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'."rn");

echo

fread($sock, 4096)."n";fclose($sock);?>


Vasil Rangelov a.k.a. boen_robot

11 years ago


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.


wbeaver at afilias dot info

15 years ago


# Some may find it useful to know that your caCert
# must be in pem format, and that PHP seems to like
# your key, cert, and cacert pem's to be concatenated
# in a single file (I suffered various "unknown chain"
# errors, otherwise)
#
# So, (linux users), concat your components as follows:
# (where current working dir is dir where
# cert components are stored)
#
# cat key.pem >certchain.pem
# cat cert.pem >>certchain.pem
# cat cacert.pem >>certchain.pem
#
# Then, the php....
##################################

<?php

$host

= 'host.domain.tld';
$port = 1234;
$timeout = 10;$cert = '/path/to/your/certchain/certchain.pem';
$context = stream_context_create(array('ssl'=>array('local_cert'=> $cert,
)));

if (

$fp = stream_socket_client('ssl://'.$host.':'.$port, $errno, $errstr, 30,
       
STREAM_CLIENT_CONNECT, $context)) {
   
fwrite($fp, "n");
    echo
fread($fp,8192);
   
fclose($fp);
} else {
   echo
"ERROR: $errno - $errstr<br />n";
}
?>


Daniel

8 years ago


If you only need to check a stream for data, you can use stream_get_content and strtr function. stream_get_content 
reads the remainder of a stream into a string. 
<?php

$addr

= gethostbyname('www.example.com');$client = stream_socket_client("tcp://$addr:80", $errno, $errorMessage);

if(

$client === false){
                throw new
UnexpectedValueException("Failed to connect: $errorMessage");
        }
fwrite($client, "GET / HTTP/1.0rnhost:    'www.example.com'rnAccept: */*rnrn");$variable = stream_get_content($client);

if(

strstr($variable,'data your looking for'))
       echo
"The data you are looking for is here";
else
       echo
"data not found";fclose($client);
?>

robin at gareus dot org

14 years ago


I came here since fsockopen() does not support any SSL certificate checking in PHP5.

while curl is nice, I use stream_socket_client() to make XML-RPC POST requests via HTTPS and since I have not found any PHP code around that does this, I'll attach an example that also includes HTTP-Digest Auth (eg. trac's WikiRPCInterface2):

<?php
#################################################
# $host: hostname ; eg 'example.org'
# $path: request' eg '/index.php?id=123'
# $data_to_send : data to POST after the HTTP header.
#
# if $opts is an  empty array() a standard  HTTP to port 80 request is performed.
#
# set auth['type']='basic' to use plain-text auth,
# digest-auth will be handled automatically if $auth['username'] is set and a 401
# status is encountered. - use auth['type']='nodigest' to override.
#
##
function httpPost($host, $path, $data_to_send,
                 
$opts=array('cert'=>"", 'headers'=>0, 'transport' =>'ssl', 'port'=>443),
                 
$auth=array('username'=>"", 'password'=>"", 'type'=>"")
                 ) {
 
$transport=''; $port=80;
  if (!empty(
$opts['transport'])) $transport=$opts['transport'];
  if (!empty(
$opts['port'])) $port=$opts['port'];
 
$remote=$transport.'://'.$host.':'.$port;$context = stream_context_create();
 
$result = stream_context_set_option($context, 'ssl', 'verify_host', true);
  if (!empty(
$opts['cert'])) {
   
$result = stream_context_set_option($context, 'ssl', 'cafile', $opts['cert']);
   
$result = stream_context_set_option($context, 'ssl', 'verify_peer', true);
  } else {
   
$result = stream_context_set_option($context, 'ssl', 'allow_self_signed', true);
  }
 
$fp = stream_socket_client($remote, $err, $errstr, 60, STREAM_CLIENT_CONNECT, $context);

  if (!

$fp) {
   
trigger_error('httpPost error: '.$errstr);
    return
NULL;
  }
$req='';
 
$req.="POST $path HTTP/1.1rn";
 
$req.="Host: $hostrn";
  if (
$auth['type']=='basic' && !empty($auth['username'])) {
   
$req.="Authorization: Basic ";
   
$req.=base64_encode($auth['username'].':'.$auth['password'])."rn";
  }
  elseif (
$auth['type']=='digest' && !empty($auth['username'])) {
   
$req.='Authorization: Digest ';
    foreach (
$auth as $k => $v) {
      if (empty(
$k) || empty($v)) continue;
      if (
$k=='password') continue;
     
$req.=$k.'="'.$v.'", ';
    }
   
$req.="rn";
  }
 
$req.="Content-type: text/xmlrn";
 
$req.='Content-length: '. strlen($data_to_send) ."rn";
 
$req.="Connection: closernrn";fputs($fp, $req);
 
fputs($fp, $data_to_send);

  while(!

feof($fp)) { $res .= fgets($fp, 128); }
 
fclose($fp);

  if (

$auth['type']!='nodigest'
       
&& !empty($auth['username'])
        &&
$auth['type']!='digest' # prev. digest AUTH failed.
       
&& preg_match("/^HTTP/[0-9.]* 401 /", $res)) {
    if (
1 == preg_match("/WWW-Authenticate: Digest ([^nr]*)rn/Us", $res, $matches)) {
      foreach (
split(",", $matches[1]) as $i) {
       
$ii=split("=",trim($i),2);
        if (!empty(
$ii[1]) && !empty($ii[0])) {
         
$auth[$ii[0]]=preg_replace("/^"/",'', preg_replace("/"$/",'', $ii[1]));
        }
      }
     
$auth['type']='digest';
     
$auth['uri']='https://'.$host.$path;
     
$auth['cnonce']=randomNonce();
     
$auth['nc']=1;
     
$a1=md5($auth['username'].':'.$auth['realm'].':'.$auth['password']);
     
$a2=md5('POST'.':'.$auth['uri']);
     
$auth['response']=md5($a1.':'
                          
.$auth['nonce'].':'.$auth['nc'].':'
                          
.$auth['cnonce'].':'.$auth['qop'].':'.$a2);
      return
httpPost($host, $path, $data_to_send, $opts, $auth);
    }
  }

  if (

1 != preg_match("/^HTTP/[0-9.]* ([0-9]{3}) ([^rn]*)/", $res, $matches)) {
   
trigger_error('httpPost: invalid HTTP reply.');
    return
NULL;
  }

  if (

$matches[1] != '200') {
   
trigger_error('httpPost: HTTP error: '.$matches[1].' '.$matches[2]);
    return
NULL;
  }

  if (!

$opts['headers']) {
   
$res=preg_replace("/^.*rnrn/Us",'',$res);
  }
  return
$res;
}
?>


bisho at onirica dot com

12 years ago


stream_socket_client is much easier and faster to use to direct sockets, because you can use directly fwrite / fget / fclose functions, but I find hard to find how to connect to a UNIX domain socket. The URL to use is "udg:///path/to/socket".

For example, to log to the log socket (like syslog), you can use:

<?php
$socket
= stream_socket_client('udg:///dev/log',
       
$errorno,
       
$errorstr,
       
$timeout);
fwrite($socket, ...);
?>


Содержание

  1. stream_socket_client
  2. Описание
  3. Список параметров
  4. Возвращаемые значения
  5. Ошибки
  6. Список изменений
  7. Примеры
  8. Примечания
  9. Смотрите также
  10. User Contributed Notes 6 notes
  11. stream_socket_client
  12. Описание
  13. Список параметров
  14. Возвращаемые значения
  15. Ошибки
  16. Примеры
  17. Примечания
  18. Смотрите также

stream_socket_client

(PHP 5, PHP 7, PHP 8)

stream_socket_client — Открыть соединение с интернет-сокетом или с доменным сокетом Unix

Описание

Начинает соединение потока или датаграммы с удалённым сокетом, указанным параметром address . Тип создаваемого сокета определяется по транспорту, указанному с использованием стандартного форматирования URL: transport://target . Для интернет-сокетов, (AF_INET) таких, как TCP и UDP, часть target параметра address должна состоять из имени хоста или IP-адреса, за которым следует двоеточие и номер порта. Для доменных сокетов Unix, часть target должна указывать на файл сокета в файловой системе.

По умолчанию поток будет открыт в блокирующем режиме. Вы можете переключить его в неблокирующий режим, используя функцию stream_set_blocking() .

Список параметров

Адрес удалённого сокета для соединения.

Будет присвоен номер системной ошибки, если соединение не удалось установить.

Будет присвоено сообщение о системной ошибке, если соединение не удалось установить.

Число секунд, в течение которых должно произойти время ожидания системного вызова connect() . По умолчанию используется значение default_socket_timeout.

Замечание: Этот параметр применяется только если не происходит попытка асинхронного соединения.

Чтобы указать время ожидания для чтения/записи данных через сокет, используйте функцию stream_set_timeout() , так как параметр timeout применяется только при создании соединения через сокет.

Поле битовой маски, которое может принимать значение любой комбинации флагов соединения. В настоящее время набор флагов соединения ограничен следующими значениями STREAM_CLIENT_CONNECT (по умолчанию), STREAM_CLIENT_ASYNC_CONNECT и STREAM_CLIENT_PERSISTENT .

Действующий ресурс контекста, созданный при помощи функции stream_context_create() .

Возвращаемые значения

В случае успешного выполнения возвращается ресурс потока, который может быть использован с другими файловыми функциями (такими, как fgets() , fgetss() , fwrite() , fclose() , и feof() ), в случае возникновения ошибки возвращается false .

Ошибки

В случае неудачного вызова функции аргументы error_code и error_message будут заполнены системной ошибкой, которая произошла при системном вызове connect() . Если значение, возвращённое в аргументе error_code равно 0 и функция возвратила значение false , это означает, что ошибка произошла до вызова connect() . Это произошло скорее всего из-за проблемы инициализации сокета. Примите во внимание, что аргументы error_code и error_message всегда будут передаваться по ссылке.

Список изменений

Версия Описание
8.0.0 timeout и context теперь допускают значение null.

Примеры

Пример #1 Пример использования stream_socket_client()

Пример #2 Использование UDP-соединения

Получения дня и времени от UDP-сервиса «daytime» (порт 13) на localhost.

Примечания

UDP-сокеты иногда могут открываться без ошибки, даже если удалённый хост недоступен. Ошибка станет заметной только когда вы будете читать или писать данные из/в сокет. Причина этого в том, что UDP — это протокол без соединения, что означает, что операционная система не пытается установить соединение с сокетом до тех пор, пока ей в действительности не нужно отправить или получить данные.

Замечание: При указании числового адреса IPv6 (например, fe80::1 ) вы должны заключать его в квадратные скобки. Например, tcp://[fe80::1]:80 .

В зависимости от окружения, Unix-домены или произвольное время ожидания соединения могут быть недоступны. Список доступных транспортов может быть получен используя функцию stream_get_transports() . Смотрите список встроенных транспортов на странице Список поддерживаемых транспортных протоколов.

Смотрите также

  • stream_socket_server() — Создаёт интернет-сокет или доменный сокет Unix
  • stream_set_blocking() — Установить блокирующий/неблокирующий режим в потоке
  • stream_set_timeout() — Установить значение времени ожидания для потока
  • stream_select() — Запускает эквивалент системного вызова select() на заданных массивах потоков со временем ожидания, указанным параметрами seconds и microseconds
  • fgets() — Читает строку из файла
  • fgetss() — Читает строку из файла и удаляет HTML-теги
  • fwrite() — Бинарно-безопасная запись в файл
  • fclose() — Закрывает открытый дескриптор файла
  • feof() — Проверяет, достигнут ли конец файла
  • Функции cURL

User Contributed Notes 6 notes

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:

= stream_socket_client ( ‘unix:///full/path/to/my/socket.sock’ , $errno , $errstr );

fwrite ( $sock , ‘SOME COMMAND’ . «rn» );

echo fread ( $sock , 4096 ). «n» ;

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:
= 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.

# Some may find it useful to know that your caCert
# must be in pem format, and that PHP seems to like
# your key, cert, and cacert pem’s to be concatenated
# in a single file (I suffered various «unknown chain»
# errors, otherwise)
#
# So, (linux users), concat your components as follows:
# (where current working dir is dir where
# cert components are stored)
#
# cat key.pem >certchain.pem
# cat cert.pem >>certchain.pem
# cat cacert.pem >>certchain.pem
#
# Then, the php.
##################################

= ‘host.domain.tld’ ;
$port = 1234 ;
$timeout = 10 ;

$cert = ‘/path/to/your/certchain/certchain.pem’ ;
$context = stream_context_create (array( ‘ssl’ =>array( ‘local_cert’ => $cert ,
)));

if ( $fp = stream_socket_client ( ‘ssl://’ . $host . ‘:’ . $port , $errno , $errstr , 30 ,
STREAM_CLIENT_CONNECT , $context )) <
fwrite ( $fp , «n» );
echo fread ( $fp , 8192 );
fclose ( $fp );
> else <
echo «ERROR: $errno — $errstr
n» ;
>

If you only need to check a stream for data, you can use stream_get_content and strtr function. stream_get_content
reads the remainder of a stream into a string.
= gethostbyname ( ‘www.example.com’ );

$client = stream_socket_client ( «tcp:// $addr :80» , $errno , $errorMessage );

if( $client === false ) <
throw new UnexpectedValueException ( «Failed to connect: $errorMessage » );
>

fwrite ( $client , «GET / HTTP/1.0rnhost: ‘www.example.com’rnAccept: */*rnrn» );

$variable = stream_get_content ( $client );

if( strstr ( $variable , ‘data your looking for’ ))
echo «The data you are looking for is here» ;
else
echo «data not found» ;

I came here since fsockopen() does not support any SSL certificate checking in PHP5.

while curl is nice, I use stream_socket_client() to make XML-RPC POST requests via HTTPS and since I have not found any PHP code around that does this, I’ll attach an example that also includes HTTP-Digest Auth (eg. trac’s WikiRPCInterface2):

#################################################
# $host: hostname ; eg ‘example.org’
# $path: request’ eg ‘/index.php?id=123’
# $data_to_send : data to POST after the HTTP header.
#
# if $opts is an empty array() a standard HTTP to port 80 request is performed.
#
# set auth[‘type’]=’basic’ to use plain-text auth,
# digest-auth will be handled automatically if $auth[‘username’] is set and a 401
# status is encountered. — use auth[‘type’]=’nodigest’ to override.
#
##
function httpPost ( $host , $path , $data_to_send ,
$opts =array( ‘cert’ => «» , ‘headers’ => 0 , ‘transport’ => ‘ssl’ , ‘port’ => 443 ),
$auth =array( ‘username’ => «» , ‘password’ => «» , ‘type’ => «» )
) <
$transport = » ; $port = 80 ;
if (!empty( $opts [ ‘transport’ ])) $transport = $opts [ ‘transport’ ];
if (!empty( $opts [ ‘port’ ])) $port = $opts [ ‘port’ ];
$remote = $transport . ‘://’ . $host . ‘:’ . $port ;

$context = stream_context_create ();
$result = stream_context_set_option ( $context , ‘ssl’ , ‘verify_host’ , true );
if (!empty( $opts [ ‘cert’ ])) <
$result = stream_context_set_option ( $context , ‘ssl’ , ‘cafile’ , $opts [ ‘cert’ ]);
$result = stream_context_set_option ( $context , ‘ssl’ , ‘verify_peer’ , true );
> else <
$result = stream_context_set_option ( $context , ‘ssl’ , ‘allow_self_signed’ , true );
>
$fp = stream_socket_client ( $remote , $err , $errstr , 60 , STREAM_CLIENT_CONNECT , $context );

if (! $fp ) <
trigger_error ( ‘httpPost error: ‘ . $errstr );
return NULL ;
>

$req = » ;
$req .= «POST $path HTTP/1.1rn» ;
$req .= «Host: $host rn» ;
if ( $auth [ ‘type’ ]== ‘basic’ && !empty( $auth [ ‘username’ ])) <
$req .= «Authorization: Basic » ;
$req .= base64_encode ( $auth [ ‘username’ ]. ‘:’ . $auth [ ‘password’ ]). «rn» ;
>
elseif ( $auth [ ‘type’ ]== ‘digest’ && !empty( $auth [ ‘username’ ])) <
$req .= ‘Authorization: Digest ‘ ;
foreach ( $auth as $k => $v ) <
if (empty( $k ) || empty( $v )) continue;
if ( $k == ‘password’ ) continue;
$req .= $k . ‘=»‘ . $v . ‘», ‘ ;
>
$req .= «rn» ;
>
$req .= «Content-type: text/xmlrn» ;
$req .= ‘Content-length: ‘ . strlen ( $data_to_send ) . «rn» ;
$req .= «Connection: closernrn» ;

fputs ( $fp , $req );
fputs ( $fp , $data_to_send );

if ( 1 != preg_match ( «/^HTTP/[0-9.]* ([0-9]<3>) ([^rn]*)/» , $res , $matches )) <
trigger_error ( ‘httpPost: invalid HTTP reply.’ );
return NULL ;
>

if ( $matches [ 1 ] != ‘200’ ) <
trigger_error ( ‘httpPost: HTTP error: ‘ . $matches [ 1 ]. ‘ ‘ . $matches [ 2 ]);
return NULL ;
>

if (! $opts [ ‘headers’ ]) <
$res = preg_replace ( «/^.*rnrn/Us» , » , $res );
>
return $res ;
>
?>

Источник

stream_socket_client

stream_socket_client — Открыть соединение с интернет-сокетом или с доменным сокетом Unix

Описание

Начинает соединение потока или датаграммы с удалённым сокетом, указанным параметром remote_socket . Тип создаваемого сокета определяется по транспорту, указанному с использованием стандартного форматирования URL: transport://target. Для интернет-сокетов, (AF_INET) таких, как TCP и UDP, часть target параметра remote_socket должна состоять из имени хоста или IP-адреса, за которым следует двоеточие и номер порта. Для доменных сокетов Unix, часть target должна указывать на файл сокета в файловой системе.

По умолчанию поток будет открыт в блокирующем режиме. Вы можете переключить его в неблокирующий режим, используя функцию stream_set_blocking() .

Список параметров

Адрес удалённого сокета для соединения.

Будет присвоен номер системной ошибки, если соединение не удалось установить.

Будет присвоено сообщение о системной ошибке, если соединение не удалось установить.

Число секунд, в течение которых должен произойти тайм-аут системного вызова connect().

Замечание: Этот параметр применяется только если не происходит попытка асинхронного соединения.

Чтобы указать тайм-аут для чтения/записи данных через сокет, используйте функцию stream_set_timeout() , так как параметр timeout применяется только при создании соединения через сокет.

Поле битовой маски, которое может принимать значение любой комбинации флагов соединения. В настоящее время набор флагов соединения ограничен следующими значениями STREAM_CLIENT_CONNECT (по умолчанию), STREAM_CLIENT_ASYNC_CONNECT и STREAM_CLIENT_PERSISTENT .

Действующий ресурс контекста, созданный при помощи функции stream_context_create() .

Возвращаемые значения

В случае успешного выполнения возвращается ресурс потока, который может быть использован с другими файловыми функциями (такими, как fgets() , fgetss() , fwrite() , fclose() , и feof() ), в случае возникновения ошибки возвращается FALSE .

Ошибки

В случае неудачного вызова функции аргументы errno и errstr будут заполнены системной ошибкой, которая произошла при системном вызове connect(). Если значение, возвращённое в аргументе errno равно и функция возвратила значение FALSE , это означает, что ошибка произошла до вызова connect(). Это произошло скорее всего из-за проблемы инициализации сокета. Примите во внимание, что аргументы errno и errstr всегда будут передаваться по ссылке.

Примеры

Пример #1 Пример использования stream_socket_client()

Пример #2 Использование UDP-соединения

Получения дня и времени от UDP-сервиса «daytime» (порт 13) на localhost.

Примечания

UDP-сокеты иногда могут открываться без ошибки, даже если удалённый хост недоступен. Ошибка станет заметной только когда вы будете читать или писать данные из/в сокет. Причина этого в том, что UDP — это протокол без соединения, что означает, что операционная система не пытается установить соединение с сокетом до тех пор, пока ей в действительности не нужно отправить или получить данные.

Замечание: При указании числового адреса IPv6 (например, fe80::1) вы должны заключать его в квадратные скобки. Например, tcp://[fe80::1]:80.

В зависимости от окружения, Unix-домены или произвольный таймаут соединения могут быть недоступны. Список доступных транспортов может быть получен используя функцию stream_get_transports() . Смотрите список встроенных транспортов на странице Список поддерживаемых транспортных протоколов.

Смотрите также

  • stream_socket_server() — Создаёт интернет-сокет или доменный сокет Unix
  • stream_set_blocking() — Установить блокирующий/неблокирующий режим в потоке
  • stream_set_timeout() — Установить значение тайм-аута для потока
  • stream_select() — Запускает эквивалент системного вызова select() на заданных массивах потоков с таймаутом, указанным параметрами tv_sec и tv_usec
  • fgets() — Читает строку из файла
  • fgetss() — Читает строку из файла и удаляет HTML-теги
  • fwrite() — Бинарно-безопасная запись в файл
  • fclose() — Закрывает открытый дескриптор файла
  • feof() — Проверяет, достигнут ли конец файла
  • Функции cURL

Источник

stream_socket_client

(PHP 5, PHP 7)

stream_socket_clientОткрывает соединение с интернет-сокетом или с доменным сокетом Unix

Описание

resource stream_socket_client
( string $remote_socket
[, int &$errno
[, string &$errstr
[, float $timeout = ini_get(«default_socket_timeout»)
[, int $flags = STREAM_CLIENT_CONNECT
[, resource $context
]]]]] )

Замечание:

По умолчанию поток будет открыт в блокирующем режиме. Вы можете
переключить его в неблокирующий режим, используя функцию
stream_set_blocking().

Список параметров

remote_socket

Адрес удалённого сокета для соединения.

errno

Будет присвоен номер системной ошибки, если соединение не удалось установить.

errstr

Будет присвоено сообщение о системной ошибке, если соединение не удалось установить.

timeout

Число секунд, в течение которых должен произойти тайм-аут системного
вызова connect().

Замечание:

Этот параметр применяется только если не происходит попытка
асинхронного соединения.

Замечание:

Чтобы указать тайм-аут для чтения/записи данных через сокет, используйте функцию
stream_set_timeout(), так как параметр
timeout применяется только при создании соединения через
сокет.

flags

Поле битовой маски, которое может принимать значение любой комбинации флагов соединения.
В настоящее время набор флагов соединения ограничен следующими значениями
STREAM_CLIENT_CONNECT (по умолчанию),
STREAM_CLIENT_ASYNC_CONNECT и
STREAM_CLIENT_PERSISTENT.

context

Действующий ресурс контекста, созданный при помощи функции stream_context_create().

Возвращаемые значения

В случае успеха возвращается ресурс потока, который может быть
использован с другими файловыми функциями (такими, как
fgets(), fgetss(),
fwrite(), fclose(), и
feof()), в случае неудачи возвращается FALSE.

Ошибки

В случае неудачного вызова функции аргументы errno и
errstr будут заполнены системной ошибкой,
которая произошла при системном вызове
connect(). Если значение, возвращённое в аргументе
errno равно 0 и функция
возвратила значение FALSE, это означает, что ошибка
произошла до вызова connect(). Это произошло
скорее всего из-за проблемы инициализации сокета. Примите во внимание,
что аргументы errno и
errstr всегда будут передаваться по ссылке.

Примеры

Пример #1 Пример использования функции stream_socket_client()


<?php
$fp 
stream_socket_client("tcp://www.example.com:80"$errno$errstr30);
if (!
$fp) {
    echo 
"$errstr ($errno)<br />n";
} else {
    
fwrite($fp"GET / HTTP/1.0rnHost: www.example.comrnAccept: */*rnrn");
    while (!
feof($fp)) {
        echo 
fgets($fp1024);
    }
    
fclose($fp);
}
?>

Пример #2 Использование UDP-соединения

Получения дня и времени от UDP-сервиса «daytime» (порт 13)
на localhost.


<?php
$fp 
stream_socket_client("udp://127.0.0.1:13"$errno$errstr);
if (!
$fp) {
    echo 
"ОШИБКА: $errno - $errstr<br />n";
} else {
    
fwrite($fp"n");
    echo 
fread($fp26);
    
fclose($fp);
}
?>

Примечания

Внимание

UDP-сокеты иногда могут открываться без ошибки,
даже если удалённый хост недоступен. Ошибка станет заметной
только когда вы будете читать или писать данные из/в сокет.
Причина этого в том, что UDP — это протокол без соединения,
что означает, что операционная система не пытается установить
соединение с сокетом до тех пор, пока ей в действительности
не нужно отправить или получить данные.

Замечание: При указании числового адреса IPv6
(например, fe80::1) вы должны заключать его в квадратные скобки. Например,
tcp://[fe80::1]:80.

Замечание:

В зависимости от окружения, Unix-домены или произвольный
таймаут соединения могут быть недоступны. Список доступных
транспортов может быть получен используя функцию stream_get_transports().
Смотрите список встроенных транспортов на странице Список поддерживаемых транспортных протоколов.

Смотрите также

  • stream_socket_server() — Создаёт интернет-сокет или доменный сокет Unix
  • stream_set_blocking() — Устанавливает блокирующий/неблокирующий режим на потоке
  • stream_set_timeout() — Устанавливает значение тайм-аута на потоке
  • stream_select() — Запускает эквивалент системного вызова select() на заданных массивах
    потоков с таймаутом, указанным параметрами tv_sec и tv_usec
  • fgets() — Читает строку из файла
  • fgetss() — Прочитать строку из файла и отбросить HTML-теги
  • fwrite() — Бинарно-безопасная запись в файл
  • fclose() — Закрывает открытый дескриптор файла
  • feof() — Проверяет, достигнут ли конец файла
  • cURL

Вернуться к: Функции для работы с потоками

(PHP 5, PHP 7, PHP 8)

stream_socket_client-Открытое сокетное соединение Интернета или домена Unix

Description

stream_socket_client(
 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 часть параметра address должна состоять из имени хоста или IP-адреса, за которыми следует двоеточие и номер порта. Для сокетов домена Unix target часть должна указывать на файл сокета в файловой системе.

Note:

По умолчанию поток будет открыт в режиме блокировки. Вы можете переключить его в неблокирующий режим, используя stream_set_blocking () .

Parameters

address

Адрес к разъему для подключения.

error_code

В случае сбоя соединения будет установлен номер ошибки системного уровня.

error_message

В случае сбоя соединения будет установлено сообщение об ошибке на системном уровне.

timeout

Количество секунд до истечения времени ожидания системного вызова connect() .По умолчанию используется default_socket_timeout .

Примечание . Этот параметр применяется только в том случае, если попытки асинхронного подключения не выполняются.

Note:

Чтобы установить тайм-аут для чтения / записи данных через сокет, используйте stream_set_timeout () , поскольку timeout применяется только при подключении к сокету.

flags

Поле Bitmask, которое может быть установлено на любую комбинацию флагов соединения. В настоящее время выбор флагов подключения ограничен STREAM_CLIENT_CONNECT (по умолчанию), STREAM_CLIENT_ASYNC_CONNECT и STREAM_CLIENT_PERSISTENT .

context

Допустимый ресурс контекста, созданный с помощью stream_context_create () .

Return Values

В случае успеха возвращается потоковый ресурс, который может использоваться вместе с другими файловыми функциями (такими как fgets () , fgetss () , fwrite () , fclose () и feof () ), false в случае неудачи.

Errors/Exceptions

В случае сбоя аргументы error_code и error_message будут заполнены фактической ошибкой системного уровня, которая произошла при вызове системного уровня connect() .Если значение, возвращаемое в error_code , равно 0 , а функция вернула false , это указывает на то, что ошибка произошла до вызова connect() .Скорее всего, это связано с проблемой инициализации сокета. Обратите внимание, что аргументы error_code и error_message всегда будут передаваться по ссылке.

Changelog

Version Description
8.0.0 timeout и context теперь могут быть обнулены.

Examples

Пример # 1 stream_socket_client () Пример

<?php
$fp = stream_socket_client("tcp://www.example.com:80"$errno$errstr30);
if (!$fp) {
    echo "$errstr ($errno)<br />n";
} else {
    fwrite($fp"GET / HTTP/1.0rnHost: www.example.comrnAccept: */*rnrn");
    while (!feof($fp)) {
        echo fgets($fp1024);
    }
    fclose($fp);
}
?>

Пример # 2 Использование UDP-соединения

Получение дня и времени с UDP-сервиса «днем» (порт 13)на локальном хосте.

<?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($fp26);
    fclose($fp);
}
?>

Notes

Warning

Иногда кажется,что UDP-сокеты открылись без ошибок,даже если удаленный хост недоступен.Ошибка будет проявляться только при чтении или записи данных в/из сокета.Причина этого кроется в том,что UDP-протокол «без соединения»,что означает,что операционная система не пытается установить соединение для сокета до тех пор,пока ему на самом деле не понадобится отправить или получить данные.

Примечание . При указании числового IPv6-адреса (например , fe80::1 ) необходимо заключить IP-адрес в квадратные скобки, например, tcp://[fe80::1]:80 .

Note:

В зависимости от среды домен Unix или дополнительный тайм-аут подключения могут быть недоступны. Список доступных транспортов можно получить с помощью stream_get_transports () . См. Список поддерживаемых транспортов сокетов для получения списка встроенных транспортов.

See Also

  • stream_socket_server () — Создает сокет сервера домена Internet или Unix
  • stream_set_blocking () — Устанавливает режим блокировки / неблокирования для потока
  • stream_set_timeout () — Устанавливает время ожидания в потоке
  • stream_select() — запускает эквивалент системного вызова select() для заданных массивов потоков с тайм-аутом, указанным в секундах и микросекундах.
  • fgets () — Получает строку из указателя файла
  • fgetss () — Получает строку из указателя файла и удаляет HTML-теги
  • fwrite () — Бинарно-безопасная запись файла
  • fclose () — закрывает указатель открытого файла
  • feof () — Проверяет конец файла на указателе файла
  • cURL Functions

Old Directory with missing and broken directions.

Today I had a weird one.

The PHP function named stream_socket_client(), used to create a socket to communicate with another computer over a network, may return $errno = 0 and $errstr = «».

The PHP reference actually mentions the problem:

On failure the errno and errstr arguments will be populated with the actual system level error that occurred in the system-level connect() call. If the value returned in errno is 0 and the function returned FALSE, it is an indication that the error occurred before the connect() call. This is most likely due to a problem initializing the socket. Note that the errno and errstr arguments will always be passed by reference.

As we can see, they say clearly that the function may return false without setting the error number or message. This is generally because an initialization failed. They just don’t tell you what failed… and no error in the error logs either. Nothing.

So this is a difficult one to debug since you could have all sorts of reasons why that call fails the initialization.

Maybe you have an invalid $context parameter.

It could be that you need to specify where the SSL certificate are found on your computer (really that should be automatic…)

Or in my case, it was the protocol used that was not supported on the platform where PHP eFax was installed. That platform (RedHat EL7) did not understand the «tls://» protocol. Instead, it wanted to see «ssl://». Oh well! Talk about walking in the fog.

Some people also reported having problems because a certificate was missing.

Either way, if you have such an error, you’ll have to test everything… until it works. Since there is no real feedback, you won’t be able to do much else. Someone mentioned the possibility to use a trace and see where the error occurs, but I have not tested that. (I’m not too sure how you can do that and I don’t see how that could work since the stream function is in C, not a PHP class.)

As mentioned in a comment, you may also want to check your firewall. Obviously, if you block the port or IP address, it won’t work as expected. The nc tool may help you to verify that you can connect to whatever you are trying to connect to.

If you ran in the same situation and found yet a different solution to fix the problem, please comment below with your solution to help others with this one! Thank you.

stream_socket_client

Open Internet or Unix domain socket connection

Description

resource stream_socket_client
( string $remote_socket
[, int &$errno
[, string &$errstr
[, float $timeout = ini_get(«default_socket_timeout»)
[, int $flags = STREAM_CLIENT_CONNECT
[, resource $context
]]]]] )

Note:

The stream will by default be opened in blocking mode. You can
switch it to non-blocking mode by using
stream_set_blocking.

Parameters

remote_socket

Address to the socket to connect to.

errno

Will be set to the system level error number if connection fails.

errstr

Will be set to the system level error message if the connection fails.

timeout

Number of seconds until the connect() system call
should timeout.

Note:

This parameter only applies when not making asynchronous
connection attempts.

Note:

To set a timeout for reading/writing data over the socket, use the
stream_set_timeout, as the
timeout only applies while making connecting
the socket.

flags

Bitmask field which may be set to any combination of connection flags.
Currently the select of connection flags is limited to
STREAM_CLIENT_CONNECT (default),
STREAM_CLIENT_ASYNC_CONNECT and
STREAM_CLIENT_PERSISTENT.

context

A valid context resource created with stream_context_create.

Return Values

On success a stream resource is returned which may
be used together with the other file functions (such as
fgets, fgetss,
fwrite, fclose, and
feof), FALSE on failure.

Errors/Exceptions

On failure the errno and
errstr arguments will be populated with the actual
system level error that occurred in the system-level
connect() call. If the value returned in
errno is 0 and the
function returned FALSE, it is an indication that the error
occurred before the connect() call. This is
most likely due to a problem initializing the socket. Note that
the errno and
errstr arguments will always be passed by
reference.

Examples

Example #1 stream_socket_client example


<?php
$fp 
stream_socket_client("tcp://www.example.com:80"$errno$errstr30);
if (!
$fp) {
    echo 
"$errstr ($errno)<br />n";
} else {
    
fwrite($fp"GET / HTTP/1.0rnHost: www.example.comrnAccept: */*rnrn");
    while (!
feof($fp)) {
        echo 
fgets($fp1024);
    }
    
fclose($fp);
}
?>

Example #2 Using UDP connection

Retrieving the day and time from the UDP service «daytime» (port 13)
on 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($fp26);
    
fclose($fp);
}
?>

Notes

Warning

UDP sockets will sometimes appear to have opened without an error,
even if the remote host is unreachable. The error will only
become apparent when you read or write data to/from the socket.
The reason for this is because UDP is a «connectionless» protocol,
which means that the operating system does not try to establish
a link for the socket until it actually needs to send or receive data.

Note: When specifying a numerical IPv6 address
(e.g. fe80::1), you must enclose the IP in square
brackets—for example, tcp://[fe80::1]:80.

Note:

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.
See List of Supported Socket Transports for a list of built in transports.

See Also

  • stream_socket_server
  • stream_set_blocking
  • stream_set_timeout
  • stream_select
  • fgets
  • fgetss
  • fwrite
  • fclose
  • feof
  • cURL Functions
 

Добрый день.

Тут на форуме есть похожая тема:  

https://dev.1c-bitrix.ru/support/forum/forum6/topic97363/

но не нашел на решения.

Суть проблемы: установил систему оплаты яндекс касса (от 3), все прописал правильно

http://prntscr.com/r6r1dt
http://prntscr.com/r6r1oy

об этом мне даже сказала служба поддержки яндекс кассы

Система оплаты видна на сайта при оформлении заказа, ее можно выбрать и оформить с ней заказ, но после на странице где есть переход на саму оплату и при попытки перейти к оплате  (  /personal/order/payment/?ORDER_ID=50&PAYMENT_ID=50/1 )  — происходит ошибка    Socket connection error   (только эта строка и выходит,  на этой странице просто вызов bitrix:sale.order.payment, он и вызывает эту ошибку)

сайт на https, при проверке в админке битрикса ошибок сокетов нету

я попробовал найти в коде эту ошибку, и обнаружил следующее
если запустить такой код:

Код
<?
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");
$APPLICATION->SetTitle("test");

use BitrixMainApplication,
    BitrixMainWebUri,
    BitrixMainWebHttpClient;

function PRX($e) {
    echo "<pre>".print_r($e,true)."</pre>";
}

// опции по умолчанию:
$options = array(
    "redirect" => true, // true, если нужно выполнять редиректы
    "redirectMax" => 5, // Максимальное количество редиректов
    "waitResponse" => true, // true - ждать ответа, false - отключаться после запроса
    "socketTimeout" => 30, // Таймаут соединения, сек
    "streamTimeout" => 60, // Таймаут чтения ответа, сек, 0 - без таймаута
    "version" => HttpClient::HTTP_1_0, // версия HTTP (HttpClient::HTTP_1_0 или HttpClient::HTTP_1_1)
    "proxyHost" => "", // адрес
    "proxyPort" => "", // порт
    "proxyUser" => "", // имя
    "proxyPassword" => "", // пароль
    "compress" => false, // true - принимать gzip (Accept-Encoding: gzip)
    "charset" => "", // Кодировка тела для POST и PUT
    "disableSslVerification" => false, // true - отключить проверку ssl (с 15.5.9)
);
$httpClient = new HttpClient($options);
$params = array( 'a'=> 1 );    


$url = 'https://winkyou.ru'; 
$postData = json_encode($params);
$response = $httpClient->post($url, $postData);
if ($response === false){
    $errors = $httpClient->getError();
    PRX( $errors );
} else {
    PRX("OK");
}

$url = 'https://payment.yandex.net/api/v3/payments';
echo $url;
$postData = json_encode($params);
$response = $httpClient->post($url, $postData);
if ($response === false){
    $errors = $httpClient->getError();
    PRX( $errors );
}else {
    PRX("OK");
}

$url = 'https://myeggershop.ru';
echo $url;
$postData = json_encode($params);
$response = $httpClient->post($url, $postData);
if ($response === false){
    $errors = $httpClient->getError();
    PRX( $errors );
}else {
    PRX("OK");
}

( по сути такие же запросы и компонент кассы юзает )
то этот код выводит следующее:

т.е. проблема именно когда идет обращение к яндекс кассе, при этом такая же ошибка возникает, если обратиться например по несуществующему адресу например:

https://asdfasdfa.ru https://payment.yandex.net/api/v3/payments

 — этот адрес юзается яндекс кассой, однако выдает ошибку, поддержка яндекса пишет — что проблема не у них (наш домен не забанен), хостер тоже пишет, что де мол https в норме.

редакция битрикса:  1С-Битрикс: Управление сайтом 20.0.450. © Битрикс, 2016

еще попробовал установить модуль

Мибок: Платежный модуль для сайта

(mibok.pay)   — тоже для яндекс кассы, но эффект тот же самый.

В чем может быть проблема?

поддержка яндекс касса послала к поддержке битрикса, поддержка битрикса — говорит мол очень плотный график, в течении 4 дней ответят

PHP 5, PHP 7, PHP 8

stream_socket_client — Open Internet or Unix domain socket connection

stream_socket_client(
     string$address,
     [interror_code = null],
     [stringerror_message = null],
     [float|null$timeout = null],
     [int$flags = STREAM_CLIENT_CONNECT],
     [resource|null$context = null]
): resource|false

Initiates a stream or datagram connection to the destination specified
by address. The type of socket created
is determined by the transport specified using standard URL formatting:
transport://target. For Internet Domain sockets
(AF_INET) such as TCP and UDP, the target portion
of the address parameter should consist of
a hostname or IP address followed by a colon and a port number. For Unix
domain sockets, the target portion should point
to the socket file on the filesystem.

Note:

The stream will by default be opened in blocking mode. You can
switch it to non-blocking mode by using
stream_set_blocking.

Parameters

address

Address to the socket to connect to.

error_code

Will be set to the system level error number if connection fails.

error_message

Will be set to the system level error message if the connection fails.

timeout

Number of seconds until the connect() system call
should timeout. By default, default_socket_timeout
is used.

Note:

This parameter only applies when not making asynchronous
connection attempts.

Note:

To set a timeout for reading/writing data over the socket, use the
stream_set_timeout, as the
timeout only applies while making connecting
the socket.

flags

Bitmask field which may be set to any combination of connection flags.
Currently the select of connection flags is limited to
STREAM_CLIENT_CONNECT (default),
STREAM_CLIENT_ASYNC_CONNECT and
STREAM_CLIENT_PERSISTENT.

context

A valid context resource created with stream_context_create.

Return Values

On success a stream resource is returned which may
be used together with the other file functions (such as
fgets, fgetss,
fwrite, fclose, and
feof), false on failure.

Exceptions and Errors

On failure the error_code and
error_message arguments will be populated with the actual
system level error that occurred in the system-level
connect() call. If the value returned in
error_code is 0 and the
function returned false, it is an indication that the error
occurred before the connect() call. This is
most likely due to a problem initializing the socket. Note that
the error_code and
error_message arguments will always be passed by
reference.

Notes

Warning:

UDP sockets will sometimes appear to have opened without an error,
even if the remote host is unreachable. The error will only
become apparent when you read or write data to/from the socket.
The reason for this is because UDP is a «connectionless» protocol,
which means that the operating system does not try to establish
a link for the socket until it actually needs to send or receive data.

Note:

When specifying a numerical IPv6 address
(e.g. fe80::1), you must enclose the IP in square
brackets—for example, tcp://[fe80::1]:80.

Note:

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.
See for a list of built in transports.

Changelog

Version Description
8.0.0 timeout and context are now nullable.

Related Functions

Example of stream_socket_client

Show all examples
for stream_socket_client

Понравилась статья? Поделить с друзьями:
  • Stop error 0x0000008e
  • Stream read error при установке
  • Stop error 0x0000007f
  • Stream read error как исправить
  • Stop error 0x0000006b