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

Евгений96

Постоялец
Регистрация
29 Июн 2014
Сообщения
95
Реакции
14
Здравствуйте, подскажите пожалуйста

Как объединить несколько заданий 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 при (Файлы для примера прилагаю)
 

Вложения

  • ДляВопроса.zip
    3,1 KB · Просмотры: 0
Не понимаю зачем объединять, если разделялось для - не превышения 30 сек работы. Как вариант попробовать в одном файле прописать file_get_contents('Для просмотра ссылки Войди или Зарегистрируйся file_get_contents('Для просмотра ссылки Войди или Зарегистрируйся и т.п. и его одного ставить на крон.
 
Не понимаю зачем объединять, если разделялось для - не превышения 30 сек работы. Как вариант попробовать в одном файле прописать file_get_contents('Для просмотра ссылки Войди или Зарегистрируйся file_get_contents('Для просмотра ссылки Войди или Зарегистрируйся и т.п. и его одного ставить на крон.
Ок, попробую, только ведите не большая проблемка возникнет - Ошибки не смогу отслеживать на каком этапе они конкретно возникли, если будут (Ну думаю можно что придумать)
 
действительно, лучше всего отдельно их и запускайте по крону с интервалом в минуту
 
Если это VPS, можно создать один BASH скрипт - его повесить в крон.
И уже этот bash скрипт, будет вызывать нужные PHP файлы.
 
Если это VPS, можно создать один BASH скрипт - его повесить в крон.
И уже этот bash скрипт, будет вызывать нужные PHP файлы.
Нет просто хостинг ihc.ru (при чем можно по Cron отправлять только одну переменную)
 
Ну тогда "красивого" решения не будет.
Есть вариант, создать на JS обёртку, которая будет по очереди вызывать нужные скрипты - тогда можно обойти проблему с лимитом времени выполнения одного скрипта. Примерно так работают всякие импорты\экспорты у различных CMS.
Скажите пожалуйста, а вы могли бы подсказать примерно как должно это выглядеть (js пока что не селен)
 
Назад
Сверху