Роман Мирр, я все долблю хост, вот что они ответили мне:
spoiler
This email is in regards to your open ticket concerning the 500 error on your site. We have investigated the site and the cause of the errors and it looks to be the mysql script. It runs every minute calling the database and that creates what we call a "user connection" and you only can have 15 at a time running. The crons do not drop the connection so after 15 mins you already take up the connections so then when you try and go to the site you see the 500 error because there are no more connections available.
We would recommend that you troubleshoot your cron so it doesn't run as frequent or its able to close the user connection after its done calling the database. Thank you for the opportunity to assist you today. There is a three question survey linked at the bottom of this email if you can let me know how I did - all feedback helps! If you have any further questions, please feel free to reply to this email and Ill be more than happy to lend a hand.
Указывают на то, что я не закрываю соединение с БД, хотя я задавал этот вопрос на тостере и уважаемые "Эксперты" сказали, мол а зачем это вам делать? Ведь при завершении скрипта соединение само завершится.
Я использую вот такой сценарий:
spoiler
function Connect () {
include("config.php");
$DB = new mysqli($DB_SERVER, $DB_USER, $DB_PASS, $DB_BASE);
return $DB;
}
class Script {
private $DB;
public function __construct($DB)
{
$this->DB = $DB;
}
function MultiCurlRequest ($data)
{
$multi = curl_multi_init();
$handles = [];
$array = [];
foreach ($data as $key)
{
$ch = curl_init();
$url = "https://123.ru";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 50);
curl_multi_add_handle($multi, $ch);
$handles[] = array(
'url' => $ch,
'Ip' => $key["Ip"],
'QtyVerifyTime' => $key["QtyVerifyTime"]
);
}
$active = null;
do {
$mrc = curl_multi_exec($multi, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($multi) == -1) {
usleep(10000);
// continue;
}
do {
$mrc = curl_multi_exec($multi, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
foreach ($handles as $handle)
{
$result = curl_multi_getcontent($handle["url"]);
$array[] = array(
'Ip' => $handle["Ip"],
);
curl_multi_remove_handle($multi, $handle["url"]);
}
curl_multi_close($multi);
return $array;
}
}
$DB = Connect();
$object = new Script($DB);
$object->CheckList (); // старт идет тут.
за 1 минуту в multi curl приходит на текущий момент не более 10 запросов по которым он должен сделать обращение и дождаться ответа, это делается через proxy и ответ иногда может быть долгим, до time out который установлен 50 секунд.
Вызов ф-ции MultuCurlRequest идет из другой ф-ции (которая выполняет задачу выборки из БД и передает нужные данные в ф-цию)
spoiler
function CheckList ()
{
$LIMIT = 10;
$query = $this->DB->query("SELECT Ip, Port FROM sc_list WHERE Status = 0 ORDER BY Id DESC LIMIT " . $LIMIT . "");
if (!empty($query->num_rows)) {
$result = $this->MultuCurlRequest($query);
}
if (!empty($result)) {
foreach ($result as $value) {
// обрабатываем результат который вернула ф-ция. (Запросы к БД)
}
}
return true;
}
Может подскажите, где нужно закрывать соединение с БД?) Или может хостер опять наплетает?
Если это пародия на штрих код, то получается смысла от него нету? просто так лепить штрих код не думаю, что есть смысл, а если это не популярный формат, то можно как-то вычислить какой это всеже?)
Роман Мирр, я написал свой сценарий - он вызывает точно такие же ошибки как и сайт, значит проблем в коде нету, писали 2 разных человека, а ошибки одни, я ссылаюсь в большей степени, что че-то не хватает серверу, мб память закончилась, или еще чего и он не смог выполнить скрипт, и выдал эту ошибку, но это не говорит о том, что ошибка в самом сценарии...
Роман Мирр, спросил у хоста, сказали мол у меня только 1 процесс, cron задачи не считаются процессами как я понял, он даже уточнил специально и сказал, что по ним нет ограничений никаких.. :(( тогда почему скрипты не могут запуститься? Это не 1 скрипт, а десятки крон задач с одной и той же ошибкой сыпятся.
Сергей Горностаев, это не возможно, софт я купил. он закодирован, я не могу изменять его. Все что я могу - это перенести свои cron задачи либо в 1 задачу, либо я думаю возможно перенести на другой хост...
Роман Мирр, я делал запросы по отдельности, но иногда при клацаний по основному сайту я начал получать Error 500, при этом если через 1-2 секунды обновить страницу снова ошибка пропадает. Мне сказали, мол слишком много запросов к БД идет, это причина error 500, но как пишут товарищи внизу - это бред и ошибка в чем-то другом.
Иван Шумов, Какие проблемы с базой?? какие могут быть проблемы? запрос составлен не правильно? или что? Вы лучше дельный совет дайте, если есть понимание, а не просто отправляйте юзера туда, не знаю куда, сделать то, сами не знаете чего. Множество запросов я сейчас стараюсь сделать одним запросом, а не десятком через циклы.
Я действительно не понимаю, про какие проблемы с БД вы говорите. У меня нет проблем с mysql, я спрашиваю как можно делать задачу через 1 запрос, чтобы не создавать 100 запросов отдельно, разве это не правильно?
Расскажите про транзакции поподробнее, что это?
500 ошибка возникает не во время выполнения скрипта, а если скрипт выполняется сделать какое-нибудь действие на сайте которое связано с бд мы 50/50 можем получить эту ошибку, я спрашивал у поддержки хоста сказали может быть из-за большого количества обращений к бд за 1 секунду.
Rsa97, в таблицу sc_orders мы будем заносить заказы в дальнейшем из таблицы codes. В sc_orders мы как раз проверяем, а есть ли заказы в процессе?!) если >= 20 мы не будем заносить новые, иначе если меньше мы должны занести 1,2, или 10 в зависимости от того, сколько в процессе (статус 5).
Rsa97, система должна работать вот так:
Проверяем, есть ли заказы в таблице sc_order со статусом 5, если нету должны загрузить 20 шт (лимит задаем через переменную) если в таблице 20шт, то ничего не делать, если в таблице 10 штук, то нужно загрузить 10, т.е. смысл таков, что мы должны взять заказы из таблицы, при этом учитывать текущее количество заказов (оно обозначается статусом 5), чтобы в сумме это не превышало заданный лимит.
Rsa97, ну выборку из двух таблиц сделать можно проще в таком случае. Мне нужно именно проверять количество записей в sc_order если их 5, то из codes выбирать только 15 записей.
Я не очень силен в mysql, но как тут проверяется вот этот момент:
Если в sc_orders есть 5 записей со статусом 5 из codes мы должны получить только 15 записей?
We would recommend that you troubleshoot your cron so it doesn't run as frequent or its able to close the user connection after its done calling the database. Thank you for the opportunity to assist you today. There is a three question survey linked at the bottom of this email if you can let me know how I did - all feedback helps! If you have any further questions, please feel free to reply to this email and Ill be more than happy to lend a hand.
Указывают на то, что я не закрываю соединение с БД, хотя я задавал этот вопрос на тостере и уважаемые "Эксперты" сказали, мол а зачем это вам делать? Ведь при завершении скрипта соединение само завершится.
Я использую вот такой сценарий:
за 1 минуту в multi curl приходит на текущий момент не более 10 запросов по которым он должен сделать обращение и дождаться ответа, это делается через proxy и ответ иногда может быть долгим, до time out который установлен 50 секунд.
Вызов ф-ции MultuCurlRequest идет из другой ф-ции (которая выполняет задачу выборки из БД и передает нужные данные в ф-цию)
Может подскажите, где нужно закрывать соединение с БД?) Или может хостер опять наплетает?