Индикатор на управляемой форме




Принцип обмена данными из 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='\

28 Comments

  1. RocKeR_13

    При большом количестве обращений на сервер лучше уж запускать в фоне с отображением прогресс-бара (или так)

    Reply
  2. aximo

    (1) вторая ссылка у меня указана в публикации. Совершенно верно!

    Reply
  3. RocKeR_13

    (2) увидел)

    Reply
  4. PLAstic

    Чисто побрюзжать.

    Я бы рекомендовал бить себя по рукам каждый раз за конкатенацию строк вместо СтрШаблон() и за имена переменных вроде Стр11.

    Reply
  5. antonkms88

    (4) поясните пожалуйста для простых смертных, чем вам конкатенация не угодила?

    Reply
  6. ArchLord42

    (4) кстати говоря, СтрШаблон очевидно медленее, чем простая конкатинация, при этом разница примерно 20%, так что смотря в каких условиях, а так да, читабельность как минимум лучше.

    Reply
  7. DmitrySinichnikov

    То есть в цикле долбиться на сервер, даааа… решение. Вы бы хотя бы порционность сделали для приличия. Не ну понятно что и так работает, но вот потом подобные выкрутасы встречаешь и переписываешь… С матом…

    Reply
  8. ids79

    Пожалуйста. Рад, что моя публикация сподвигла Вас на написание своей.

    Reply
  9. Serj1C

    (4) Для коротких строк в контатенации нет ничего критичного. А переменные Стр11, ТекВремя — это да, плохо)

    Reply
  10. PLAstic

    (6) Бегло поискал, не нашёл. Была разгромная статья про быстродействие различных способов соединения строк и там раза в полтора оказался быстрее обычной конкатенации СтрШаблон(). Собственно, это не единственный способ, который быстрее обычной конкатенации, их ещё два как минимум. 🙂

    Reply
  11. YanTsys

    (4) Был момент когда приходилось удалять эти новомодные функции из загружаемых обработок для тех пользователей у которых стояла более старая платформа, в то время гнилые помидоры летели в тех программистов которые использовали эти функции 🙂

    Reply
  12. PLAstic

    (5)

    1) Быстродействие.

    2) Представь ШаблонСообщения = НСтр(«ru = ‘Объём работ «»%1″» на поле %2 (%3 га) превышает площадь поля (%4 га) в цикле обработки %5′») в виде конкатенации и не сломай мозг.

    Reply
  13. YanTsys

    Если перед вашей процедурой

    НачатьПроведениеСервер(Стр11.Реализация);    // обращение на сервер

    стоит директива &НаСервере

    то эта статья просто эпик фейл

    Reply
  14. ambrozii

    (13) да, блин, тут 99.(9)% публикаций такие.

    Reply
  15. ArchLord42

    (10)

    вот вам не статья, а реальный замер 🙂

    Reply
  16. PLAstic

    (15) Шта??? У тебя сферический процессор в вакууме занимается выполнением одной задачи? Включай замер производительности и вторую картинку в ответ.

    Reply
  17. PLAstic

    (15) Вот замеры на реальной ситуации. Сообщение с 5 параметрами вполне реальное. Разрыв по времени ничтожен и с ростом кол-ва параметров уменьшается.

    У меня не HLBD, конечно, но потуги отстаивать рудименты пятилетней давности (СтрШаблон появился 5 лет назад) выглядят как минимум нелепо.

    Вдобавок, просто знайте, что это нарушение стандартов и методик разработки 1С. Специально зашёл и ещё раз проверил наличие там этого стандарта.

    Reply
  18. ArchLord42

    (16)

    шта???

    тебя

    А вы точно, ИС с ми стой не перепутали? Не помню чтобы я с вами гдето братовался 🙁

    У тебя сферический процессор в вакууме занимается выполнением одной задачи

    Смелое заявление, только вот если бы он занимался чем то другим, то ему ничего не мешало бы повлиять и на замер производительности или замер как то отдельно от процессора расчитывается ?)

    Reply
  19. ArchLord42

    (17)

    но потуги отстаивать рудименты пятилетней давности (СтрШаблон появился 5 лет назад) выглядят как минимум нелепо.

    эээмм…я все понимаю, но надо же читать иногда комменты до конца, а не начинать брызгать слюной после первых 3 слов 🙂

    так что смотря в каких условиях

    Что можно перести так, «слепо юзать СтрШаблон так же не стоит», я не призываю его не юзать ибо это реально удобней, но в определенных условиях он начинает проигрывать самому простому способу.

    Reply
  20. Lapitskiy

    (5) быстродействие — лично проверял, простое сложение строк — это очень медленно

    Reply
  21. VmvLer

    (0) да чепуха это все и будет через пень-колоду работать когда у вас есть коллекция: список отобранных строк, тз, тч и т.д.

    В реале в «тормознутых» процессах редко можно вычислить коллекции именно поэтому адетпы типовых отправляют такие процессы в фон и на вид вылезает котик. Я к котику еще прикрутил счетчик «прошло времени…1 час 2 минуты 5 сек…»

    Считаю, что разработчики типовых реализовали механизм логически верно, а все попытки «насиловать» сервер передачами

    управления с клиента ради бегунка — понты для приезжих.

    Reply
  22. VmvLer

    (20) Согласен и это не раз уже было доказано в том числе и тут

    поэтому придумали системный костыль СтрСоединить()

    Reply
  23. Yashazz

    (21) Соглашусь. Не публикация, а позорище. Причём не содержанием своим даже, а тем, что «это» оказалось в центре внимания и уже столько плюсов нагребло. Совсем уже докатились. Примитивный клиентский код с адским примером вызова сервера в цикле, за который убивать надо, а подаётся как откровение свыше.

    Reply
  24. SlavaKron

    (17) У вас некорректный замер в отличие от (15). Для выяснения реальной производительности, отладка должна быть выключена. По факту у вас основное время потратилось на переходы в цикле и фиксация их отладкой, поэтому числа у вас «грязные» — доля самой конкатенации в них мала.

    Reply
  25. PLAstic

    (18) Именно. Замер по миллисекундам идёт в отрыве от процесса. Процессор занимается обслуживанием всех процессов, поэтому давай нагрузим его каким-нибудь копированием по сети и проведём замер, а потом при вычищенных процессах. Ты не знаешь, сколько времени процессор реально уделил твоим расчётам.

    Reply
  26. PLAstic

    (24) Переходы в цикле и фиксация их отладкой были зафиксированы в отдельных строках таблицы, я их замазал. Имхо, отладка равномерно влияет на все команды, поэтому процентное отношение считаю верным.

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

    Reply
  27. SlavaKron

    (26)

    процентное отношение считаю верным

    2 / 3 <> 42 / 43

    Reply
  28. PLAstic

    (27) Перечитай (25).

    Reply

Leave a Comment

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