Stream reading error bitrix

Выполняю:ini_set("display_errors", true);error_reporting(6135);$skip_cert = "";$server = "tls://xx.x.x.xxx";$arMAILBOX_PARAMS["PORT"] = 110;$errno = 0;$pop3_conn = stream_socket_client(sprintf('%s:%s', $server, $arMAILBOX_PARAMS["PORT"]),$errno, $errstr,COption::getOptionInt('mail', 'connect_timeout', B_MAIL_TIMEOUT),STREAM_CLIENT_CONNECT,stream_context_create(array('ssl' => array('verify_peer'...
 

Пользователь 263399

Посетитель

Сообщений: 32
Баллов: 6
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 03.06.2014

Выполняю:
ini_set(«display_errors», true);
error_reporting(6135);
$skip_cert = «»;
$server = «tls://xx.x.x.xxx»;
$arMAILBOX_PARAMS[«PORT»] = 110;
$errno = 0;

$pop3_conn = stream_socket_client(
sprintf(‘%s:%s’, $server, $arMAILBOX_PARAMS[«PORT»]),
$errno, $errstr,
COption::getOptionInt(‘mail’, ‘connect_timeout’, B_MAIL_TIMEOUT),
STREAM_CLIENT_CONNECT,
stream_context_create(array(‘ssl’ => array(‘verify_peer’ => !$skip_cert, ‘verify_peer_name’ => !$skip_cert)))
);

var_dump($pop3_conn);

Появляется ошибка

Warning: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:
error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number in /var/www/bitrix_portal/bitrix/modules/main/admin/php_command­_line.php(88) : eval()’d code on line 15

Warning: stream_socket_client(): Failed to enable crypto in /var/www/bitrix_portal/bitrix/modules/main/admin/php_command­_line.php(88) : eval()’d code on line 15

Warning: stream_socket_client(): unable to connect to tls://xx.x.x.xxx:110 (Unknown error) in /var/www/bitrix_portal/bitrix/modules/main/admin/php_command­_line.php(88) : eval()’d code on line 15 bool(false)

Цепочка сертификатов корректная.
Из за чего может возникать проблема?

 

Пользователь 136059

Гуру

Сообщений: 5418
Баллов: 636
Авторитет:

22

Рейтинг пользователя:

0

Регистрация: 16.07.2012

#2

0

18.09.2017 18:19:14

Цитата
Антон Кашлев написал:
stream_context_create(array(‘ssl’ => array(‘verify_peer’ => !$skip_cert, ‘verify_peer_name’ => !$skip_cert)))

Попробуйте заменить на:

Код
stream_context_create(array('ssl' => array('verify_peer' => false, 'verify_peer_name' => false)))

Голосуй за идеи по развитию API Bitrix:
https://idea.1c-bitrix.ru/26707/
https://idea.1c-bitrix.ru/26709/
https://idea.1c-bitrix.ru/the-local-extension-folder-js/

 

Пользователь 263399

Посетитель

Сообщений: 32
Баллов: 6
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 03.06.2014

#3

0

18.10.2017 15:41:48

Цитата
Попробуйте заменить на:

Код
stream_context_create(array(‘ssl’ => array(‘verify_peer’ => false, ‘verify_peer_name’ => false)))

Заменил как предлагаете, теперь выходит ошибка:
Warning: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number in /var/www/bitrix_portal/bitrix/modules/main/admin/php_command­_line.php(88) : eval()’d code on line 15

Warning: stream_socket_client(): Failed to enable crypto in /var/www/bitrix_portal/bitrix/modules/main/admin/php_command­_line.php(88) : eval()’d code on line 15

Warning: stream_socket_client(): unable to connect to tls://xx.x.xxx.xxx:110 (Unknown error) in /var/www/bitrix_portal/bitrix/modules/main/admin/php_command­_line.php(88) : eval()’d code on line 15
bool(false)

 

Пользователь 136059

Гуру

Сообщений: 5418
Баллов: 636
Авторитет:

22

Рейтинг пользователя:

0

Регистрация: 16.07.2012

#4

0

18.10.2017 16:16:49

Цитата
Антон Кашлев написал:
$arMAILBOX_PARAMS[«PORT»] = 110;

стоп, а почему вы подключаетесь по защищенному соединению и незащищенному порту?
Для pop3 безопасным является 995, ну или вы должны сами передать комманду на начало TLS соединения.

Голосуй за идеи по развитию API Bitrix:
https://idea.1c-bitrix.ru/26707/
https://idea.1c-bitrix.ru/26709/
https://idea.1c-bitrix.ru/the-local-extension-folder-js/

 

Пользователь 263399

Посетитель

Сообщений: 32
Баллов: 6
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 03.06.2014

#5

0

18.10.2017 17:16:18

Цитата
а почему вы подключаетесь по защищенному соединению и незащищенному порту?

Подробно не знаю, но так организовано на стороне серверов.

А как можно передать команду на начало TLS соединения?

 

Антон Кашлев, подождите, так вы с сокетом работаете или через pop3 почту получить хотите? Для начала попробуйте защищенный порт (995). У Вас какой почтовый сервер? Собственный или известный?

 

Пользователь 263399

Посетитель

Сообщений: 32
Баллов: 6
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 03.06.2014

Андрей, если вообщем, то у нас настроен почтовый ящик в самом битрикс(Сервис-Почта-Почтовые ящики)
Его тип «Внешний POP3-сервер», указан порт 110, Использовать без. соед. TLS — поставлена галочка, ну и все другие необходимые значения заполнены.
Сам почтовый ящик находится на Exchange сервере.
В журнале работы постоянно ошибка: Таймаут соединения.
В /bitrix/modules/mail/classes/general/mail.php , function Check в которой происходит соединение

if (($use_tls == ‘Y’ || $use_tls == ‘S’) && strpos($server, ‘tls://’) === false)
$server = ‘tls://’ . $server;

$skip_cert = $use_tls != ‘Y’ || PHP_VERSION_ID < 50600;

$pop3_conn = &$this->pop3_conn;
$pop3_conn = stream_socket_client(
sprintf(‘%s:%s’, $server, $port),
$errno, $errstr,
COption::getOptionInt(‘mail’, ‘connect_timeout’, B_MAIL_TIMEOUT),
STREAM_CLIENT_CONNECT,
stream_context_create(array(‘ssl’ => array(‘verify_peer’ => !$skip_cert, ‘verify_peer_name’ => !$skip_cert)))
);
if(!$pop3_conn)
return array(false, GetMessage(«MAIL_CL_TIMEOUT»).» $errstr ($errno)»);

Вот так я и пытаюсь установить соединение  

 

Пользователь 136059

Гуру

Сообщений: 5418
Баллов: 636
Авторитет:

22

Рейтинг пользователя:

0

Регистрация: 16.07.2012

#8

0

19.10.2017 14:16:15

Цитата
Антон Кашлев написал:
Его тип «Внешний POP3-сервер», указан порт 110, Использовать без. соед. TLS — поставлена галочка, ну и все другие необходимые значения заполнены.

Для защищенного соединения с Exchange по протоколу pop3 нужно использовать порт 995 (или 993, в зависимости от настроек). К тому же он должен быть включен.

https://technet.microsoft.com/ru-ru/library/bb124934(v=exchg.160).aspx

Голосуй за идеи по развитию API Bitrix:
https://idea.1c-bitrix.ru/26707/
https://idea.1c-bitrix.ru/26709/
https://idea.1c-bitrix.ru/the-local-extension-folder-js/

 

Пользователь 263399

Посетитель

Сообщений: 32
Баллов: 6
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 03.06.2014

Андрей, спасибо за совет.
Будем пробовать открывать и настраивать 995 порт  

 

Пользователь 2248047

Заглянувший

Сообщений: 6
Авторитет:

0

Рейтинг пользователя:

0

Регистрация: 21.06.2018

#10

0

31.07.2018 16:17:12

Приветствую!
А удалось заставить Exchange работать с Битрикс КП? Какие все-таки настройки сработали? У меня проблема с подключением к серверу «Ошибка подключения к серверу: Подключение отклонено» и хоть ты тресни, пробовала разные порты с проверкой и без проверки сертификата, проблема сохраняется.

 

Пользователь 136059

Гуру

Сообщений: 5418
Баллов: 636
Авторитет:

22

Рейтинг пользователя:

0

Регистрация: 16.07.2012

#11

0

31.07.2018 16:32:48

Цитата
Полина Скворцова написал:
«Ошибка подключения к серверу: Подключение отклонено»

На сервере exchange basic авторизация включена?

Голосуй за идеи по развитию API Bitrix:
https://idea.1c-bitrix.ru/26707/
https://idea.1c-bitrix.ru/26709/
https://idea.1c-bitrix.ru/the-local-extension-folder-js/

 

Пользователь 2248047

Заглянувший

Сообщений: 6
Авторитет:

0

Рейтинг пользователя:

0

Регистрация: 21.06.2018

#12

0

31.07.2018 16:36:02

 

#13

0

31.07.2018 23:36:55

Полина Скворцова, стоп, а вы почтовый ящик пользователя к битриксу подключаете? А не в настройка DAV интеграцию делаете?
Если в настройках почты, то там еще нужно покопаться и поколдовать с сертификатами (на защищенном соединении у exchange должны стоять доверенные сервером портала сертификаты)

 

Пользователь 2248047

Заглянувший

Сообщений: 6
Авторитет:

0

Рейтинг пользователя:

0

Регистрация: 21.06.2018

#14

0

01.08.2018 11:20:52

Да, подключаем к Битрикс24, задача получать письма в CRM Битрикса и от туда иметь возможность их отправлять. Сейчас отправила запрос по поводу сертификатов на стороне exchange и включена ли настройка обмена с POP3 клиентами.

 

Пользователь 2248047

Заглянувший

Сообщений: 6
Авторитет:

0

Рейтинг пользователя:

0

Регистрация: 21.06.2018

#15

0

01.08.2018 16:22:00

Цитата
Полина Скворцова написал:
Да, подключаем к Битрикс24, задача получать письма в CRM Битрикса и от туда иметь возможность их отправлять. Сейчас отправила запрос по поводу сертификатов на стороне exchange и включена ли настройка обмена с POP3 клиентами.

мне кажется или они не там все настройки меняют?
при попытке подключения к Битриксу от сервера  выдаётся ошибка по таймауту
блин есть где-нибудь понятная инструкция, что и где нужно настроить, что бы работало?
а то я с ними как глухой с немым, ни бе ни ме не понимать  :cry:  

Прикрепленные файлы

получение почты с внешних ip.jpg (49.69 КБ)

Безымянный.jpg (46.13 КБ)

авторизация.jpg (44.91 КБ)

pop3.jpg (87.33 КБ)

 

#16

0

01.08.2018 16:37:17

Полина Скворцова, для начала каюсь — нужен imap (pop3 работает только для админки).
В поле «Защищенное соединение» выбираем «Да, не проверять сертификат»

 

Пользователь 2248047

Заглянувший

Сообщений: 6
Авторитет:

0

Рейтинг пользователя:

0

Регистрация: 21.06.2018

#17

0

01.08.2018 16:47:14

Цитата
Андрей Николаев написал:
Полина Скворцова , для начала каюсь — нужен imap (pop3 работает только для админки).
В поле «Защищенное соединение» выбираем «Да, не проверять сертификат»

не работает, 111 ошибка выходит с этого начинали, потом залезли в админку настроили там по умолчанию данные для подключения
Настройки для exchange указаны следующие:

Код: 5
Сайт: https://bitrix24.domen.ru
Активен: Да
Логотип: Добавить файл
Название: exchange
Тип: imap
Почтовый сервер (IMAP) / порт: mail.domen.ru:443
Использовать безопасное соединение (TLS):1 нет
Адрес веб-интерфейса: https://mail.domen.ru/owa/
Сортировка: 500

я уже извелась, столько форумов с вопросами на эту тему, но нет хоть какого-то понятного мануала, что и где нужно настроить нигде нет, в обучающих материалах у Битрикса все слишком поверхностно

а админ почтового сервера прислал мне следующее
пробовал настраивать подключение в битрикс24, ничего не получилось. Мгновенно выдаётся ошибка по таймауту и скрины ( я фиг знает как мне это может помочь)

Прикрепленные файлы

получение почты с внешних ip.jpg (49.69 КБ)

Безымянный.jpg (46.13 КБ)

авторизация.jpg (44.91 КБ)

pop3.jpg (87.33 КБ)

 

Пользователь 2248047

Заглянувший

Сообщений: 6
Авторитет:

0

Рейтинг пользователя:

0

Регистрация: 21.06.2018

#18

0

01.08.2018 16:51:51

создала обращение по этому поводу в техподдержку Битрикс24, если смогу решить вопрос, то отпишусь сюда
если не отпишусь, значит я повесилась на проводе от компьютерной мыши от безысходности  :(  

 

Пользователь 136059

Гуру

Сообщений: 5418
Баллов: 636
Авторитет:

22

Рейтинг пользователя:

0

Регистрация: 16.07.2012

#19

0

01.08.2018 23:28:09

Цитата
Полина Скворцова написал:
не работает, 111 ошибка выходит с этого начинали, потом залезли в админку настроили там по умолчанию данные для подключения

Ошибка 111 означает, что SSL сертификат который установлен на exchange скорее всего выпущен Вашей же организацией (а следовательно для сервера Битрикса) не является доверенным. Под сервером битрикса, я понимаю ту виртуальныю машину на которой стоит Ваш коробочный Битрикс.
Странно почему при галочке «не проверять сертификат», он все равно при подключении его учитывает.

Голосуй за идеи по развитию API Bitrix:
https://idea.1c-bitrix.ru/26707/
https://idea.1c-bitrix.ru/26709/
https://idea.1c-bitrix.ru/the-local-extension-folder-js/

Открытые члены

  __construct (array $options=null)
 
  __destruct ()
 
  get ($url)
 
  head ($url)
 
  post ($url, $postData=null, $multipart=false)
 
  query ($method, $url, $entityBody=null)
 
  setHeader ($name, $value, $replace=true)
 
  setHeaders (array $headers)
 
  getRequestHeaders ()
 
  clearHeaders ()
 
  setCookies (array $cookies)
 
  setAuthorization ($user, $pass)
 
  setRedirect ($value, $max=null)
 
  waitResponse ($value)
 
  setTimeout ($value)
 
  setStreamTimeout ($value)
 
  setVersion ($value)
 
  setCompress ($value)
 
  setCharset ($value)
 
  disableSslVerification ()
 
  setPrivateIp ($value)
 
  setProxy ($proxyHost, $proxyPort=null, $proxyUser=null, $proxyPassword=null)
 
  setOutputStream ($handler)
 
  setBodyLengthMax ($bodyLengthMax)
 
  download ($url, $filePath)
 
  getEffectiveUrl ()
 
  setContextOptions (array $options)
 
  getHeaders ()
 
  getCookies ()
 
  getStatus ()
 
  getResult ()
 
  getError ()
 
  getContentType ()
 
  getCharset ()
 
  getPeerSocketName ()
 
  getPeerAddress ()
 
  getPeerPort ()
 
  setDebugLevel (int $debugLevel)
 

Поля данных

const  HTTP_1_0 = «1.0»
 
const  HTTP_1_1 = «1.1»
 
const  HTTP_GET = «GET»
 
const  HTTP_POST = «POST»
 
const  HTTP_PUT = «PUT»
 
const  HTTP_HEAD = «HEAD»
 
const  HTTP_PATCH = «PATCH»
 
const  HTTP_DELETE = «DELETE»
 
const  HTTP_OPTIONS = «OPTIONS»
 
const  DEFAULT_SOCKET_TIMEOUT = 30
 
const  DEFAULT_STREAM_TIMEOUT = 60
 
const  DEFAULT_STREAM_TIMEOUT_NO_WAIT = 1
 
const  BUF_READ_LEN = 16384
 
const  BUF_POST_LEN = 131072
 

Защищенные члены

  prepareMultipart ($postData)
 
  connect (Uri $url)
 
  createContext ()
 
  disconnect ()
 
  send ($data)
 
  receive ($bufLength=null)
 
  sendRequest ($method, Uri $url, $entityBody=null)
 
  readHeaders ()
 
  readBody ()
 
  receiveBytes ($length)
 
  checkErrors ($buf)
 
  decompress ()
 
  parseHeaders ($headers)
 
  addError ($code, $message, $triggerWarning=false)
 
  getLogger ()
 

Защищенные данные

  $proxyHost
 
  $proxyPort
 
  $proxyUser
 
  $proxyPassword
 
  $resource
 
  $socketTimeout = self::DEFAULT_SOCKET_TIMEOUT
 
  $streamTimeout = self::DEFAULT_STREAM_TIMEOUT
 
  $error = []
 
  $peerSocketName
 
  $requestHeaders
 
  $requestCookies
 
  $waitResponse = true
 
  $redirect = true
 
  $redirectMax = 5
 
  $redirectCount = 0
 
  $compress = false
 
  $version = self::HTTP_1_0
 
  $requestCharset = »
 
  $sslVerify = true
 
  $bodyLengthMax = 0
 
  $privateIp = true
 
  $status = 0
 
  $responseHeaders
 
  $responseCookies
 
  $result = »
 
  $outputStream
 
  $effectiveIp
 
  $effectiveUrl
 
  $queryMethod
 
  $receivedBytesLength = 0
 
  $contextOptions = []
 
  $debugLevel = HttpDebug::REQUEST_HEADERS | HttpDebug::RESPONSE_HEADERS
 

См. определение в файле httpclient.php строка 15

◆ __construct()

__construct ( array  $options = null )
Аргументы
array | null $options Optional array with options: «redirect» bool Follow redirects (default true). «redirectMax» int Maximum number of redirects (default 5). «waitResponse» bool Read the body or disconnect just after reading headers (default true). «socketTimeout» int Connection timeout in seconds (default 30). «streamTimeout» int Stream reading timeout in seconds (default 60 for waitResponse == true and 1 for waitResponse == false). «version» string HTTP version (HttpClient::HTTP_1_0, HttpClient::HTTP_1_1) (default «1.0»). «proxyHost» string Proxy host name/address. «proxyPort» int Proxy port number. «proxyUser» string Proxy username. «proxyPassword» string Proxy password. «compress» bool Accept gzip encoding (default false). «charset» string Charset for body in POST and PUT. «disableSslVerification» bool Pass true to disable ssl check. «bodyLengthMax» int Maximum length of the body. «privateIp» bool Enable or disable requests to private IPs (default true). «debugLevel» int Debug level using HttpDebug::* constants. «cookies» array of cookies for HTTP request. «headers» array of headers for HTTP request. All the options can be set separately with setters.

См. определение в файле httpclient.php строка 101

102 {

103 $this->requestHeaders = new HttpHeaders();

104 $this->responseHeaders = new HttpHeaders();

105 $this->requestCookies = new HttpCookies();

106 $this->responseCookies = new HttpCookies();

107

108 if($options === null)

109 {

110 $options = array();

111 }

112

113 $defaultOptions = Configuration::getValue(«http_client_options»);

114 if($defaultOptions !== null)

115 {

116 $options += $defaultOptions;

117 }

118

119 if(!empty($options))

120 {

121 if(isset($options[«redirect»]))

122 {

123 $this->setRedirect($options[«redirect»], $options[«redirectMax»]);

124 }

125 if(isset($options[«waitResponse»]))

126 {

127 $this->waitResponse($options[«waitResponse»]);

128 }

129 if(isset($options[«socketTimeout»]))

130 {

131 $this->setTimeout($options[«socketTimeout»]);

132 }

133 if(isset($options[«streamTimeout»]))

134 {

136 }

137 if(isset($options[«version»]))

138 {

139 $this->setVersion($options[«version»]);

140 }

141 if(isset($options[«proxyHost»]))

142 {

143 $this->setProxy($options[«proxyHost»], $options[«proxyPort»], $options[«proxyUser»], $options[«proxyPassword»]);

144 }

145 if(isset($options[«compress»]))

146 {

147 $this->setCompress($options[«compress»]);

148 }

149 if(isset($options[«charset»]))

150 {

151 $this->setCharset($options[«charset»]);

152 }

153 if(isset($options[«disableSslVerification»]) && $options[«disableSslVerification»] === true)

154 {

156 }

157 if(isset($options[«bodyLengthMax»]))

158 {

160 }

161 if(isset($options[«privateIp»]))

162 {

164 }

165 if(isset($options[«debugLevel»]))

166 {

167 $this->setDebugLevel((int)$options[«debugLevel»]);

168 }

169 if(isset($options[«cookies»]))

170 {

171 $this->setCookies($options[«cookies»]);

172 }

173 if(isset($options[«headers»]))

174 {

175 $this->setHeaders($options[«headers»]);

176 }

177 }

178 }

setProxy($proxyHost, $proxyPort=null, $proxyUser=null, $proxyPassword=null)

setCookies(array $cookies)

setDebugLevel(int $debugLevel)

setRedirect($value, $max=null)

setBodyLengthMax($bodyLengthMax)

setHeaders(array $headers)

◆ __destruct()

Closes the connection on the object destruction.

См. определение в файле httpclient.php строка 183

◆ addError()

addError (   $code,
  $message,
  $triggerWarning = false 
)
protected

См. определение в файле httpclient.php строка 1268

1269 {

1270 $this->error[$code] = $message;

1271

1272 if ($triggerWarning)

1273 {

1274 trigger_error($message, E_USER_WARNING);

1275 }

1276

1277 if ($logger = $this->getLogger())

1278 {

1279 $logger->error($message);

1280 }

1281 }

◆ checkErrors()

checkErrors (   $buf )
protected

См. определение в файле httpclient.php строка 1080

1081 {

1082 if($this->streamTimeout > 0)

1083 {

1084 $info = stream_get_meta_data($this->resource);

1085 if($info[‘timed_out’])

1086 {

1087 $this->addError(‘STREAM_TIMEOUT’, «Stream reading timeout of {$this->streamTimeout} second(s) has been reached.»);

1088 return false;

1089 }

1090 }

1091

1092 if($buf === false)

1093 {

1094 $this->addError(‘STREAM_READING’, ‘Stream reading error.’);

1095 return false;

1096 }

1097

1098 if($this->bodyLengthMax > 0 && $this->receivedBytesLength > $this->bodyLengthMax)

1099 {

1100 $this->addError(‘STREAM_LENGTH’, ‘Maximum content length has been reached. Breaking reading.’);

1101 return false;

1102 }

1103

1104 return true;

1105 }

addError($code, $message, $triggerWarning=false)

◆ clearHeaders()

Clears all HTTP request header fields.

См. определение в файле httpclient.php строка 470

471 {

472 $this->requestHeaders->clear();

473 }

◆ connect()

connect ( Uri  $url )
protected

См. определение в файле httpclient.php строка 717

718 {

719 if($this->proxyHost <> »)

720 {

721 $proto = «»;

724 }

725 else

726 {

727 $proto = ($url->getScheme() == «https»? «ssl://» : «»);

730

731 if($this->effectiveIp !== null)

732 {

733

735

736

737 $host = $this->effectiveIp->get();

738 }

739 }

740

742

743

744 if($context)

745 {

746 $res = stream_socket_client($proto.$host.«:».$port, $errno, $errstr, $this->socketTimeout, STREAM_CLIENT_CONNECT, $context);

747 }

748 else

749 {

750 $res = stream_socket_client($proto.$host.«:».$port, $errno, $errstr, $this->socketTimeout);

751 }

752

753 if(is_resource($res))

754 {

755 $this->resource = $res;

756 $this->peerSocketName = stream_socket_get_name($this->resource, true);

757

758 if($this->streamTimeout > 0)

759 {

760 stream_set_timeout($this->resource, $this->streamTimeout);

761 }

762

763 return true;

764 }

765

766 if(intval($errno) > 0)

767 {

768 $this->addError(‘CONNECTION’, «[{$errno}] {$errstr}»);

769 }

770 else

771 {

772 $this->addError(‘SOCKET’, ‘Socket connection error.’);

773 }

774

775 return false;

776 }

setContextOptions(array $options)

◆ createContext()

createContext ( )
protected

См. определение в файле httpclient.php строка 778

779 {

780 if ($this->sslVerify === false)

781 {

782 $this->contextOptions[«ssl»][«verify_peer_name»] = false;

783 $this->contextOptions[«ssl»][«verify_peer»] = false;

784 $this->contextOptions[«ssl»][«allow_self_signed»] = true;

785 }

786

787 return stream_context_create($this->contextOptions);

788 }

◆ decompress()

См. определение в файле httpclient.php строка 1107

1108 {

1109 if(is_resource($this->outputStream))

1110 {

1111 $compressed = stream_get_contents($this->outputStream, -1, 10);

1112 $compressed = substr($compressed, 0, -8);

1113 if($compressed <> »)

1114 {

1115 $uncompressed = gzinflate($compressed);

1116

1117 rewind($this->outputStream);

1118 $len = fwrite($this->outputStream, $uncompressed);

1119 ftruncate($this->outputStream, $len);

1120 }

1121 }

1122 else

1123 {

1124 $compressed = substr($this->result, 10, -8);

1125 if($compressed <> »)

1126 {

1127 $this->result = gzinflate($compressed);

1128 }

1129 }

1130 }

◆ disableSslVerification()

disableSslVerification ( )

Disables ssl certificate verification.

Возвращает
$this

См. определение в файле httpclient.php строка 601

602 {

603 $this->sslVerify = false;

604 return $this;

605 }

◆ disconnect()

См. определение в файле httpclient.php строка 790

791 {

792 if($this->resource)

793 {

794 fclose($this->resource);

795 $this->resource = null;

796 }

797 }

◆ download()

download (   $url,
  $filePath 
)

Downloads and saves a file.

Аргументы
string $url URI to download.
string $filePath Absolute file path.
Возвращает
bool

См. определение в файле httpclient.php строка 675

676 {

677 $dir = IOPath::getDirectory($filePath);

678 IODirectory::createDirectory($dir);

679

680 $file = new IOFile($filePath);

681 $handler = $file->open(«w+»);

682

684

685 $res = $this->query(self::HTTP_GET, $url);

686 if($res)

687 {

689 }

691

692 $file->close();

693 return $res;

694 }

setOutputStream($handler)

query($method, $url, $entityBody=null)

◆ get()

Performs GET request.

Аргументы
string $url Absolute URI eg. «http://user:pass @ host:port/path/?query».
Возвращает
string|bool Response entity string or false on error. Note, it’s empty string if outputStream is set.

См. определение в файле httpclient.php строка 194

195 {

196 if($this->query(self::HTTP_GET, $url))

197 {

199 }

200 return false;

201 }

◆ getCharset()

Returns response content encoding

Возвращает
string

См. определение в файле httpclient.php строка 1225

1226 {

1227 return $this->responseHeaders->getCharset();

1228 }

◆ getContentType()

Returns response content type

Возвращает
string

См. определение в файле httpclient.php строка 1215

1216 {

1217 return $this->responseHeaders->getContentType();

1218 }

◆ getCookies()

◆ getEffectiveUrl()

Returns URL of the last redirect if request was redirected, or initial URL if request was not redirected.

Возвращает
string

См. определение в файле httpclient.php строка 700

◆ getError()

Returns array of errors on failure

Возвращает
array Array with «error_code» => «error_message» pair

См. определение в файле httpclient.php строка 1205

◆ getHeaders()

◆ getLogger()

См. определение в файле httpclient.php строка 1283

1284 {

1285 if ($this->logger === null)

1286 {

1287 $logger = DiagLogger::create(‘main.HttpClient’, [$this, $this->queryMethod, $this->effectiveUrl]);

1288

1289 if ($logger !== null)

1290 {

1291 $this->setLogger($logger);

1292 }

1293 }

1294

1295 return $this->logger;

1296 }

◆ getPeerAddress()

Returns remote peer ip address.

Возвращает
string|false

См. определение в файле httpclient.php строка 1244

1245 {

1246 if(!preg_match(‘/^(d+).(d+).(d+).(d+):(d+)$/’, $this->peerSocketName, $matches))

1247 {

1248 return false;

1249 }

1250

1251 return sprintf(‘%d.%d.%d.%d’, $matches[1], $matches[2], $matches[3], $matches[4]);

1252 }

◆ getPeerPort()

Returns remote peer ip address.

Возвращает
int|false

См. определение в файле httpclient.php строка 1258

1259 {

1260 if(!preg_match(‘/^(d+).(d+).(d+).(d+):(d+)$/’, $this->peerSocketName, $matches))

1261 {

1262 return false;

1263 }

1264

1265 return (int)$matches[5];

1266 }

◆ getPeerSocketName()

Returns remote peer socket name (usually in form ip:port)

Возвращает
string

См. определение в файле httpclient.php строка 1235

1236 {

1237 return $this->peerSocketName ?: »;

1238 }

◆ getRequestHeaders()

◆ getResult()

Returns HTTP response entity string. Note, if outputStream is set, the result will be empty string.

Возвращает
string

См. определение в файле httpclient.php строка 1190

1191 {

1193 {

1196 }

1198 }

◆ getStatus()

Returns HTTP response status code

Возвращает
int

См. определение в файле httpclient.php строка 1180

◆ head()

Performs HEAD request.

Аргументы
string $url Absolute URI eg. «http://user:pass @ host:port/path/?query»
Возвращает
HttpHeaders|bool Response headers or false on error.

См. определение в файле httpclient.php строка 209

210 {

211 if($this->query(self::HTTP_HEAD, $url))

212 {

214 }

215 return false;

216 }

◆ parseHeaders()

parseHeaders (   $headers )
protected

См. определение в файле httpclient.php строка 1132

1133 {

1134 foreach (explode(«n», $headers) as $k => $header)

1135 {

1136 if($k == 0)

1137 {

1138 if(preg_match(‘#HTTPS+ (d+)#’, $header, $find))

1139 {

1140 $this->status = intval($find[1]);

1141 }

1142 }

1143 elseif(strpos($header, ‘:’) !== false)

1144 {

1145 [$headerName, $headerValue] = explode(‘:’, $header, 2);

1146 if(strtolower($headerName) == ‘set-cookie’)

1147 {

1148 $this->responseCookies->addFromString($headerValue);

1149 }

1150 $this->responseHeaders->add($headerName, trim($headerValue));

1151 }

1152 }

1153 }

◆ post()

post (   $url,
  $postData = null,
  $multipart = false 
)

Performs POST request.

Аргументы
string $url Absolute URI eg. «http://user:pass @ host:port/path/?query».
array | string | resource $postData Entity of POST/PUT request. If it’s resource handler then data will be read directly from the stream.
boolean $multipart Whether to use multipart/form-data encoding. If true, method accepts file as a resource or as an array with keys ‘resource’ (or ‘content’) and optionally ‘filename’ and ‘contentType’
Возвращает
string|bool Response entity string or false on error. Note, it’s empty string if outputStream is set.

См. определение в файле httpclient.php строка 226

227 {

228 if ($multipart)

229 {

231 if($postData === false)

232 {

233 return false;

234 }

235 }

236

237 if($this->query(self::HTTP_POST, $url, $postData))

238 {

240 }

241 return false;

242 }

prepareMultipart($postData)

◆ prepareMultipart()

prepareMultipart (   $postData )
protected

Performs multipart/form-data encoding. Accepts file as a resource or as an array with keys ‘resource’ (or ‘content’) and optionally ‘filename’ and ‘contentType’

Аргументы
array | string | resource $postData Entity of POST/PUT request
Возвращает
string|bool False on error

См. определение в файле httpclient.php строка 251

252 {

253 if (is_array($postData))

254 {

255 $boundary = ‘BXC’.md5(rand().time());

256

257 $data = »;

258

259 foreach ($postData as $k => $v)

260 {

261 $data .= ‘—‘.$boundary.«rn»;

262

263 if ((is_resource($v) && get_resource_type($v) === ‘stream’) || is_array($v))

264 {

265 $filename = $k;

266 $contentType = ‘application/octet-stream’;

267

268 if (is_array($v))

269 {

270 if (isset($v[‘resource’]) && is_resource($v[‘resource’]) && get_resource_type($v[‘resource’]) === ‘stream’)

271 {

273 $content = stream_get_contents($resource);

274 }

275 else

276 {

277 if (isset($v[‘content’]))

278 {

279 $content = $v[‘content’];

280 }

281 else

282 {

283 $this->addError(‘MULTIPART’, «File `{$k}` not found for multipart upload.», true);

284 return false;

285 }

286 }

287

288 if (isset($v[‘filename’]))

289 {

290 $filename = $v[‘filename’];

291 }

292

293 if (isset($v[‘contentType’]))

294 {

295 $contentType = $v[‘contentType’];

296 }

297 }

298 else

299 {

300 $content = stream_get_contents($v);

301 }

302

303 $data .= ‘Content-Disposition: form-data; name=»‘.$k.‘»; filename=»‘.$filename.‘»‘.«rn»;

304 $data .= ‘Content-Type: ‘.$contentType.«rnrn»;

305 $data .= $content.«rn»;

306 }

307 else

308 {

309 $data .= ‘Content-Disposition: form-data; name=»‘.$k.‘»‘.«rnrn»;

310 $data .= $v.«rn»;

311 }

312 }

313

314 $data .= ‘—‘.$boundary.«—rn»;

315 $postData = $data;

316

317 $this->setHeader(‘Content-type’, ‘multipart/form-data; boundary=’.$boundary);

318 }

319

320 return $postData;

321 }

setHeader($name, $value, $replace=true)

◆ query()

query (   $method,
  $url,
  $entityBody = null 
)

Perfoms HTTP request.

Аргументы
string $method HTTP method (GET, POST, etc.). Note, it must be in UPPERCASE.
string $url Absolute URI eg. «http://user:pass @ host:port/path/?query».
array | string | resource $entityBody Entity body of the request. If it’s resource handler then data will be read directly from the stream.
Возвращает
bool Query result (true or false). Response entity string can be got via getResult() method. Note, it’s empty string if outputStream is set.

См. определение в файле httpclient.php строка 331

332 {

333 $this->queryMethod = $method;

334 $this->effectiveUrl = $url;

335 $this->effectiveIp = null;

336 $this->error = [];

337

338 if(is_array($entityBody))

339 {

340 $entityBody = http_build_query($entityBody, «», «&»);

341 }

342

343 $this->redirectCount = 0;

344

345 while(true)

346 {

347

348

349 $parsedUrl = new Uri($this->effectiveUrl);

350 if($parsedUrl->getHost() == »)

351 {

352 $this->addError(‘URI’, «Incorrect URI: {$this->effectiveUrl}»);

353 return false;

354 }

355

356 $error = $parsedUrl->convertToPunycode();

358 {

359 $this->addError(‘URI’, «Error converting hostname to punycode: {$error->getMessage()}»);

360 return false;

361 }

362

363 if($this->privateIp == false)

364 {

366 if($ip->isPrivate())

367 {

368 $this->addError(‘PRIVATE_IP’, «Resolved IP is incorrect or private: {$ip->get()}»);

369 return false;

370 }

371 $this->effectiveIp = $ip;

372 }

373

374

376

377 if($this->connect($parsedUrl) === false)

378 {

379 return false;

380 }

381

382 $this->sendRequest($this->queryMethod, $parsedUrl, $entityBody);

383

385 {

387 return false;

388 }

389

391 {

393 return true;

394 }

395

396 if($this->redirect && ($location = $this->responseHeaders->get(«Location»)) !== null && $location <> »)

397 {

398

400

401 if($this->redirectCount < $this->redirectMax)

402 {

403 $this->effectiveUrl = $location;

404 if($this->status == 302 || $this->status == 303)

405 {

407 }

408 $this->redirectCount++;

409 }

410 else

411 {

412 $this->addError(‘REDIRECT’, «Maximum number of redirects ({$this->redirectMax}) has been reached at URL {$url}», true);

413 return false;

414 }

415 }

416 else

417 {

418

419 break;

420 }

421 }

422 return true;

423 }

sendRequest($method, Uri $url, $entityBody=null)

static createByUri(Uri $uri)

◆ readBody()

См. определение в файле httpclient.php строка 982

983 {

984 if($this->responseHeaders->get(«Transfer-Encoding») == «chunked»)

985 {

986 while(!feof($this->resource))

987 {

988

989

990

991

992

993

994 $line = fgets($this->resource, self::BUF_READ_LEN);

995

996 if($line == «rn»)

997 {

998 continue;

999 }

1000 if(($pos = mb_strpos($line, «;»)) !== false)

1001 {

1002 $line = mb_substr($line, 0, $pos);

1003 }

1004

1005 $length = hexdec($line);

1006

1008 {

1009 return false;

1010 }

1011 }

1012 }

1013 elseif(($length = $this->responseHeaders->get(«Content-Length»)) !== null)

1014 {

1015

1017 {

1018 return false;

1019 }

1020 }

1021 else

1022 {

1023

1024 while(!feof($this->resource))

1025 {

1026 $buf = $this->receive();

1027

1028 $this->receivedBytesLength += strlen($buf);

1029

1031 {

1032 return false;

1033 }

1034 }

1035 }

1036

1037 if($this->responseHeaders->get(«Content-Encoding») == «gzip»)

1038 {

1040 }

1041

1042 if ($logger = $this->getLogger())

1043 {

1044 if ($this->debugLevel)

1045 {

1046 $message = «n{delimiter}n»;

1048 {

1049 $message = «n» . $this->result . $message;

1050 }

1051 $logger->debug($message);

1052 }

1053 }

1054

1055 return true;

1056 }

◆ readHeaders()

readHeaders ( )
protected

См. определение в файле httpclient.php строка 950

951 {

952 $headers = «»;

953 while(!feof($this->resource))

954 {

955 $line = fgets($this->resource, self::BUF_READ_LEN);

956

957 if($line == «rn»)

958 {

959 break;

960 }

962 {

963 return false;

964 }

965

966 $headers .= $line;

967 }

968

969 if ($logger = $this->getLogger())

970 {

972 {

973 $logger->debug(«nRESPONSE<<<n» . $headers);

974 }

975 }

976

978

979 return true;

980 }

◆ receive()

receive (   $bufLength = null )
protected

См. определение в файле httpclient.php строка 804

805 {

806 if($bufLength === null)

807 {

809 }

810

811 $buf = stream_get_contents($this->resource, $bufLength);

812 if($buf !== false)

813 {

814 if(is_resource($this->outputStream))

815 {

816

817 fwrite($this->outputStream, $buf);

818 fflush($this->outputStream);

819 }

820 else

821 {

822 $this->result .= $buf;

823 }

824 }

825

826 return $buf;

827 }

◆ receiveBytes()

receiveBytes (   $length )
protected

См. определение в файле httpclient.php строка 1058

1059 {

1060 while($length > 0 && !feof($this->resource))

1061 {

1062 $count = ($length > self::BUF_READ_LEN? self::BUF_READ_LEN : $length);

1063

1064 $buf = $this->receive($count);

1065

1068

1070 {

1071 return false;

1072 }

1073

1075 }

1076

1077 return true;

1078 }

◆ send()

См. определение в файле httpclient.php строка 799

800 {

801 return fwrite($this->resource, $data);

802 }

◆ sendRequest()

sendRequest (   $method,
Uri  $url,
  $entityBody = null 
)
protected

См. определение в файле httpclient.php строка 829

830 {

831 $this->status = 0;

832 $this->result = »;

833 $this->responseHeaders->clear();

834 $this->responseCookies->clear();

835 $this->receivedBytesLength = 0;

836 $addedContentType = false;

837 $addedContentLength = false;

838

839 if($this->proxyHost <> »)

840 {

842 if($this->proxyUser <> »)

843 {

844 $this->setHeader(«Proxy-Authorization», «Basic «.base64_encode($this->proxyUser.«:».$this->proxyPassword));

845 }

846 }

847 else

848 {

850 }

851

852 $request = $method.» «.$path.» HTTP/».$this->version.«rn»;

853

855 $this->setHeader(«Connection», «close», false);

856 $this->setHeader(«Accept», «*/*», false);

857 $this->setHeader(«Accept-Language», «en», false);

858

859 if(($user = $url->getUser()) <> »)

860 {

862 }

863

864 $cookies = $this->requestCookies->toString();

865 if($cookies <> »)

866 {

867 $this->setHeader(«Cookie», $cookies);

868 }

869

870 if($this->compress)

871 {

872 $this->setHeader(«Accept-Encoding», «gzip»);

873 }

874

875 if(!is_resource($entityBody))

876 {

877 if($method == self::HTTP_POST)

878 {

879

880 if($this->requestHeaders->get(«Content-Type») === null)

881 {

882 $contentType = «application/x-www-form-urlencoded»;

883 if($this->requestCharset <> »)

884 {

885 $contentType .= «; charset=».$this->requestCharset;

886 }

887 $this->setHeader(«Content-Type», $contentType);

888 $addedContentType = true;

889 }

890 }

891

892 if($entityBody <> » || $method == self::HTTP_POST || $method == self::HTTP_PUT)

893 {

894

895 if($this->requestHeaders->get(«Content-Length») === null)

896 {

897 $this->setHeader(«Content-Length», strlen($entityBody));

898 $addedContentLength = true;

899 }

900 }

901 }

902

903 $request .= $this->requestHeaders->toString();

905

906 if ($logger = $this->getLogger())

907 {

908 if ($this->debugLevel)

909 {

910 $message = «{date} — {host}n{trace}»;

912 {

913 $message .= «REQUEST>>>n» . $request;

914 }

915 $logger->debug($message, [‘trace’ => DiagHelper::getBackTrace(6, DEBUG_BACKTRACE_IGNORE_ARGS, 3)]);

916 }

917 }

918

920

921

922 if ($addedContentType)

923 {

924 $this->requestHeaders->delete(‘Content-Type’);

925 }

926 if ($addedContentLength)

927 {

928 $this->requestHeaders->delete(‘Content-Length’);

929 }

930

931 if(is_resource($entityBody))

932 {

933

934 while(!feof($entityBody))

935 {

936 $this->send(fread($entityBody, self::BUF_POST_LEN));

937 }

938 }

939 elseif($entityBody <> »)

940 {

942 {

943 $logger->debug($entityBody);

944 }

945

946 $this->send($entityBody);

947 }

948 }

static getBackTrace($limit=0, $options=null, $skip=1)

setAuthorization($user, $pass)

◆ setAuthorization()

setAuthorization (   $user,
  $pass 
)

Sets Basic Authorization request header field.

Аргументы
string $user Username.
string $pass Password.
Возвращает
$this

См. определение в файле httpclient.php строка 494

495 {

496 $this->setHeader(«Authorization», «Basic «.base64_encode($user.«:».$pass));

497 return $this;

498 }

◆ setBodyLengthMax()

setBodyLengthMax (   $bodyLengthMax )

Sets the maximum body length that will be received in $this->readBody().

Аргументы
Возвращает
$this

См. определение в файле httpclient.php строка 662

663 {

665 return $this;

666 }

◆ setCharset()

Sets charset for the entity-body (used in the Content-Type request header field for POST and PUT).

Аргументы
Возвращает
$this

См. определение в файле httpclient.php строка 590

591 {

592 $this->requestCharset = $value;

593 return $this;

594 }

◆ setCompress()

Sets compression option. Consider not to use the «compress» option with the output stream if a content can be large. Note, that compressed response is processed anyway if Content-Encoding response header field is set

Аргументы
bool $value If true, «Accept-Encoding: gzip» will be sent.
Возвращает
$this

См. определение в файле httpclient.php строка 578

579 {

580 $this->compress = (bool)$value;

581 return $this;

582 }

◆ setContextOptions()

setContextOptions ( array  $options )

Sets context options and parameters.

Аргументы
array $options Context options and parameters
Возвращает
$this

См. определение в файле httpclient.php строка 711

712 {

713 $this->contextOptions = array_replace_recursive($this->contextOptions, $options);

714 return $this;

715 }

◆ setCookies()

setCookies ( array  $cookies )

Sets an array of cookies for HTTP request.

Аргументы
array $cookies Array of cookie_name => value pairs.
Возвращает
$this

См. определение в файле httpclient.php строка 481

482 {

483 $this->requestCookies->set($cookies);

484 return $this;

485 }

◆ setDebugLevel()

setDebugLevel ( int  $debugLevel )

Sets debug level using HttpDebug::* constants.

Аргументы
Возвращает
$this

См. определение в файле httpclient.php строка 1303

1304 {

1306 return $this;

1307 }

◆ setHeader()

setHeader (   $name,
  $value,
  $replace = true 
)

Sets an HTTP request header field.

Аргументы
string $name Name of the header field.
string $value Value of the field.
bool $replace Replace existing header field with the same name or add one more.
Возвращает
$this

См. определение в файле httpclient.php строка 433

434 {

435 if($replace == true || $this->requestHeaders->get($name) === null)

436 {

437 $this->requestHeaders->set($name, $value);

438 }

439 return $this;

440 }

◆ setHeaders()

setHeaders ( array  $headers )

Sets an array of headers for HTTP request.

Аргументы
array $headers Array of header_name => value pairs.
Возвращает
$this

См. определение в файле httpclient.php строка 448

449 {

450 foreach ($headers as $name => $value)

451 {

453 }

454 return $this;

455 }

◆ setOutputStream()

setOutputStream (   $handler )

Sets the response output to the stream instead of the string result. Useful for large responses. Note, the stream must be readable/writable to support a compressed response. Note, in this mode the result string is empty.

Аргументы
resource $handler File or stream handler.
Возвращает
$this

См. определение в файле httpclient.php строка 650

651 {

652 $this->outputStream = $handler;

653 return $this;

654 }

◆ setPrivateIp()

Enables or disables requests to private IPs.

Аргументы
Возвращает
$this

См. определение в файле httpclient.php строка 613

614 {

615 $this->privateIp = (bool)$value;

616 return $this;

617 }

◆ setProxy()

setProxy (   $proxyHost,
  $proxyPort = null,
  $proxyUser = null,
  $proxyPassword = null 
)

Sets HTTP proxy for request.

Аргументы
string $proxyHost Proxy host name or address (without «http://»).
null | int $proxyPort Proxy port number.
null | string $proxyUser Proxy username.
null | string $proxyPassword Proxy password.
Возвращает
$this

См. определение в файле httpclient.php строка 628

629 {

631 $this->proxyPort = intval($proxyPort);

632 if($this->proxyPort <= 0)

633 {

634 $this->proxyPort = 80;

635 }

638

639 return $this;

640 }

◆ setRedirect()

setRedirect (   $value,
  $max = null 
)

Sets redirect options.

Аргументы
bool $value If true, do redirect (default true).
null | int $max Maximum allowed redirect count.
Возвращает
$this

См. определение в файле httpclient.php строка 507

508 {

509 $this->redirect = (bool)$value;

510 if($max !== null)

511 {

512 $this->redirectMax = intval($max);

513 }

514 return $this;

515 }

◆ setStreamTimeout()

setStreamTimeout (   $value )

Sets socket stream reading timeout.

Аргументы
int $value Stream reading timeout in seconds; «0» means no timeout (default 60).
Возвращает
$this

См. определение в файле httpclient.php строка 552

553 {

554 $this->streamTimeout = intval($value);

555 return $this;

556 }

◆ setTimeout()

Sets connection timeout.

Аргументы
int $value Connection timeout in seconds (default 30).
Возвращает
$this

См. определение в файле httpclient.php строка 540

541 {

542 $this->socketTimeout = intval($value);

543 return $this;

544 }

◆ setVersion()

Sets HTTP protocol version. In version 1.1 chunked response is possible.

Аргументы
string $value Version «1.0» or «1.1» (default «1.0»).
Возвращает
$this

См. определение в файле httpclient.php строка 564

565 {

566 $this->version = $value;

567 return $this;

568 }

◆ waitResponse()

Sets response body waiting option.

Аргументы
bool $value If true, wait for response body. If false, disconnect just after reading headers (default true).
Возвращает
$this

См. определение в файле httpclient.php строка 523

524 {

527 {

528 $this->setStreamTimeout(self::DEFAULT_STREAM_TIMEOUT_NO_WAIT);

529 }

530

531 return $this;

532 }

◆ $bodyLengthMax

◆ $compress

◆ $contextOptions

◆ $debugLevel

◆ $effectiveIp

◆ $effectiveUrl

◆ $error

◆ $outputStream

◆ $peerSocketName

◆ $privateIp

◆ $proxyHost

◆ $proxyPassword

◆ $proxyPort

◆ $proxyUser

◆ $queryMethod

◆ $receivedBytesLength

◆ $redirect

◆ $redirectCount

◆ $redirectMax

◆ $requestCharset

◆ $requestCookies

◆ $requestHeaders

◆ $resource

◆ $responseCookies

◆ $responseHeaders

◆ $result

◆ $socketTimeout

$socketTimeout = self::DEFAULT_SOCKET_TIMEOUT

protected

◆ $sslVerify

◆ $status

◆ $streamTimeout

$streamTimeout = self::DEFAULT_STREAM_TIMEOUT

protected

◆ $version

$version = self::HTTP_1_0

protected

◆ $waitResponse

◆ BUF_POST_LEN

const BUF_POST_LEN = 131072

◆ BUF_READ_LEN

const BUF_READ_LEN = 16384

◆ DEFAULT_SOCKET_TIMEOUT

const DEFAULT_SOCKET_TIMEOUT = 30

◆ DEFAULT_STREAM_TIMEOUT

const DEFAULT_STREAM_TIMEOUT = 60

◆ DEFAULT_STREAM_TIMEOUT_NO_WAIT

const DEFAULT_STREAM_TIMEOUT_NO_WAIT = 1

◆ HTTP_1_0

◆ HTTP_1_1

◆ HTTP_DELETE

const HTTP_DELETE = «DELETE»

◆ HTTP_GET

◆ HTTP_HEAD

◆ HTTP_OPTIONS

const HTTP_OPTIONS = «OPTIONS»

◆ HTTP_PATCH

const HTTP_PATCH = «PATCH»

◆ HTTP_POST

◆ HTTP_PUT


Объявления и описания членов класса находятся в файле:

  • C:/Bitrix/modules/main/lib/web/httpclient.php

Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.

Администратор сервиса Битрикс24 (коробочная версия)

Сложность урока:

4 уровень — сложно, требуется сосредоточится, внимание деталям и точному следованию инструкции.

5

Недоступно в редакциях:

Старт, Стандарт

Настройка Push and Pull

Если ваш Битрикс установлен на виртуальной машине

BitrixVM версии 7.1 или старше

Виртуальная машина сэкономит время и силы на правильное развертывание и администрирование сайта или внутреннего информационного ресурса на базе продуктов «1С-Битрикс».

Подробнее …




, то у вас нет необходимости настраивать модуль Push and Pull. В виртуальной машине уже поставляется отдельный Push-сервер, он настроен и сконфигурирован и работает «из коробки».

Если, всё же необходимо произвести некоторые изменения, то это делается на странице Настройки > Настройки продукта > Настройки модулей > Push and Pull:

Нажмите на рисунок, чтобы увеличить

  • Укажите секретный код для подписи сообщения. Это 32-х значный произвольный код, который указывается в настройках пуш-сервера:
    ./push-server/config/config.json:
    "security": {
            "key": 

    Примечание: В виртуальной машине

    BitrixVM

    «1C-Битрикс: Виртуальная машина» — бесплатный программный продукт, готовый к немедленному использованию виртуальный сервер, полностью настроенный, протестированный и адаптированный для оптимальной работы как с продуктами «1С-Битрикс», так и с любыми PHP-приложениями. Имеется в версии для Windows и для Unix систем.
    Подробнее…



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

  • При необходимости перенастройте шаблоны путей. Домен в адресе для чтения сообщений можно указать #DOMAIN#: такая нотация будет автоматически заменяться под нужный домен для многодоменных конфигураций. Пример: http://#DOMAIN#:8893/bitrix/sub/.
  • Если в системе несколько активных сайтов, то есть возможность выбрать, на каких сайтах модуль не будет работать.

Работа модуля Push and Pull Битрикса на виртуальной машине до версии 5.0.

Настройка nginx-push-stream-module в версии 0.4.0 (рекомендуется к использованию)

Настройка nginx-push-stream-module в версии 0.3.4

Как использовать модуль, подробно рассказано в курсе Разработчик Bitrix Framework в главе

Push and Pull

Модуль Push & Pull работает в двух режимах:

постоянное подключение к специальному серверу Сервер очередей;
в режиме опроса сервера (60-20-10).

Подробнее …




.

Документация по теме:

  • Настройки модуля (документация)
  • Зачем настраивать модуль Push&Pull (блог)
  • Работа с модулем для разработчиков
  • API модуля
  • Push-уведомления в курсе «BitrixMobile — создание кроссплатформенных мобильных приложений»

27


Подписаться на новые материалы раздела:

При установке виртуальной машины Битрикс в качестве Push-and-Pull сервера по умолчанию используется модуль Nginx под названием Nginx-PushStreamModule. Этот подход считается устаревшим, поэтому в консоли Bitrix env есть возможность заменить его на NodeJS RTC service. Казалось бы нет ничего проще выбрать в консоли пункт 10 (Configure Push/RTC service), затем пункт 1 (Install/Update NodeJS RTC Service), дождаться выполнения фонового задания и начать пользоваться современным инструментом. Но к сожалению в некоторых случаях все проходит не так гладко. Когда я стал проводить описанные действия – выполнение команд завершилось ошибкой, а я получил неработающий портал клиента. Версия виртуальной машины, где произошла эта ошибка была 7.0.3.

Ошибка при настройке push and pull сервера

Причем «откатить» изменения через консоль не удалось, так как NodeJS RTC service не установился. Оказалось, что ключевая причина в том, что перестал запускаться Nginx. При попытке его запустить выдавалась следующая ошибка: nginx: [emerg] host not found in upstream “server1:8010”.

Nginx ошибка при запуске

Первым делом я, конечно, написал обращение в техподдержку Битрикса, в то же время стал искать решение проблемы самостоятельно. Потому что ответ приходится ждать довольно долго, а «оживить» портал хотелось побыстрее.

Поиск решения занял несколько часов, причем мне в первую очередь нужно было вернуть «все как было», а не искать причину ошибки.

Сначала я открыл главный файл конфигурации nginx (/etc/nginx/ nginx.conf). Дата его изменения была давнишняя, поэтому я решил, что причина неисправности не в нем. В этом файле есть подключение других конфигурационных файлов из папок /etc/nginx/bx/conf/, /etc/nginx/bx/settings/, а также /etc/nginx/bx/site_enabled/.

Зайдя в эти папки, я обнаружил, что в них есть файлы со «свежей» датой создания. Открыв параллельно соответствующие папки другой ВМ, где NodeJS RTC service не установлен, я обнаружил, что таких файлов там нет. Значит их можно и нужно удалить.

Сначала удаляем следующие файлы:

  • /etc/nginx/bx/settings/rtc-im_settings.conf
  • /etc/nginx/bx/site_enabled/rtc-server.conf

Далее удаляем файл:

  • /etc/nginx/bx/conf/rtc-im_subscrider.conf

НО на него в этой папке есть символическая ссылка. Ее тоже нужно удалить и создать снова, но указывать она должна уже на другой файл: push-im_subscrider.conf

Делается это командой

# ln –s /etc/nginx/bx/conf/im_subscrider.conf /etc/nginx/bx/conf/push-im_subscrider.conf

После выполнения этих действий, снова пытаемся запустить Nginx.

# service nginx restart или

# systemctl restart nginx.service

В моем случае он запустился без проблем и портал снова заработал.

Кстати, техподдержка Битрикса посоветовала переустановить виртуальную машину полностью, что меня совсем не устраивало.

Затем я обновил BitrixEnv до 7.3.4 и попробовал выполнить установку NodeJS RTC service снова. Обновление не помогло. Ситуация повторилась снова. Пришлось повторить все описанные выше действия еще раз.

Надеюсь, что когда вы будете читать эту статью, подобных проблем при настройке Push-and-Pull сервера в виртуальной машине Битрикс возникать не будет.

Введение

Если у вас есть коробочная версия Битрикс24, и вы хотите использовать живую ленту, мгновенный чат, и получать push уведомления на телефон — вам понадобится модуль push and pull.

Под капотом у модуля модуль push and pull находится nginx с дополнительным модулем nginx-push-stream-module. Данный модуль не входит в стандартную поставку, поэтому для его подключения нужно собирать (компилировать) nginx из исходников.

Модуль nginx-push-stream-module есть в виртуальной машине битрикса (BitrixVM) из коробки. Поэтому самое простое решение данной задачи — развернуть BitrixVM и поставить на нее корпоративный портал.

Но если у вас нет BitrixVM и вы не хотите только ради этого переходить на нее — нужно скомпилировать nginx с поддержкой модуля nginx-push-stream-module из исходников, вручную.

Проблема

При работе с сайтом в публичной части выводится красная полоска с сообщением об ошибке “Отсутствует соединение с сервером”. Эта ошибка говорит о наличии проблемы с модулем push and pull.

При наличии такой ошибки, чтобы увидеть новое сообщение в чате — нужно либо долго ждать, либо перезагрузить страницу. В живой ленте обновления тоже будут появляться с большой задержкой или после перезагрузки страницы.

Можно выделить ряд характерных сообщений об ошибках (их можно найти в админке или в логах), свидетельствующих о необходимости настройки модуля push and pull:

  • потеряно соединение с сервером
  • выключена опция nginx push stream module в настройках модуля push and pull
  • модуль nginx-push-stream работает некорректно
  • не удалось подключиться к модулю nginx-push-stream отправки мгновенных сообщений
  • не работает бизнес-чат в реальном времени (check_pull_stream): fail
  • не настроен модуль nginx push-stream-module
  • требуется установка nginx-push-stream-module
  • требуется настройка bitrix push server
  • требуется компиляция nginx для модуля push and pull для корпоративного портала

Коллеги-специалисты, которыми я задавал вопрос про настройку данного модуля ничего толком подсказать не смогли. Официальная иформация разбросана по разным статьям и всегда заканчивается рекомендацией воспользоваться BitrixVM. Поэтому трудно понять правильную последовательность действий.

Во время поиска информации мне попалась группа тематических веток на форумах: один, два, три, четыри, пять. И даже заказы решения данной задачи на биржах фриланса: один и два.

Проблемы с настройкой модуля push and pull регулярно возникают у многих. Судя по всему, задача не имеет тривиального решения, и исчерпывающего руководства, собранного в одном месте. Попробую исправить ситуацию.

Сборка nginx с модулем nginx-push-stream-module

В учебном курсе Администратор. Модули → Push and Pull сказано

Соберите NGINX с поддержкой модуля nginx-push-stream-module;

но не сказано в деталях как его собрать. Об этом сказано на сайте самого модуля nginx-push-stream-module, в разделе Installation. Там подробно описан процесс сборки, но есть некоторые нюансы, которые я хочу рассмотреть.

Текущая версия модуля nginx-push-stream-module 0.5.4, а в документации битрикса сказано:

Внимание! Работа модуля Push and Pull поддерживается только до версии 0.5 nginx-push-stream-module. Более свежии версии не поддерживаются, так как для работы Push and Pull разрабатывается специальное решение от «1С-Битрикс».

Еще одна сложность заключается в том, что версия модуля nginx-push-stream-module завязана на версию nginx. Версия моего текущего nginx была 1.12 и мне не удалось собрать из исходников эту же версию nginx, которая бы скомпилировалась с модулем nginx-push-stream-module версии 0.5 или 0.5.4. Поэтому я решил попробовать собрать nginx последней версии с последней версией модуля nginx-push-stream-module.

В конечном счете, чтобы собрать nginx у меня получилась такая конфигурация:

$ ./configure --add-module=../nginx-push-stream-module --with-zlib=./zlib-1.2.11 --with-openssl=./openssl-1.0.2n --with-pcre=./pcre-8.41 --with-http_ssl_module

--with-http_ssl_module — этот модуль нужен обязательно, если на сайте используется https. А для этого модуля нужна openssl библиотека. Но последняя версия (1.1.0) openssl библиотеки не годится, так как с ней nginx не компилируется — это известный баг и пока что нужно использовать старую версию(1.0.2).

--with-zlib — Библиотека нужна для модуля ngx_http_gzip_module. Указывается путь к папке с исходниками библиотеки.

--with-pcre — Библиотека нужна для использования регулярных выражений в директиве location и для модуля ngx_http_rewrite_module. Указывается путь к папке с исходниками библиотеки.

--add-module=../nginx-push-stream-module — подключаем модуль nginx-push-stream-module. Указывается путь к папке с исходниками библиотеки.

То есть, сначала нужно скачать исходники всех библиотек, распаковать их (например в текущей папке) и указать путь к ним.

Итоговый список bash команд (запускать от имени пользователя root), чтобы собрать nginx со всеми необходимыми модулями:

# clone the nginx-push-stream-module project
git clone https://github.com/wandenberg/nginx-push-stream-module.git
NGINX_PUSH_STREAM_MODULE_PATH=$PWD/nginx-push-stream-module

# get desired nginx version (works with 1.2.0+)
wget http://nginx.org/download/nginx-1.2.0.tar.gz

# extract nginx
tar xzvf nginx-1.2.0.tar.gz
cd nginx-1.2.0

# download and extract zlib module
wget http://zlib.net/zlib-1.2.11.tar.gz
tar -xf zlib-1.2.11.tar.gz

# download and extract openssl module
wget https://www.openssl.org/source/openssl-1.0.2n.tar.gz
tar -xf openssl-1.0.2n.tar.gz

# download and extract pcre module
wget https://ftp.pcre.org/pub/pcre/pcre-8.41.tar.gz
tar -xf pcre-8.41.tar.gz

# configure and build
./configure --add-module=../nginx-push-stream-module --with-zlib=./zlib-1.2.11 --with-openssl=./openssl-1.0.2n --with-pcre=./pcre-8.41 --with-http_ssl_module
make build

# install and finish
make install

Во время выполнения команды make могут появиться различные ошибки, в основном это недостающие пакеты для компиляции. В конце статьи я приложил несколько ссылок по решению возможных проблем, из тех, с которыми я столкнулся.

После успешного выполнения команды ./configure, должно получить примерно следующее:

nginx binary file: "/usr/local/nginx/sbin/nginx" — в этом месте будет располагаться новый собранный бинарник, отсюда его нужно будет копировать вместо старого.

После успешного выполнения команды make install (она может выполняться долго), должно получиться примерно следующее:

Если появились какие-то сообщения об ошибках или есть строки красного цвета, значит что-то пошло не так.

Теперь можно проверить, правильно ли собрался nginx, есть ли там указанные модули /usr/local/nginx/sbin/nginx -V:

Таким же образом, можно перед сборкой посмотреть, какие модули были ранее установлены в старом nginx, скопировать их и добавить в список модулей для установки, при компиляции нового бинарника nginx.

Подключение собранного nginx

Порядок действий:

  • положить новый бинарник в рабочую папку вместо старого ( у меня /usr/sbin/nginx)
  • проверить и настроить пути к конфигам
  • остановить службу nginx
  • проверить, что нет ошибок
  • перезапустить службу nginx

Список bash команд для подключения нового бинарника, в общем виде:

service nginx stop
mv /path/to/old/nginx /path/to/old/nginx_backup
mv /usr/local/nginx/sbin/nginx /path/to/old/nginx
ngint -t
service nginx start

/path/to/old/ — замените на свой путь к старому бинарнику.

Не удаляйте старый бинарник! Переименуйте его на время тестирования, чтобы вернуть его назад, если возникнут проблемы с работой сайтов.

Новый бинарник подтянет старые файлы конфигурации, однако сразу же проверьте работоспособность своих сайтов.

Но если путь к конфигам отличается от стандартного и не был указан при компиляции — может понадобится прописать путь к старому конфигу.

В моем случае новый бинарник подтягивал конфиг из /usr/local/nginx/conf/nginx.conf, а старые конфиги былы тут /etc/nginx/nginx.conf. Для решения этой проблемы достаточно создать симлинк на старый путь:

cd /usr/local/nginx/
mv conf/ conf_del
ln -s /etc/nginx/ ./conf

Настройка nginx для модуля push and pull

1) В nginx добавить в блок server{} (для виртуального хоста) локейшены из битриксовой документации

# Location for long-polling connections
location ^~ /bitrix/sub {
    # we don't use callback and droppped it (XSS)
    if ( $arg_callback ) {
        return 400;
    }

    push_stream_subscriber            long-polling;
    push_stream_allowed_origins "*";
    push_stream_channels_path        $arg_CHANNEL_ID;
    push_stream_last_received_message_tag    $arg_tag;
    if ($arg_time) {
        push_stream_last_received_message_time "$arg_time";
    }
    push_stream_longpolling_connection_ttl    40;
    push_stream_authorized_channels_only    on;
    push_stream_message_template '#!NGINXNMS!#{"id":~id~,"channel":"~channel~","tag":"~tag~","time":"~time~","eventid":"~event-id~","text":~text~}#!NGINXNME!#';
}

# Location for websocet connections
location ^~ /bitrix/subws/ {
    push_stream_subscriber websocket;
    push_stream_channels_path        $arg_CHANNEL_ID;
    push_stream_websocket_allow_publish    off;
    push_stream_ping_message_interval    40s;
    push_stream_authorized_channels_only     on;
    push_stream_last_received_message_tag    "$arg_tag";
    push_stream_last_received_message_time    "$arg_time";
    push_stream_message_template '#!NGINXNMS!#{"id":~id~,"channel":"~channel~","tag":"~tag~","time":"~time~","eventid":"~event-id~","text":~text~}#!NGINXNME!#';
}

2) В nginx добавить общие настройки модуля push and pull.

Нужно создать новый файл в папке с конфигами nginx для виртуального хоста, например push_and_pull.conf и поместить в него настройки.
Некоторые строки пришлось закомментировать, так как они нужны только для BitrixVM.

# Common settings for nginx-push-stream-module
push_stream_shared_memory_size 256M;
push_stream_max_messages_stored_per_channel 1000;
push_stream_max_channel_id_length 32;
push_stream_max_number_of_channels 200000;
push_stream_message_ttl 86400;

# поддержка мобильных платформ, для http запросов
server {
    # nginx-push-stream-module server for push & pull

    listen 8893;
    server_name _;
    
    # Include error handlers
    #include bx/conf/errors.conf;
    
    # Include im subscrider handlers
    #include bx/conf/im_subscrider.conf;
    
    location ^~ / { deny all; }
}

# поддержка мобильных платформ, для https запросов
# SSL enabled server for reading personal channels
server {
    listen 8894;
    server_name _;
    
    #include bx/conf/ssl.conf;
    
    # Include error handlers
    #include bx/conf/errors.conf;
    
    # Include im subscrider handlers
    #include bx/conf/im_subscrider.conf;
    
    location ^~ / { deny all; }
}

# для публикации сообщений
# Server to push messages to user channels
server {
    listen 127.0.0.1:8895;
    server_name _;
    
    location ^~ /bitrix/pub/ {
        push_stream_publisher admin;
        push_stream_channels_path $arg_CHANNEL_ID;
        push_stream_store_messages on;
        allow 127.0.0.0/8;
        deny all;
    }
    
    location ^~ / { deny all; }
    
    # Include error handlers
    #include bx/conf/errors.conf;
}

3) Включить модуль push and pull в настройках в админке

Значение параметра На сервер установлена ближе всего к Виртуальная машина 4.4 и выше (nginx-push-stream-module 0.4.0), поэтому устанавливаем именно этот вариант.

Теперь можно тестировать работу модуля push and pull — сообщения в чате должны приходить мгновенно, а в живой ленте должны появляться изменения (комментарии, просмотры, лайки, записи) без перезагрузки страницы.

Настройка модуля Bitrix NodeJS RTC

Push сервер на основе nginx не справлялся с нагрузкой, которую создавали пользователи облачного сервиса Битрикс24, и поэтому появилась необходимость в разработке нового push сервера — NodeJS RTC, у которого под капотом Node.js. Новый push сервер встроен в BitrixVM версии 7+ и есть инструкция по его настройке. Мне не удалось найти информацию, как его настраивать без использования BitrixVM.

Для любой коробочной версии корпоративного портала, в которой количество активных пользователей намного меньше, чем в облачной версии — вполне хватит старой реализации push сервера на основе nginx.

Заключение

Чтобы запустить модуль push and pull необязательно ставить BitrixVM.

Есть мнение, что сборка из исходников — это слишком простой путь, и что правильнее собрать полноценный deb-пакет, который будет управляться пакетным менеджером. Для такого пакета можно запретить обновление (hold), чтобы впредь не обновлялся.

В данном случае опробована связка Debian + nginx 1.2.0 + nginx-push-stream-module 0.5.4 + bitrix 17.5.8 — все работает.

Полезные ссылки

Общая информация

  • Зачем настраивать модуль Push&Pull

Инструкции по сборке nginx

  • Сборка nginx из исходных файлов — офиц. документация
  • Пример сборки nginx с добавлением модуля ngx_pagespeed
  • Учебный курс — Администратор. Модули — Push and Pull
  • Как установить nginx push-and-pull на Debian (для Bitrix)
  • Push and Pull for Bitrix without BitrixEnv

Исходники библиотек

  • nginx core
  • nginx-push-stream-module (push and pull)
  • zlib
  • openssl
  • pcre

Решение возможных проблем

  • git command not found
  • make command not found
  • configure: error: You need a C++ compiler for C++ support
  • nginx — src/core/ngx_sha1.h:19:17: no such file or directory

(@stalker_slx)

Estimable Member

Присоединился: 4 года назад

Журнал проверки системы

2020-Apr-14 17:12:19 Наличие необходимых модулей php (check_php_modules): Ok

Все необходимые модули установлены

2020-Apr-14 17:12:19 Обязательные параметры PHP (check_php_settings): Fail

Ошибка! Вы используете веб-окружение 1С-Битрикс старой версии (7.3.3), установите актуальную версию, чтобы не было проблем с настройкой сервера (7.4.3

).

2020-Apr-14 17:12:19 Модули веб-сервера (check_security): Ok

Конфликтов не выявлено

2020-Apr-14 17:12:19 Значения переменных сервера (check_server_vars): Ok

Корректные

2020-Apr-14 17:12:19 Сохранение сессии (check_session): Ok

50% done

2020-Apr-14 17:12:19 Сохранение сессии (check_session): Ok

Успешно

2020-Apr-14 17:12:19 Параметры настройки UTF (mbstring и константа BX_UTF) (check_mbstring): Ok

Правильные. Сайт работает в UTF кодировке

2020-Apr-14 17:12:19 Служебные скрипты в корне сайта (check_install_scripts): Ok

Отсутствуют

2020-Apr-14 17:12:19 Работа с сокетами (check_socket): Fail

Connection to ssl://bitrix24.mycompany.com:443       Fail

Socket error [0]:

Ошибка! Не работает

2020-Apr-14 17:12:20 Выполнение агентов на cron (check_bx_crontab): Ok

Успешно

2020-Apr-14 17:12:20 Бизнес-чат в реальном времени (check_pull_stream): Fail

Server version: 3 (Bitrix Push server)

Connection to ssl://bitrix24.mycompany.com:443       Fail

Socket error [0]:

Ошибка! Не удалось подключиться к модулю nginx-push-stream чтения мгновенных сообщений

2020-Apr-14 17:12:20 Живые комментарии в ленте сообщений (check_pull_comments): Fail

Ошибка! Не настроен модуль nginx push-stream, который необходим для отображения комментариев в живой ленте в реальном режиме времени

2020-Apr-14 17:12:20 Видеозвонки (check_turn): Fail

Ошибка! Не настроен модуль nginx push-stream, который необходим для осуществления видеозвонков

2020-Apr-14 17:12:20 Мобильное приложение Битрикс24 (check_access_mobile): Ok

Connection to checker.internal.bitrix24.com:80       Success

== Request ==

GET /check/?license_hash=ee054a156a095bf850f0e0539a11dc45&host=bitrix24.mycompany.com&port=443&https=Y HTTP/1.1

host: checker.internal.bitrix24.com

== Response ==

HTTP/1.1 200 OK

Content-Type: text/plain

Date: Tue, 14 Apr 2020 14:12:20 GMT

Server: nginx/1.8.1

X-Powered-By: PHP/5.3.3

Content-Length: 46

Connection: keep-alive

== Body ==

Check: OK

Status: 200

Connection: keep-alive

==========

Connection to checker.internal.bitrix24.com:80       Success

== Request ==

GET /check/?license_hash=ee054a156a095bf850f0e0539a11dc45&host=bitrix24.mycompany.com&port=8894&https=Y HTTP/1.1

host: checker.internal.bitrix24.com

== Response ==

HTTP/1.1 200 OK

Content-Type: text/plain

Date: Tue, 14 Apr 2020 14:12:20 GMT

Server: nginx/1.8.1

X-Powered-By: PHP/5.3.3

Content-Length: 46

Connection: keep-alive

== Body ==

Check: OK

Status: 403

Connection: keep-alive

==========

Успешно

2020-Apr-14 17:12:21 Уведомления пользователям на мобильные устройства (push уведомления) (check_push_bitrix): Ok

Connection to ssl://cloud-messaging.bitrix24.com:443 Success

Успешно

2020-Apr-14 17:12:21 Работа с документами через Google Docs и MS Office Online (check_access_docs): Ok

Успешно

2020-Apr-14 17:12:21 Битрикс24.Диск. Быстрая работа с файлами (check_fast_download): Warning

Замечание. Не удалось проверить из-за ошибки в работе с сокетами

2020-Apr-14 17:12:21 Поиск по содержимому документов (check_search): Ok

Успешно

2020-Apr-14 17:12:21 Отправка почтовых уведомлений (check_mail): Ok

Успешно

2020-Apr-14 17:12:22 Доступ к облачным сервисам 1С-Битрикс (check_ca_file): Ok

Успешно

2020-Apr-14 17:12:22 Интеграция с почтой внутри компании (check_connect_mail): Ok

Успешно

2020-Apr-14 17:12:22 Интеграция с соцсетями (check_socnet): Ok

Успешно

2020-Apr-14 17:12:22 Работа с REST API (check_rest): Ok

Успешно

2020-Apr-14 17:12:22 Публикация сообщений в живую ленту из почты (check_mail_push): Warning

Замечание. Не удалось получить MX запись для домена bitrix24.mycompany.com

2020-Apr-14 17:12:22 Доступ снаружи к Экстранет (check_extranet): Ok

Успешно

2020-Apr-14 17:12:22 Редактирование документов в MS Office (check_webdav): Warning

Замечание. Не удалось проверить из-за ошибки в работе с сокетами

2020-Apr-14 17:12:22 Интеграция с внешними приложениями (MS Office, Outlook, Exchange) через безопасное подключение к порталу (check_socket_ssl): Warning

Connection to ssl://bitrix24.mycompany.com:443 (certificate check enabled)  Fail

Connection to ssl://bitrix24.mycompany.com:443       Success

Замечание. Сервер имеет невалидный SSL сертификат, возможны проблемы в интеграции с внешними приложениями

2020-Apr-14 17:12:22 Интеграция с Active Directory (check_ad): Warning

Замечание. Интеграция с AD сервером не настроена

2020-Apr-14 17:12:22 Единая авторизация в Windows сети (NTLM) (check_ntlm): Warning

Замечание. Выключена опция использования NTLM авторизации в настройках модуля ldap

2020-Apr-14 17:12:22 Оценка производительности сервера (check_perf): Warning

Замечание. Не удалось проверить из-за ошибки в работе с сокетами

2020-Apr-14 17:12:22 Ускорение открытия страниц (check_compression): Warning

Замечание. Не удалось проверить из-за ошибки в работе с сокетами

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