Service Starter




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

    заюзаем в ближайшее время..

    Reply
  2. vasilykushnir

    Очень даже прикольненькая вещица.

    +1 однозначно.

    Reply
  3. imsoftware

    +1 Очень полезная разработка!

    Reply
  4. VV

    Афтар, тебе надо отдельный раздел на этом сайте выделить, а то твои программки искать тяжело, все полезные и нужные :))))

    Reply
  5. Abadonna

    >Афтар, тебе надо отдельный раздел на этом сайте выделить,

    Дык а вот он

    http://infostart.ru/profile.php?user=1329 😉

    Reply
  6. VV

    Так вон оно что! Копилочку сделали… ну, неполохо, неплохо. Ща в закладки добавим.

    Reply
  7. VV

    http://infostart.ru/profile.php?user=1329 — там RSS не хватает. Как я узнаю об изменении списка? Харлеку скажи, чтоб сделал.

    Reply
  8. vip

    Очень полезная весчь.

    Хорошо бы автору свой сайт заиметь. Накоплено полезностей уже очень много.

    Первые компоненты автора произвели на меня в свое время неизгладимое впечатление.

    Хочется, чтобы широкие массы были знакомы с очень оригинальными разработками Abadonna.

    Обращаюсь к мастерам веб-дизайна — помогите талантливому человеку.

    Reply
  9. vasilykushnir

    Abadonna, даешь сайт! Поддерживаю идею vip.

    Reply
  10. VV

    Афтар, вишь, скока у тебя поклонников? Делай «Копилочку Абадонны» типа как у Альфа, не жмись.

    Кстати, оченно нужна утилитка, кторая может у терминальных юзеров редактировать список баз 7-ки. А до лениво к каждому в профиль ходить или рег файлы делать. Подумай, а? Ща начнешь отмазываться, шо мол у тебя терминала нету и т.п. :))))

    Reply
  11. Abadonna

    >Ща начнешь отмазываться, шо мол у тебя терминала нету и т.п. :))))

    У меня терминала действительно нет, на работе — есть 😉

    Reply
  12. CheBurator

    нифига не понял…

    > Файл Start.ini определяет программы, которые должны быть запущены сервисом

    (процессы программ будут запущены под именем system)

    вопрос: когда будут запущены? — когда в system32 появится start.ini ?

    .. вот инстальнул я сервис — в списке служб поставил все как надо.

    тип запуска стоит «автоматически».

    ..ну а дальше что?

    как мне с использованием ‘nq яки запустить 1С допустим ночью на незалогиненой машине..?

    вапще ниче не понятно…

    Reply
  13. Abadonna

    >когда в system32 появится start.ini ?

    «— Будьте добры, господа, убедитесь, что в цилиндре ничего

    нет. Абсолютно ничего, — сказал он.»

    » — Как уже было сказано, здесь ничего нет, — мрачно

    продолжал Карлсон. — И здесь никогда ничего не будет, если вы

    сюда ничего не положите.»

    Reply
  14. CheBurator

    Харэ прикалываться!

    во-первых сам сервисстартер на данный момент стоит в стопе.

    вопрос остался…

    Reply
  15. Abadonna

    Я тебе на мыло напишу

    Reply
  16. Abadonna

    Чебурашка (спасибо ему) обнаружил один маленький глючок: при выборе меню по правому клику в иконке в трее после выбора иногда ничего не происходит. Однако, если кликнуть правой кнопкой еще раз (ничего не выбирая) — все стартует. Пока не знаю с чем это связано: видимо какое-то наложение свойств компоненты CoolTrayIcon (раньше она не подводила) и сервиса. Посмотрю как исправить, а пока просто выполняйте еще один правый клик на иконки для перезапуска пакета программ (если перезапускаете из трея). Примечание: перезапуск через службы (стоп сервис-старт сервис) работает нормально

    Reply
  17. CheBurator

    То что описанов пред.посте зафиксировано на W2003

    Я вам ща ошибок напихаю вагон и маленькую тележку… вот например еще

    (возможно я чего-то недопонимаю)

    старт.ини — лежит где надо.

    сервисстартер стоит в стопе.

    подключаюсь терминально с правами админа

    net start servicestarter

    — сервис успешно стартует (небыстро, кстати!).. и все… выполнения старт.ини не происходит…

    (W2003)

    Reply
  18. CheBurator

    кстати, вскорости выложу свое решение «регламента»

    — восстановление ГП, отсылка результатов на СМС и мыло, выгрузка базы в пакетном режиме, заливка на фтп… Количество экземпляров — ограничено.. подписывайтесь!

    Reply
  19. Abadonna

    >- сервис успешно стартует (небыстро, кстати!)..

    Извини, маэстро, но небыстро его стартуют винды, сам сервис тут не при чем

    >и все… выполнения старт.ини не происходит…

    это ты че-то не того….

    >кстати, вскорости выложу свое решение «регламента»

    спамить в чужих разработках — моветон 😉

    Reply
  20. Abadonna

    Раз пошли такие вопросы, обращаю внимание:

    при использовании Remote Desktop программы запущенные от имени System визуально не отображаются, поэтому и иконка в трее не появляется (как и написано в ридми) — вопросы к Биллу. Однако это не означает, что они не работают.

    Мне пришлось писать спец. программку. чтобы отображать на своем компьютере лог работы Office Mail Server именно потому, что не мог посмотреть через RD, что она там делает. Однако, делает 😉

    Reply
  21. CheBurator

    > спамить в чужих разработках — моветон 😉

    вы где-то видите ссылки..? 😉

    в принципе автор может потереть весь неконструктив…

    описанное в предыдущем посте сегодня допер сам:

    затерминалился, стартанул ручками шедулеровское задание — тишина.. станно… смортю в списках процессов (а шедулер у меня стартует сервисстартер) 0 сервисстартер в состоянии Starting (не Started!) — так я в этом состоянии и пребывал… визуально ниче не происходит… занятно… и тут СМСина сваливается на мобилу что типа «все ок, хозяин» — слегка офанарел… 😉

    Так что — все работает как описал автор!

    за что ему еще отдельный +1

    если еще поправит глюк с «нестартом» по правому клику мыши…

    кстати — могу попробовать поюзать и выслать какие-нибудь логи если скинешь отладочную версию софтины с какими нибудь «дампами» работы — чтоб найти глючок — стараюсь помочь в плату за свой спам 😉

    Reply
  22. Abadonna

    поправил глючок иконки в трее, проверил на домашнем под XP

    Reply
  23. CheBurator

    Продолжаю юзать сабж… все ок.. осталось в пакет прикрутить убитие окон и модификацию самого задания чтоб выполнялось пока не выполнится успешно…

    ++10

    Reply
  24. CheBurator

    Какой дятел поставил минус один? А?????? вы что — совсем офанарели?

    Reply
  25. sfs

    Маленькое дополнения к readme

    «1. Зарегистрировать серсис в системе командой ПутьServiceStarter.exe /install

    (для отмены регистрации ключ /uninstall)»

    Win 2003, файлик ServiceStarter.exe должен лежать в C:WINDOWSsystem32

    Reply
  26. CheBurator

    (25) читайте ридми — там все написано… 😉

    Reply
  27. Abadonna

    (25) ServiceStarter.exe может лежать в любом месте, ini-файл в ..WINDOWSsystem32\r

    (в начале необязательно C:, знаю многих, у которых на D система)

    Reply
  28. sfs

    (27) Пробовал, и только в этом месте получилось. ..WINDOWSsystem32\

    Reply
  29. Abadonna

    (28)>Win 2003 …и только в этом месте получилось. ..WINDOWSsystem32\r

    У меня Win 2003, файл ServiceStarter.exe лежит на c:coutchersoft и все распрекрасно работает

    Reply
  30. sfs

    А подскажите пожалуйста, только одну базу можно стартануть или несколько?

    Reply
  31. Abadonna

    2 sts Он не обязательно базы стартует, а любые батники, комы, экзюки.

    Стартует в соответствии со строчками, прописанными в файле ini

    (см. ридми)

    Reply
  32. sfs

    Ага, сенкс.

    Reply
  33. dushich

    Спасибо большое!

    Это как раз то, что я искал.

    У меня сразу столько проблем решилось.

    Пополз тестить… 🙂

    Reply
  34. K_A_O

    а если запустить

    mstsc /console

    или для последних версий

    mstsc /admin

    Reply

Leave a Comment

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