• Модуль: pull
  • Путь к файлу: ~/bitrix/modules/pull/classes/general/pull_channel.php
  • Класс: CPullChannel
  • Вызов: CPullChannel::SendCommand
static function SendCommand($channelId, $message, $options = array())
{
	if (!is_array($channelId))
		$channelId = Array($channelId);

	$channelId = implode('/', array_unique($channelId));

	if ($channelId == '' || $message == '')
		return false;

	$defaultOptions = array(
		"method" => "POST",
		"timeout" => 5,
		"dont_wait_answer" => true
	);

	$options = array_merge($defaultOptions, $options);

	if (!in_array($options["method"], Array('POST', 'GET')))
		return false;

	$nginx_error = COption::GetOptionString("pull", "nginx_error", "N");
	if ($nginx_error != "N")
	{
		$nginx_error = unserialize($nginx_error, ["allowed_classes" => false]);
		if (intval($nginx_error['date'])+120 < time())
		{
			COption::SetOptionString("pull", "nginx_error", "N");
			CAdminNotify::DeleteByTag("PULL_ERROR_SEND");
			$nginx_error = "N";
		}
		else if ($nginx_error['count'] >= 10)
		{
			$ar = Array(
				"MESSAGE" => GetMessage('PULL_ERROR_SEND'),
				"TAG" => "PULL_ERROR_SEND",
				"MODULE_ID" => "pull",
			);
			CAdminNotify::Add($ar);
			return false;
		}
	}

	$postdata = CHTTP::PrepareData($message);

	$httpClient = new BitrixMainWebHttpClient([
		"socketTimeout" => (int)$options["timeout"],
		"streamTimeout" => (int)$options["timeout"],
		"waitResponse" => !$options["dont_wait_answer"]
	]);
	if ((int)$options["expiry"])
	{
		$httpClient->setHeader("Message-Expiry", (int)$options["expiry"]);
	}
	$url = BitrixPullConfig::getPublishUrl($channelId);
	if(CPullOptions::IsServerShared())
	{
		$signature = static::GetSignature($postdata);
		$url = CHTTP::urlAddParams($url, ["signature" => $signature]);
	}

	$httpClient->disableSslVerification();//todo: remove

	$sendResult = $httpClient->query($options["method"], $url, $postdata);

	if ($sendResult)
	{
		$result = $options["dont_wait_answer"] ? '{}': $httpClient->getResult();
	}
	else
	{
		if ($nginx_error == "N")
		{
			$nginx_error = Array(
				'count' => 1,
				'date' => time(),
				'date_increment' => time(),
			);
		}
		else if (intval($nginx_error['date_increment'])+1 < time())
		{
			$nginx_error['count'] = intval($nginx_error['count'])+1;
			$nginx_error['date_increment'] = time();
		}
		COption::SetOptionString("pull", "nginx_error", serialize($nginx_error));
		$result = false;
	}

	return $result;
}