psBackup 3.0. Резервное копирование.




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

34 Comments

  1. CheBurator

    Сделано аккуратненько, несомненный +1

    Гарантируется целостность и непротиворечивость базы, заархивированной при работающей 1С?

    Reply
  2. Ломастер

    Грамотный вопрос. Во время активного ввода информации пользователями ничего гарантировать нельзя. Но лучше получить копию с «битым» документом, чем вообще ничего. Еще полезно делать «ночные» копии.

    Reply
  3. VV

    Неплохая штука. Маленький размер, фейс продуман, даже удаление мусора.

    Нет: второго пути для копирования (про запас)

    А если винрара нет в системе?

    Reply
  4. VV

    Да, и пароль на закрытие и изменение настроек — от продвинутых юзеров нужен.

    Reply
  5. VV

    А еще лучше — значок «не показывать в трейе».

    Reply
  6. Ломастер

    Ох, не хочется возиться с шифрованием… А закрыть настройки можно средствами ОС, если «продвинутый пользователь» <> админ, в хелпе прописано.

    Значок из трея убирать плохо: что если нужно срочно архивировать/восстановить, а админ в отпуске/бухает/болеет

    Об архивировании без WinRAR — подумаю на досуге.

    Reply
  7. Abadonna

    (6)отпуске/бухает/болеет

    бухает и болеет — это и то же :)))))))))

    Reply
  8. VV

    «что если нужно срочно архивировать/восстановить»

    при стабильном ночном бэкапе — не за чем. А распаковать все умеют.

    Reply
  9. andrewalexk

    🙂

    сыровато..

    навскидку в ХР настроил архивирование по времени — тупо выдал ошибку «..list of bounds…»

    Reply
  10. hogik

    (2)

    “Во время активного ввода информации пользователями ничего гарантировать нельзя”

    В Вашей разработке или вообще?

    Если “вообще”, то можно. Могу предоставить текст программы на Clipper-е для осмысления или кратко рассказать суть решения. Если, конечно, Вам это интересно.

    Reply
  11. Kapitan911

    Было бы неплохо добавить в настройку расписания режим архивации при включении компа

    Reply
  12. CheBurator

    (10) > Если “вообще”, то можно

    и как?

    в конторе админ длябэкапов юзает Cobian — вроде так ничего… но как только включаешь опцию «теневого» бэкапа — т.е. при открытых файлах — начинает косячить…

    Reply
  13. hogik

    (12)

    “Если “вообще”, то можно и как?”

    Общий алгоритм, без деталей:

    1) Висит задача, которая по заданному графику начинает свою работу.

    2) В момент “Ч” читаются имена DBF файлов из заданного каталога.

    3) Для каждого файла выполняется попытка полной блокировки. В случае успешной попытки, делается попытка блокировки следующего файла. В случае не успешной попытки снимаются блокировки с, ранее заблокированных, файлов. И всё начинается заново с первого файла.

    4) Когда все файлы успешно заблокированы, производится копирование каждого файла в рабочий каталог. Копирование выполняется огромными блоками очень быстро. Копирование начинается с самого короткого файла. После копирования каждого файла блокировка с этого файла снимается.

    5) Запускается архиватор для файлов из рабочего каталога.

    Естественно, надо организовать поколение архивов. Имеет смысл дать возможность настраивать порядок блокировки и копирования файлов применительно к особенностям программы, чью базу копируем. В случае 1Са возможны проблемы с бездарным алгоритмом блокировки записей и порядок копирования файлов весьма существенен, но определяемый. И т.д.

    У меня такой алгоритм работал пять лет, выполняя копирования каждые 1-3 часа для самопальной торговой системы на DBFах. Количество пользователей было 10-20 человек. Правда, восстановление потребовалось сделать всего один раз за эти пять лет из-за поломки диска. И иногда использовали эти копии базы для поиска “вчерашнего дня” из-за нерадивости пользователей.

    Reply
  14. CheBurator

    > Для каждого файла выполняется попытка полной блокировки.

    вы хотите сказать 1Ска DBF-ной версии не держит блокировки на файлах — это понятно, если это не монопольный режим…?

    но вероятность того, что ни один файл базы 1Ски не заблокирован в данный момент работы бэкапера — имхо весьма сомнителен…

    Reply
  15. CheBurator

    или я не прав?

    Reply
  16. Ломастер

    (9) Ошибку отловил, работе она не мешает, но все равно неприятно. Будет исправлено.

    (11) Весьма специфичное пожелание. Думаю, архивация при запуске мало кому пригодится.

    (14) Вероятность того, что ни один файл не заблокирован, ИМХО, весьма велика. Но я тоже не понял. Как возможна полная блокировка, если файлы открыты 1С-кой?

    Или что подразумевается под полной блокировкой?

    Еще вопросик. Проверялось что будет, если 1С попытается писать в заблокированный файл?

    Reply
  17. Ломастер

    Выложил новый релиз. Исправлены ошибки.

    Reply
  18. hogik

    (14)

    “вы хотите сказать 1Ска DBF-ной версии не держит блокировки на файлах — это понятно, если это не монопольный режим…?”

    Да.

    “но вероятность того, что ни один файл базы 1Ски не заблокирован в данный момент работы бэкапера — имхо весьма сомнителен…”

    Это та вероятность, которую сложно вычислить. Но, по пониманию их алгоритмов работы, думаю, она далеко не нулевая. Я б проверил на своей промышленной системе, но у меня совсем (!) не типовая конфигурация и результат будет не объективный для общего случая. Поэтому я и написал в (13) где и как это использовалось. А писать такую обработку для 1С мне не хочется. Мы ни разу за восемь лет не копировали базу данных. У нас нет в этом нужды. Но данный алгоритм решает поднятый в (1) вопрос.

    (16)

    “Но я тоже не понял. Как возможна полная блокировка, если файлы открыты 1С-кой?”

    Способ см. в описании FoxPro функцию FLOCK([nWorkArea | cTableAlias]).

    А механизмы описаны в http://infostart.ru/profile/2905/projects/1725/

    “Проверялось что будет, если 1С попытается писать в заблокированный файл?”

    В общем случае “Ожидание транзакции”. А в частных см. в (13) предпоследний пункт. Если появится желание писать такую программу, обращайтесь ко мне с вопросами – разберёмся быстро.

    Reply
  19. Ломастер

    Еще подправил.

    В исключения добавлен файл .LCK

    Reply
  20. Ломастер

    (18) Спасибо. Буду подумать.

    Reply
  21. CheBurator

    (18) спсб за разъяснения

    Reply
  22. cyrill

    Отличная вещь, но ждем когда автор вылечит от зависимости к WinRAR. В эпоху легалайза, зависимость еще от одного не бесплатного софта омрачает

    Reply
  23. VV

    (16) <<Думаю, архивация при запуске мало кому пригодится.>>

    Я бы так не сказал. Есть небольшие конторы, где нет серевера, база на одной из рабочих станций. Утром включили — бэкап.

    Ну, плюс к тому — сервер внезапно перегрузился или ночью плановая перезагрузка — после нее бэкап.

    Reply
  24. mihenius

    почему бы winrar не поменять на 7zip?

    Reply
  25. hogik

    (23)

    “…сервер внезапно перегрузился…”

    Это уже не сервер. 😉

    Reply
  26. Ломастер

    (25) Скорее не UPS 😉

    Reply
  27. ГенаБукин

    почему бы winrar не поменять на 7zip? Мне кажестя менять не надо, нужно сделать выбор чем архивировать… Я лично не в восторге от 7zip!

    Reply
  28. mm_84

    Не знаю связано ли это с программой но после второго архивирования у меня пропали все dbf и файл конфигугации . в фильтре на удаления эти файлы не стояли

    Reply
  29. mm_84

    Неудобное, архивирпование в плане того, что постоянно архивируется отчетность(все годы 700 MB) ведь там нет фильтра, есть только маска для файлов которые удаляются физически перед архивацией.

    Reply
  30. mm_84

    Программа очень непродуманная, не ставьте её она базы удаляет!!!

    Reply
  31. Ломастер

    Ну и ну…

    (29) Если архивируется отчетность, значит она нужна. А если не нужна, то что она делает в базе?

    (30) Прога удаляет то, что ей скажут. Может у Вас звездочка одинокая в качестве маски файла?

    Reply
  32. mm_84

    отчетность находилась всегда в каталоге с базой в папке Extforms и убирать её никуда нельзя из базы и весит она прилично, а по поводу удалений баз(файлов dbf md и прочее),они начали пропадать как только я установил эту программу, я даже снял галочку чтобы он ничего не удалял о очистил этот список.Лучше бы сделали фильтр, это намного удобней, чем удалять файлы из базы.

    Reply
  33. Ломастер

    (32)Перед использованием WinRAR проверьте Параметры архивации в Профиле архивации по умолчанию. В частности, снят ли флажок «Удалить файлы после упаковки».

    Reply
  34. Shaka13

    (33)

    >>> а также выполнять архивирование при запущенной 1С.

    не работает при запущенной 1С, не делает архив базы 🙁

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *