const TARGET_PROD_URL = "erp.erp-flowers.ru";
+ /**
+ * Таймаут установки TCP/TLS-соединения с Telegram API (секунды).
+ *
+ * Почему важно: api.telegram.org резолвится в IPv6, и при отсутствии
+ * IPv6-маршрута cURL по умолчанию виснет ~130с. Запросы к Telegram
+ * выполняются синхронно внутри обработки HTTP-запроса (в т.ч. из
+ * лог-таргета на каждый Yii::error()), поэтому без таймаута блокируется
+ * воркер PHP-FPM, пул исчерпывается и весь сайт отдаёт 504.
+ */
+ private const CONNECT_TIMEOUT = 2;
+
+ /**
+ * Таймаут всего HTTP-запроса к Telegram API (секунды).
+ */
+ private const REQUEST_TIMEOUT = 5;
+
+ /**
+ * HTTP-клиент с обязательными таймаутами для запросов к Telegram API.
+ */
+ private static function getHttpClient(): Client
+ {
+ return new Client([
+ 'connect_timeout' => self::CONNECT_TIMEOUT,
+ 'timeout' => self::REQUEST_TIMEOUT,
+ ]);
+ }
+
/**
* Получить токен бота для dev окружения
*/
if ($reply_markup) {
$url .= "&reply_markup=" . json_encode($reply_markup, JSON_UNESCAPED_UNICODE);
}
- $client = new \GuzzleHttp\Client();
+ $client = self::getHttpClient();
return $client->request('GET', $url);
}
$chatId = $chatIdErp;
}
- $client = new Client();
+ $client = self::getHttpClient();
try {
$client->post($apiURL, [
'json' => [
$apiURL = "https://api.telegram.org/bot{$botToken}/sendMessage";
$chats = ['337084327', '730432579']; //Алексей и Владимир
$message = self::escapeMarkdown($message);
- $client = new Client();
+ $client = self::getHttpClient();
foreach ($chats as $chatId) {
try {
$buttons = self::getTgButtons($chatId);
curl_setopt($ch, CURLOPT_POSTFIELDS, $arrayQuery1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
+ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, self::CONNECT_TIMEOUT);
+ curl_setopt($ch, CURLOPT_TIMEOUT, self::REQUEST_TIMEOUT);
$res1 = curl_exec($ch);
curl_close($ch);
curl_setopt($ch, CURLOPT_POSTFIELDS, $arrayQuery2);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
+ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, self::CONNECT_TIMEOUT);
+ curl_setopt($ch, CURLOPT_TIMEOUT, self::REQUEST_TIMEOUT);
$res2 = curl_exec($ch);
curl_close($ch);
try {
$buttons = self::getTgShortButtons($chatId);
- $client = new Client();
+ $client = self::getHttpClient();
$media = [
[
return $e->getMessage();
}
- $client = new Client();
+ $client = self::getHttpClient();
try {
$response = $client->post($apiURL2, [
$message = self::escapeMarkdown($message);
$buttons = self::getTgButtons($chatId);
- $client = new Client();
+ $client = self::getHttpClient();
try {
$response = $client->post($apiURL, [
'json' => [