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




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

19 Comments

  1. TrinitronHome

    а где файл? ❓

    Reply
  2. Ivon

    Более простой вариант сделать батник с текстом

    shutdown /s /f

    Reply
  3. NoMax

    Даже как-то пугает программа которая только выключает компьютер и

    при этом ее размер 4 Мб.

    Проще как-то так:

    Dim Time

    Time = InputBox(«Введите время в минутах»)

    WScript.Sleep 1000 * 60 * Time

    Set WSHShell = WScript.CreateObject(«WScript.Shell»)

    WSHShell.Run «shutdown.exe -f -s»

    Reply
  4. neos

    размер 471 кб, а не проще нажать кнопку «применить»?

    Reply
  5. vcv

    (2) Зачем батник, если «shutdown /s /f» идеально прописывается в шедулер. Только нужно бы добавить ключ /t, на всякий пожарный, правильней будет выглядеть.

    А в шедулер можно добавить с помощью «schtasks». Батничком со своей машины сразу по всем включенным компьютерам в сети.

    P.S. Хе-хе. Скоро появятся программеры, пишушие специальные программы для копирования файлов из папки в папку. Или такие уже есть?

    Reply
  6. Ivon

    (5). Уже есть. Сам видел.

    Reply
  7. NoMax

    Все равно пугает 😮

    Reply
  8. bpv

    создаешь бат файл с таким содержимым

    shutdown -s -f -t 1

    , где ключик -t дает возможность установить время задержки выключения в секундах, также можно запускать этот командный файл в шедулере.

    Reply
  9. vcv

    (8) Может я чего-то не понимаю, объясните мне тогда: зачем делать батник с одной коммандой, что мешает вызвать shutdown.exe прямо из планировщика? Или создать ярлык на «shutdown -s -f -t 1» если уж хочется выключать компьютер без вопросов кликом на иконке.

    Reply
  10. idef

    (9) Как-то батником «поуниверсальнее» что ли получается. Если что и подправить можно параметры не лазая в шедулер.

    Reply
  11. vcv

    (10) Вот тут то и ждет большая дыра в безопасности. Автору нужно тушить пользовательские компьютеры без участия пользователя. Если команда прописана в батничке, этот батничек нужно еще переписать на пользовательский комп и позаботиться, что бы ушлый пользователь не смог его поменять, таким образом, что бы вместо завершения работы что-то другое запустилось с правами задания в планировщике (от админа, с правами пользователя не факт, что получится компьютер гарантированно погасить). Получаются лишние телодвижения (подготовить батник, распространить по компам, назначить на него права) вместо того, что бы просто одной командой прописать на удаленном компе команду в планировщик.

    for /f «tokens=1 delims= » %i in (‘net view #k8SjZc9Dxk| findstr «\»‘) do @SCHTASKS /Create /S %i /U Администратор /P пароль /RU Администратор /RP пароль /SC DAILY /TN «Выключение» /TR «C:WindowsSystem32shutdown.exe -s -f -t 1»

    Команду писал без проверки, за правильность не ручаюсь.

    Reply
  12. idef

    (11). Во-первых: Проблема безопасности решается назначением прав доступа к файлу.

    Во-вторых: Если имеем AD копировать гораздо проще.

    Давайте не будем углубляться в администрирование — рискуем утонуть -)))

    Вообще-то сам факт авт. шатдауна довольно спорный. Представьте — пользователь делает работу, а тут его бац и нету. Я бы на его месте взялся за оружие -))

    Reply
  13. idef

    Для меня интересна связка бэкапа и шатдауна на сервере. Например, в определенное время запускается скрипт на серваке гасит пользовательские соединения делает бэкапы и гасит себя.

    ИМХО это может быть актуально для небольших фирм

    Reply
  14. vcv

    (12) Согласен, не будем углубляться в администрирование.

    Вообще-то сам факт авт. шатдауна довольно спорный. Представьте — пользователь делает работу, а тут его бац и нету

    Как я понимаю, вопрос у автора стоял так, что все пользователи в 18:00 дружно уходят домой и начинает делаться на пользовательских компьютерах резервная копия. А сервера, похоже, там вообще не было, уж не говоря об АД. Задача, конечно, про сферического коня в вакууме, притом этот конь явно хромает на пару ног. Хотя, наверное, для мелкой конторы, где в качестве сервера выступает пользовательская машина и утром времени делать архивы нет, потому что все работать хотят… Решение «уходишь — запусти архивирование» подходяще.

    (13) А что там может быть интересного? Банальная админская задача. В определенное время, когда все пользователи должны уже уйти домой, закрываешь все терминальные сеансы и сетевые подключения, удаляешь потенциально битые после сброса сетевых подключений *.CDX, архивируешь, запускаешь в автоматическом режиме конфигуратор, что бы индексы перестроил. И все.

    Reply
  15. idef

    (14)

    удаляешь потенциально битые после сброса сетевых подключений *.CDX, архивируешь, запускаешь в автоматическом режиме конфигуратор, что бы индексы перестроил. И все.

    в том, то все и дело — как то ненадежно все это выглядит. А если не перестроит он индексы, имеем утром полчаса перекура на индексацию. А лучших вариантов 1С в файловом режиме и не даст.

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

    Что не может не радовать — умнее становимся.

    Reply
  16. vcv

    (15)

    1. Перед запуском ночных автоматов убивать процессы 1cv7*.exe на сервере с помощью штатной виндовой taskkill. Можно, если нельзя убивать или не хочется, проверять, например, утилитой 1cusrmon.exe, есть ли кто в базе.

    2. Проверить, зарегистрирована ли база в реестре, если нет, зарегистрировать. Штатная утилита reg.exe.

    2. Удалить из каталога 1С и базы файлы *.tip, что бы «советы дня» выскакивать не могли.

    3. Проверять, нужна ли переиндексация, что бы зазря базу не дергать (см. тут http://www.forum.mista.ru/topic.php?id=114372 ).

    4. После переиндексации проверь необходимость переиндексации по 3 и зацикли скрипт. Желательно с уведомлением себя по электронной почте или SMS.

    Я каких-то заметных проблем с надежностью не наблюдал. Ну подвиснет иногда 1С при запуске. У меня это редко, некритично и бывает только при дневном запуске автообмена РБД. При желании не сложно штатной утилитой schtasks выгрузить в файл отчет о состоянии задач в планировщике и проверить, а не слишком ли долго выполяется определенная задача.

    Денёк повозиться, что бы написать хороший скрипт со всеми нужными проверками и уведомлениями и проблема будет снята.

    Reply
  17. idef
    4. После переиндексации проверь необходимость переиндексации по 3 и зацикли скрипт.

    Не понял смысла этого пункта.

    А вообще большой жирный плюс.

    Reply
  18. vcv

    (17) Ну ты же жаловался «как то ненадежно все это выглядит. А если не перестроит он индексы, имеем утром полчаса перекура на индексацию». Я и советую — проверь после индексации необходимость повторной индексации (а вдруг, мало ли что), и если нужна — выполнить скрипт с начала.

    Reply
  19. idef

    (17) Понял, спасибо

    Reply

Leave a Comment

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