Ответов: 1 Просмотров: 924
|
Здравствуйте, подскажите пожалуйста
Как объединить несколько заданий Cron.php (Обновление ЦенТоваров) в один файл (Cron1.php, Cron2.php, Cron3.php и т.д. будет добавляться со временем)
Дано:
Файл CeniTovary.csv (Внем содержаться цены на товар). АртикулТовара^Цена. Пример:
Файл Script1.php // Разбивает большой CeniTovary.csv(Прайс товаров) на МаленькиеФайлы.csv запускается по средствам задания Cron. Создает file1.csv; file2.csv; file3.csv
Спойлер (Отобразить)
PHP:
скопировать код в буфер обмена
<?PHP $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; //обнуляем позицию строк после записи 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){ 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:
скопировать код в буфер обмена
<?PHP // Cron1.php // Cron2.php и Cron3.php аналогичны, подключают только file2.csv и file3.csv соответственно 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_"; //Префикс для названия таблиц в БД if (!$dbcnx) { echo "<p>К сожалению, не доступен сервер mySQL</p>"; } { echo "<p>К сожалению, не доступна база данных</p>"; } // Обновление прайсов в БД while (($data = fgetcsv($handle, 0, "^")) !== FALSE) { $select = mysql_query("SELECT `virtuemart_product_id` FROM `".$pref."virtuemart_products` WHERE `product_sku` = '$data[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 при этом не вызывая перезагрузки сервера на выполнения всех операций этих скриптов (Script1.php и Cron1.php; Cron2.php и др.) |