<?php // Полная загрузка сервисных книжек, создан 2025-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='\
При большом количестве обращений на сервер лучше уж запускатьв фоне с отображением прогресс-бара (или так )
(1) вторая ссылка у меня указана в публикации. Совершенно верно!
(2) увидел)
Чисто побрюзжать.
Я бы рекомендовал бить себя по рукам каждый раз за конкатенацию строк вместо СтрШаблон() и за имена переменных вроде Стр11.
(4) поясните пожалуйста для простых смертных, чем вам конкатенация не угодила?
(4) кстати говоря, СтрШаблон очевидно медленее, чем простая конкатинация, при этом разница примерно 20%, так что смотря в каких условиях, а так да, читабельность как минимум лучше.
То есть в цикле долбиться на сервер, даааа… решение. Вы бы хотя бы порционность сделали для приличия. Не ну понятно что и так работает, но вот потом подобные выкрутасы встречаешь и переписываешь… С матом…
Пожалуйста. Рад, что моя публикация сподвигла Вас на написание своей.
(4) Для коротких строк в контатенации нет ничего критичного. А переменные Стр11, ТекВремя — это да, плохо)
(6) Бегло поискал, не нашёл. Была разгромная статья про быстродействие различных способов соединения строк и там раза в полтора оказался быстрее обычной конкатенации СтрШаблон(). Собственно, это не единственный способ, который быстрее обычной конкатенации, ихещё два как минимум . 🙂
(4) Был момент когда приходилось удалять эти новомодные функции из загружаемых обработок для тех пользователей у которых стояла более старая платформа, в то время гнилые помидоры летели в тех программистов которые использовали эти функции 🙂
(5)
1) Быстродействие.
2) Представь ШаблонСообщения = НСтр(«ru = ‘Объём работ «»%1″» на поле %2 (%3 га) превышает площадь поля (%4 га) в цикле обработки %5′») в виде конкатенации и не сломай мозг.
Если перед вашей процедурой
стоит директива &НаСервере
то эта статья просто эпик фейл
(13) да, блин, тут 99.(9)% публикаций такие.
(10)
вот вам не статья, а реальный замер 🙂
(15) Шта??? У тебя сферический процессор в вакууме занимается выполнением одной задачи? Включай замер производительности и вторую картинку в ответ.
(15) Вот замеры на реальной ситуации. Сообщение с 5 параметрами вполне реальное. Разрыв по времени ничтожен и с ростом кол-ва параметров уменьшается.
У меня не HLBD, конечно, но потуги отстаивать рудименты пятилетней давности (СтрШаблон появился 5 лет назад) выглядят как минимум нелепо.
Вдобавок, просто знайте, что это нарушение стандартов и методик разработки 1С. Специально зашёл и ещё раз проверил наличие там этого стандарта.
(16)
А вы точно, ИС с ми стой не перепутали? Не помню чтобы я с вами гдето братовался 🙁
Смелое заявление, только вот если бы он занимался чем то другим, то ему ничего не мешало бы повлиять и на замер производительности или замер как то отдельно от процессора расчитывается ?)
(17)
эээмм…я все понимаю, но надо же читать иногда комменты до конца, а не начинать брызгать слюной после первых 3 слов 🙂
Что можно перести так, «слепо юзать СтрШаблон так же не стоит», я не призываю его не юзать ибо это реально удобней, но в определенных условиях он начинает проигрывать самому простому способу.
(5) быстродействие — лично проверял, простое сложение строк — это очень медленно
(0) да чепуха это все и будет через пень-колоду работать когда у вас есть коллекция: список отобранных строк, тз, тч и т.д.
В реале в «тормознутых» процессах редко можно вычислить коллекции именно поэтому адетпы типовых отправляют такие процессы в фон и на вид вылезает котик. Я к котику еще прикрутил счетчик «прошло времени…1 час 2 минуты 5 сек…»
Считаю, что разработчики типовых реализовали механизм логически верно, а все попытки «насиловать» сервер передачами
управления с клиента ради бегунка — понты для приезжих.
(20) Согласен и это не раз уже было доказано в том числе и тут
поэтому придумали системный костыль СтрСоединить()
(21) Соглашусь. Не публикация, а позорище. Причём не содержанием своим даже, а тем, что «это» оказалось в центре внимания и уже столько плюсов нагребло. Совсем уже докатились. Примитивный клиентский код с адским примером вызова сервера в цикле, за который убивать надо, а подаётся как откровение свыше.
(17) У вас некорректный замер в отличие от (15). Для выяснения реальной производительности, отладка должна быть выключена. По факту у вас основное время потратилось на переходы в цикле и фиксация их отладкой, поэтому числа у вас «грязные» — доля самой конкатенации в них мала.
(18) Именно. Замер по миллисекундам идёт в отрыве от процесса. Процессор занимается обслуживанием всех процессов, поэтому давай нагрузим его каким-нибудь копированием по сети и проведём замер, а потом при вычищенных процессах. Ты не знаешь, сколько времени процессор реально уделил твоим расчётам.
(24) Переходы в цикле и фиксация их отладкой были зафиксированы в отдельных строках таблицы, я их замазал. Имхо, отладка равномерно влияет на все команды, поэтому процентное отношение считаю верным.
И, Вячеслав, удиви меня, плз, технологией замера производительности без отладки?
(26)
2 / 3 <> 42 / 43
(27) Перечитай (25).