Здравствуйте, уважаемые товарищи программисты, прошу помочь оптимизировать скрипт, так как столкнулся с ошибкой 504 Gateway Timeout и похоже кроме оптимизации ему ничего не поможет, ниже подробнее.
Сам парсер находится по пути domen.com/import/import.php (GET параметр number номер документа для обработки xml файлов (категории, атрибуты (import0.xml) и товары (от import1 и выше) ) полученных с 1С (import0-import5.xml), key - это секретный ключ, чтобы посторонние не запустили парсер
domen.com/import/import.php?number=1&key=210236 пример запуска самого парсера напрямую
Вызов парсеров осуществляется через curl по расписанию скриптом-планировщиком worker.php - запускает по CURL скрипты в зависимости от статуса обработан скрипт или нет (статус берется из базы), затем, после успешной обработки от парсера worker.php записывается в базу status 1 чтоб повторно его не обрабатывать.
Самый интересный момент, если запустить отдельно парсер с браузера ВРУЧНУЮ domen.com/import/import.php?number=1&key=210236 , то все работать будет успешно, ответом будет "good", НО если тоже самое через curl в worker.php запустить то получаю ошибку 504 Gateway Timeout, но при этом worker.php падает, но сам парсер (import.php), который вызвал curl, продолжает работать до последнего корректно (проверял).
То есть вывод: каким -то удивительным образом времени исполнения скрипта хватает на сам парсер (import.php), но не хватает на обработчик задач, запускающего его по CURL
Делал: время исполнения скрипта увеличил сначала max_execution_time до 6000 , потом ставил 0 (бесконечно) На всякий случай увеличил память до 1024 Мб
Ставил в скрипте: set_time_limit(0)
ini_set('max_execution_time', -1); - в интернете видел подобное
Ничего не помогает
Очень был бы признателен если бы смогли помочь каким-нибудь советом по оптимизации скрипта
<?
include 'db.php';
set_time_limit(0);
ini_set('display_errors', 1);
//проверяем текущее время
$datetime = date('Y-m-d H:i:s');
$time = strtotime($datetime);
$time = $time - (5 * 60);
$datecron = date("Y-m-d H:i:s", $time);
function go_parse($url){
$userAgent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36';
$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL,$url);
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 12000);
curl_setopt($curl_handle, CURLOPT_TIMEOUT, 12000);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_USERAGENT, $userAgent);
$query = curl_exec($curl_handle);
curl_close($curl_handle);
return $query;
}
function parsing_file($namefile){
global $mysqli;
global $datetime;
$skey = '676236';
$key = preg_replace('/[^0-9]/', '', $namefile);// узнаем номер импорт-файла (пример import1.xml значит ключ = 1)
echo 'key = '.$key.'<br>'; //для отладки
if ($key == '0'){
$status = go_parse("https://domen.com/import/groups.php?key=$skey"); //запускаем скрипт парсинга категорий и атрибутов
echo $status = trim($status);
if($status == 'good'){
echo "File import$key обработан"; //для отладки
$result = $mysqli->query("UPDATE `cronjob` SET `status`='1',`date`='$datetime' WHERE `id`='$row->id'");
$result = $mysqli->query("INSERT INTO `log` VALUES ('File import$key успешно обработан','1','$datetime');");
}else{
$result = $mysqli->query("INSERT INTO `log` VALUES ('File import$key обработан c ошибкой','0','$datetime');");
exit;
}
}else{
$parseUrl = "https://domen.com/import/import.php?number=$key&key=$skey"; //запуск скрипта парсинга товаров
$status = go_parse($parseUrl);
echo $status = trim($status);
if($status == 'good'){
echo "File import$key обработан";
$result = $mysqli->query("UPDATE `cronjob` SET `status`='1',`date`='$datetime' WHERE `id`='$row->id'");
$result = $mysqli->query("INSERT INTO `log` VALUES ('File import$key успешно обработан','1','$datetime');");
}else{
$result = $mysqli->query("INSERT INTO `log` VALUES ('File import$key обработан c ошибкой','0','$datetime');");
}
}
}
$result = $mysqli->query("SELECT *
FROM `cronjob`
WHERE
`date` <= '$datecron'
AND `status` = '0'
ORDER BY `jobfile`
LIMIT 1");
$row = $result->fetch_object();
parsing_file(trim($row->jobfile));
echo 'parsing '.$row->jobfile.'<br>';
exit;
?>
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
возможен ли такой запрос: есть таблица в которой есть 2 колонки name и text Мне нужно вытащить в одном запросе и в одной строке 3 данных То есть...
Мне нужно чтоб выодилась дата в формате "0000-00-00 00:00:00 UTC"; И все отлично, но выводится вместо "GMT" вместо "UTC", вод код:
Хотел поинтересоваться, писал свои матрицы, когда написал функцию возвращения детерминанта ради шутки решил вписать размеры 100x100, 150x150 и увидел...