Я пишу бота для телеграмма на 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;
}
У вас есть несколько путей решения, вот некоторые из них:
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);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Помогите разобраться! При обновлении элемента инфоблока Битрикс, по событию должно присваиваться значениеЕсли изначально поле значения...
в базе mysql поле Usloviya просто текст (это одно поле):
на вход поступает объект, нужно записать в сsv файл, преобразовав объект в массив