Много file_get_contents() вызывают ошибку 500

133
21 октября 2021, 00:30

Я пишу бота для телеграмма на php.

У меня есть база данных, из нее я получаю ID канала, в одной функции смотрю описание канала с помощью file_get_contents(), во второй задаю новое описание с помощью file_get_contents(). каналов более тысячи и сервер не выдерживает не до конца выполняет скрипт, как можно оптимизировать? С многопоточностью в php еще не знаком.

То есть с каждым каналом оно делает 2 запроса, каналов 1700, итого 3400 запросов, php не успевает обработать и сервер умирает, выдает 500 Internal Server Error The server encountered an internal error or misconfiguration and was unable to complete your request. успев при этом у некоторых поменять описание

куски кода:

$query = "SELECT `ID_Channel_tg`, `TIMEZONE` FROM `u747826294_mtm`.`CLOCKOBOT_Channel` ORDER By `ID_Channel` LIMIT 25 OFFSET ".$_GET['n'];
$result = mysqli_query($con, $query);
if($result){
    while($value = mysqli_fetch_assoc($result)){
        getChat($value["ID_Channel_tg"],$value["TIMEZONE"]);
    }
}
================================================================
function getChat($chatId,$timezone){
    $data = file_get_contents($GLOBALS[website]."/getChat?chat_id=".$chatId);
    ...операции с описанием...
    setChatDescription($chatId, $string);
}
function setChatDescription($chatId, $reply){
    $url = $GLOBALS[website]."/setChatDescription?chat_id=".$chatId."&description=".$reply;
}
Answer 1

У вас есть несколько путей решения, вот некоторые из них: 1) Разбить выполнение на "пачки" (на английском batch processing), т.е. допустим ваш скрипт находится по адресу https://example.com/tg_chat.php, и вы разбиваете обработку ваших каналов на несколько "пачек" и скрипт вызываете следующим образом https://example.com/tg_chat.php?batchId=1, https://example.com/tg_chat.php?batchId=2, https://example.com/tg_chat.php?batchId=N, а свой первоначальный SQL запрос разбиваете части с помощью LIMIT x OFSSET x

2) Использовать систему очередей, но я думаю вы сейчас не сможете ее корректно реализовать и использовать. Но если интересно поищите в интернете: php очереди сообщений, php rabbitmq OR kaffka OR gearman

3) Выполнять эти операции не из браузера, а на сервере через командную консоль или планировщик cron по расписанию.

PS: но для начала советую в начало скрипта поставить вывод всех ошибок, что бы точно определить ошибку и устранить ее, для этого просто вставьте в начале файла после <?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
READ ALSO
Свойство записывается со второго раза

Свойство записывается со второго раза

Помогите разобраться! При обновлении элемента инфоблока Битрикс, по событию должно присваиваться значениеЕсли изначально поле значения...

170
как из базы mysql поле text построчно обернуть в li?

как из базы mysql поле text построчно обернуть в li?

в базе mysql поле Usloviya просто текст (это одно поле):

202
ООП возврат строки

ООП возврат строки

Имеется класс

155
запись объекта в массив

запись объекта в массив

на вход поступает объект, нужно записать в сsv файл, преобразовав объект в массив

94