Как объединить несколько заданий Cron в один файл

Тема в разделе "Как сделать...", создана пользователем Евгений96, 22 окт 2015.

Метки:
  1. Евгений96

    Евгений96 Постоялец

    Регистр.:
    29 июн 2014
    Сообщения:
    66
    Симпатии:
    5
    Здравствуйте, подскажите пожалуйста

    Как объединить несколько заданий Cron.php (Обновление ЦенТоваров) в один файл (Cron1.php, Cron2.php, Cron3.php и т.д. будет добавляться со временем)

    Дано:
    Файл CeniTovary.csv (Внем содержаться цены на товар). АртикулТовара^Цена. Пример:
    Код:
    36^1450,00
    37^2450,00
    38^3450,00
    39^4450,00
    40^5450,00
    ----------
    20356^130,00
    Файл Script1.php // Разбивает большой CeniTovary.csv(Прайс товаров) на МаленькиеФайлы.csv запускается по средствам задания Cron. Создает file1.csv; file2.csv; file3.csv
    Код:
    <?php
    $start_time = microtime(true);
    
    $csv_array = file('/home/www/site.ru/CeniTovary.csv'); // считываем файл необходим для разделения
    
    $strings_in_file = 2000; //указываем количество строк для разделения
    $string_counter = 0; //позиция строк
    $file_counter = 1; //счетчик контейнеров для файлов разбива
    
    for($i=0; $i<count($csv_array); $i++)
    {
        //если счетчик разбива равен $strings_in_file закрываем старый файл и добавляем 1 к $file_counter
        if($string_counter == $strings_in_file)
            {
            $string_counter = 0; //обнуляем позицию строк после записи
            fclose($fp);
            unset($fp); // Удаляет переменную
              echo "Файл file$file_counter.csv успешно создан<br>";
            $file_counter++;
        }
        //если файл для записи не открыт открываем его
        if(!$fp) $fp = fopen('/home/www/site.ru/file'.$file_counter.'.csv', 'w'); // 'w' Открывает файл только для записи; помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует - пробует его создать.
    
        //записываем строку и прибавляем к счетчику 1
        fputs($fp, $csv_array[$i]); // Бинарно-безопасная запись в файл
        $string_counter++; // Добавляем +1 к контейнеру
    }
    if($fp){
        fclose($fp);
        echo "Файл file$file_counter.csv успешно создан<br>";
    }
    $exec_time = microtime(true) - $start_time;// выполнение действий
    echo "<p>".'Время исполнения '.$exec_time."</p>";
    ?>
    Файлы Cron1.php; Cron2.php; Cron3.php (Будут добавляться)// Подгружают Прайсы товаров в БД запускаются по средствам задания в Cron
    Код:
    <?php
    // Cron1.php // Cron2.php и Cron3.php аналогичны, подключают только file2.csv и file3.csv соответственно
    $start_time = microtime(true);
    
    if ($handle = fopen("/home/www/site.ru/file1.csv", "r")){  // Путь
    
      $dblocation = "server.adress.ru";  //замените localhost на свой адрес сервера БД
      $dbname = "admin";  // измените bdname на ваше Название БД
      $dbuser = "admin";  // bduser замените на ваш Логин пользователя БД
      $dbpasswd = "12345";  // Пароль пользователя БД
      $pref = "555_"; //Префикс для названия таблиц в БД
     
      $dbcnx = mysql_connect($dblocation, $dbuser, $dbpasswd);
      if (!$dbcnx)
      {
        echo "<p>К сожалению, не доступен сервер mySQL</p>";
        exit();
      }
      if (!mysql_select_db($dbname,$dbcnx) )
      {
        echo "<p>К сожалению, не доступна база данных</p>";
        exit();
      }
        mysql_query ("set character_set_client='utf8'");
        mysql_query ("set character_set_results='utf8'");
        mysql_query ("set collation_connection='utf8'");
    
    // Обновление прайсов в БД
    while (($data = fgetcsv($handle, 0, "^")) !== FALSE) {
        $select = mysql_query("SELECT  `virtuemart_product_id` FROM  `".$pref."virtuemart_products` WHERE  `product_sku` = '$data[0]' ");
        $product_id = mysql_result($select,0);
        // Обновление цен товаров в БД
        $update1 = mysql_query("UPDATE `".$pref."virtuemart_product_prices` SET `product_price` = '$data[1]' WHERE  `virtuemart_product_id` ='$product_id'");
    }
    
        echo "О, чудо Файл file1.csv экспортирован в БД успешно. Всё прошло успешно!"";
        $exec_time = microtime(true) - $start_time;// выполнение действий
        echo "<p>".'Время исполнения '.$exec_time."</p>";
        fclose($handle);
    }else{
        echo 'Файл не открыт';
    }
    ?>
    Резюме: Все это сделано с той целью что бы не перегружать выполнение скрипта на сервере хостинга (не более 30 сек), т.к. исходный ФайлПрайсТовары.csv достаточно большой, если весь разом грузить через Cron1.php -> ФайлПрайсТовары.csv, то сервер выдает ошибку "Превышен интервал времени исполнения и т.д. (Ошибка 502 вроде)"

    Сейчас заданий Cron уже 4 шт. (В процессе они только будут добавляться)

    Время (23.00 каждый день) Задание
    00 23 * * * /home/www/site.ru/Script1.php
    01 23 * * * /home/www/site.ru/Cron1.php
    02 23 * * * /home/www/site.ru/Cron2.php
    03 23 * * * /home/www/site.ru/Cron3.php


    Вопрос: Подскажите пожалуйста можно ли как то это все прописать Одним файлом и как следствие использовать одно задание Cron при (Файлы для примера прилагаю)
     

    Вложения:

  2. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    520
    Симпатии:
    239
    Не понимаю зачем объединять, если разделялось для - не превышения 30 сек работы. Как вариант попробовать в одном файле прописать file_get_contents('http://site.ru/Script1.php'); file_get_contents('http://site.ru/Script2.php'); и т.п. и его одного ставить на крон.
     
    Евгений96 нравится это.
  3. Евгений96

    Евгений96 Постоялец

    Регистр.:
    29 июн 2014
    Сообщения:
    66
    Симпатии:
    5
    Ок, попробую, только ведите не большая проблемка возникнет - Ошибки не смогу отслеживать на каком этапе они конкретно возникли, если будут (Ну думаю можно что придумать)
     
  4. KOSMOS aka Anarion

    KOSMOS aka Anarion Создатель

    Регистр.:
    15 июл 2007
    Сообщения:
    26
    Симпатии:
    3
    действительно, лучше всего отдельно их и запускайте по крону с интервалом в минуту
     
  5. kto-to

    kto-to Создатель

    Регистр.:
    19 май 2012
    Сообщения:
    14
    Симпатии:
    2
    Если это VPS, можно создать один BASH скрипт - его повесить в крон.
    И уже этот bash скрипт, будет вызывать нужные PHP файлы.
     
  6. Евгений96

    Евгений96 Постоялец

    Регистр.:
    29 июн 2014
    Сообщения:
    66
    Симпатии:
    5
    Нет просто хостинг ihc.ru (при чем можно по Cron отправлять только одну переменную)
     
  7. Евгений96

    Евгений96 Постоялец

    Регистр.:
    29 июн 2014
    Сообщения:
    66
    Симпатии:
    5
    Скажите пожалуйста, а вы могли бы подсказать примерно как должно это выглядеть (js пока что не селен)