Запуск php парсера по расписанию через CURL

209
06 января 2019, 08:10

Здравствуйте, уважаемые товарищи программисты, прошу помочь оптимизировать скрипт, так как столкнулся с ошибкой 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;

?>
READ ALSO
Mysql запрос на вывод 3 строк в одну

Mysql запрос на вывод 3 строк в одну

возможен ли такой запрос: есть таблица в которой есть 2 колонки name и text Мне нужно вытащить в одном запросе и в одной строке 3 данных То есть...

170
вывести дату в UTC (Yii2, Gridwiew format DateTime)

вывести дату в UTC (Yii2, Gridwiew format DateTime)

Мне нужно чтоб выодилась дата в формате "0000-00-00 00:00:00 UTC"; И все отлично, но выводится вместо "GMT" вместо "UTC", вод код:

175
Как вытащить url из объекта PHP

Как вытащить url из объекта PHP

$per->term_thumbnail; - вот так получил это:

161
&ldquo;Безразмерный&rdquo; double C++

“Безразмерный” double C++

Хотел поинтересоваться, писал свои матрицы, когда написал функцию возвращения детерминанта ради шутки решил вписать размеры 100x100, 150x150 и увидел...

183