Программа для автоматического закрытия окна "Server busy"




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

    p.s. Данная утилита использовалась как дополнение при переносе данных средствами OLE на работающих базах.

    Reply
  2. Очень хорошая вещь!!!!!!!!!

    Reply
  3. VV

    Скачал, хоть и без необходимости — пригодится.

    Такие вещи надо бы делать невидимыми для пользователя или сразу в трей сворачивать после запуска. И там тихо пусть себе молотит, а ее мы в автозагрузку засунем. А то забодают звонками — «а на что нажать?»

    Reply
  4. imsoftware

    Можно и сворачивать, только не каждый пользователь сразу заметит, что у него в трее что-то висит..

    Reply
  5. VV

    А на фига ему это надо? Замечать? Ему, юзеру, работать надо. Так что стартовать при запуске и в трей. И пусть себе нажимает на кнопки. Кстати — на обе локализации винды настроено? Или тока на англицкую?

    Reply
  6. metaeditor

    кстати можно запихать это в ВК

    надо перехватывать ф-ии OleUIBusyA/OleUIBusyW из oledlg.dll

    хотел както сделать…

    по оле ничего не переношу, поэтому возможности пока не представилось…

    Reply
  7. support

    а если перехватить, то можно сделать быстрее?

    Reply
  8. imsoftware

    А смысл? Если блокировка в одной из баз идет уже на протяжении 5-10 минут, то как-раз самое оптимально «нажимать» на Retry окна «Server busy» через 5 секунд.

    Reply
  9. metaeditor

    (support):

    Reply
  10. metaeditor

    кхм… нечаянно нажал на «отправить»…

    (support): ненадо будет каждые 5 секунд проверять Окна. в этом случае окно «бизи» вобще небудет появляться, хункции сразу будет говорится что какбудто нажали на «retry», да и макс. количество итераций можно задавать программно

    Reply
  11. Программа не работает на русскоязычной виндовс :((

    тама не «Server busy» а «Сервер занят»

    Reply
  12. imsoftware

    А кнопочка «&Retry» тама называется «&Повторить»? Русскоязычной винды под рукой нету 🙁

    Reply
  13. Уважаемый imsoftware!!!

    да, кнопочка называется «Повторить»

    и есть еще «Переключиться». (но она нафих ненужна, т.к. открывает панель по кнопке пуск)

    сможете ли вы чуть чуть доделать свою программу?

    заранее спасибо!!!

    Reply
  14. imsoftware

    Обновил… Теперь можно самому задавать имена заголовков окна и кнопки для нажатия… Да, и имя класса окна тоже необходимо указывать вручную…

    Для англоязычной винды:

    Класс окна: #32770

    Заголовок окна: Server Busy

    Заголовок кнопки: &Retry

    Для русскоговорящей:

    Класс окна: #32770 (не меняется)

    Заголовок окна: Сервер Занят

    Заголовок кнопки: По&вторить (обязательно учитываются «горячие» буквы в названии)

    p.s. Не проверял, но должно работать 😉

    Reply
  15. Ура-а-а-а!!!!

    заряботала!!!!

    Спасибо большое за программу !!!

    Reply
  16. imsoftware

    Совет support’у — включить эту программку в комплект поставки с Rocket Launcher’ом 😉 Тогда перенос, например, итогов по бух. счетам не прервется из-за занятости сервера..

    Reply
  17. coch

    +1

    Нужная вещь

    У меня сравнение центральной базы с переферийными сделано через оле, так при поиске документов начавших расхождение в самых ранних базах (где данные за три-четыре года), частенько такое вылезает.

    Reply
  18. boris_ni

    а есть ключики автозапуска clicker.exe ?

    хотелось бы запускать как сервис или хотя бы в шедулере

    класная прога

    Reply
  19. timgan

    Уважаемый imsoftware!!!

    Если можно еще немного для счастья:

    1. Ключи запуска? Чтоб можно было батником запускать! А может и останавливать?!

    2. Возможнось изменять параметр — 5 секунд.

    3. Возможность убрать из трея

    С уважением, Тимган

    Reply
  20. imsoftware

    Прога запускается без ключиков. Писалась под себя и очень давно, поэтому никаких тонкостей. Если найду исходники — доработаю с учетом пожеланий (с нуля опять писать не хоцца 🙂

    Reply
  21. maksimchuk

    Спасибо, за програмку. Надеюсь завтра поможет.

    Reply
  22. Black-Rain_Infostart

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

    Reply
  23. kilisidiV

    Программа проверенна, очень помогает в работе, особенно когда связываешь базы по OLE.

    Reply
  24. maralex

    Очень полезная вещь! Спасибо большое!

    Reply
  25. Klesk666

    Супер, спасибо

    Reply
  26. alyuev

    Да, не хватает автозапуска. Т.е. чтобы не нужно было нажимать на кнопку «Старт». А так — очень спасает Автоматы от подвисания из-за OLE.

    Reply
  27. ingrit

    Очень нужна такая прога, но с возможностью запускать с параметрами ( или настроенной на рус виндоус). Можете ли вы доработать, за вознаграждение, ест-но) ?

    Reply
  28. Snork

    Очень есть необходимость запускать эту программу с параметрами. Есть возможность доработать или скинуть исходники?

    Reply

Leave a Comment

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