Опять уперлись в платформу ?, Мрачные раздумья о производительности …




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

29 Comments

  1. vasilykushnir

    Чтобы уйти от уровня «не уровня «от одной бабки слышал»» просто посоветую обратить взор на крупные электростанции (для примера в Украине — Днепрогес), особенно те, что обслуживают несколько регионов, где нужна очень быстрая реакция на изменение нагрузки в сети. И сервера там стоят не детские и ПО никому в голову не приходило ставить на платформе 1С…. В твоем случае, ИМХО, 1С немного не та платформа (изначально не ставилась задача максимальной реакции на внешние раздражители — и что 8.0, что 8.1 без разницы — танк не взлетит.).

    Reply
  2. Обмен данными можно организовать по-другому. Мы создали регистр — где отмечаем изменные документы (Проц ПриЗаписи() пишет ссылки в регистр). Раз в час обработкой выбираем регистр и по ссылкам выгружаем документы (XML или через СОМ соединямся)- регистр очищаем. У нас объемы не такие как у Вас (база 2 гиг за год). Значительно повысит произодительность ежеднывный перезапуск SQL и 1с-сервера (службы). Еще как вариант терминальный.

    Reply
  3. Mantis

    VasilyKushnir +1!

    Reply
  4. d.snissarenko

    Я немного не уловил, скл сервер работает еще и как сервер терминалов?

    Самое печальное в 1с — это то что она не поддерживает SQl репликации.

    Откажитесь от Citrix Metaframe — неповоротливое создание, я поставил 2x application server, load balancing на 2 сервера терминалов, можно на сколь угодно сделать, в целом, железо у меня стоит обычное, скл и сервер 1с вынесены на отдельную машину — 4 гига мозгов, дисковая подсистема сата диски 16мб буфером в мирроре, серверы терминалов тоже по 4 гига , везде стоят двухядерные процы, ОС — win2k3 r2 , SQL пока 2005 стандарт, реально заметил снижение нагрузки на железо после снесения метафрейма, в среднем сидит от 40 до 50 юзеров, в планах до 100-150, SQL пока трудится на средней нагрузке в 20-30% ЦП, память ессно по максимуму отъел, все настрйки скл базовые. документов в день около 150-200 мб больше, справочник номенклатуры порядка 25 тысяч, спр контрагентов около 2000, на серверах терминала ограничение на простой 30 минут, не работает человек — нефиг занимать машинное время.

    Средний трафик между сервером скл и сервером терминалов от 10-15гб в сутки.

    Убейте ctfmon — + 1-5% нагрузки ЦП с юзера.

    С дисковой подсистемой все сложнее, харды на 15000к, оч хорошее охлаждение, Raid 5 нужно бы поставить на sql, тоже собираюсь, пока только руки не дойдут, а то смотреть на интенсивность работы хардов прямо жуть.

    Reply
  5. d.snissarenko

    PS// Или учитывая воможность SQL писать своего клиента для данной БД

    Reply
  6. garin

    1с не годится вам. Есть «Галактика», R3 и т.п.

    Reply
  7. DAV

    ИМХО не правильно ставите задачу уважаемый, вы пытаетесь решить проблему средствами той платформы, которая не предназначена для решения таких проблем штатными средствами. Да и что греха таить и не штатными. VasilyKushnir правильно отметил — танк не взлетит, посему выход надо искать в другом месте. Для начала необходимо более четко сформулировать задачу. Расписать требования, особенно касаемые бизнес-процессов (время обработки, время реакции, скорость доступа и т.д.). Потом выбирать платформу согласно этих требований. Видел как пытались автоматизировать подобный процесс в Энергосбыте (местном) на 7.7 — жуткое зрелище. Посему советую либо полностью уйти от 1С, либо применить другую технологию используя 1С как интерфейс (Web). В общем и целом чтобы полее полно ответить на заданные вами вопросы, надо иметь несколько больше информации, чем вы описали в статье.

    Reply
  8. CheBurator

    Считай примерно так: 1000 бакинских на одного пользователя. Вот вам цена решения.

    Reply
  9. tormozit

    Без абзацев читаемость плохая.

    Reply
  10. support

    исправил

    Reply
  11. sokir
    Reply
  12. OLEG4120

    Не понятно, почему Вам страшно переходить на 8.1…

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

    Мы перешли и обратно я не когда не соглашусь…

    PS мед. Центр 50 пользователей 1500 документов день, 100 000 пациентов…

    Reply
  13. OLEG4120

    Кстати Документы поступают из оракловой (основной базы, моя относится к лабораторным исследованиям) обменом, обрабатываются и посылаются обратно.

    Reply
  14. Широкий

    На 8.1 есть такая фишка как управляемые блокировки..

    Советую попробовать

    Reply
  15. hogik

    Вопрос автору.

    Решение найдено?

    Reply
  16. O-Planet

    А что мешает отказаться от 1С и использовать системы, предназначенные как раз для таких объемов данных?

    Reply
  17. isn

    у нас решение по типу вашего реализовано на цитрикс серверах/клиенте, правда клиентов чуть меньше около 650 пользователей. организовано 3 сервера с 1С сервером приложений(32 и 64 битные), 6 серверов с цирикс клиентами, 2 сервера с sql. количество филиалов тоже чуть меньше, но очень большой удаленностью (порядка 5000-7000 км друг от друга. и проблем с произодительностью не наблюдаем. сервера 2-4 процессорные на Intel и IBM. на основной площадке сидят 350 человек. Решение с такими масивами переводят часто на оракл, но это совсем другие решения и стоимость оракла и его поддержки возрастает не соизмеримо. количество документов в день от 3000 до 8000. разделение по шли по пути: базы куда вводят данные и базы которые дают отчеты — производительность резко возрастет. сначала будет пользователям неудобно, потом привыкнут к новому регламенту работы. Я не сказал о дублирующих серварах и тоже их полно. всего в айти сфере 750 компов 48 серверов.

    Reply
  18. Minotavrik

    Добрый день!

    1) Я думаю вопрос о переходе на другую платформу вообще тут не уместен, для фирмы была разработана программа, которая всех устраивает.

    2) Я так понял, что все базы тянут, единственное все утыкается в обмен между этими базами.

    3) Теперь про обмен, так вот дорогие товарищи встроенное в 1с 8.1 решение обмена стандартными средствами это полная ж…. говорю полностью обосновано т.к. сам с этим сталкивался.

    Работал в одной конторе объем данных хороший, но т.к. обмен был написан нормально все выгружалось и загружалось очень быстро. Я даже все это дело пересадил на пакетный режим. Т.е. загрузка, выгрузка на каждом филиале происходила в регламенте через каждые 5 минут и в центральном узле все это подгружалось, головной офис был отдельной базой с которой шел полный обмен. Центральная база всегда была свободна.

    Изменения данных в регистрах сведений в сотни тысяч строк обменивал минут за 30 с 15 филиалами.

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

    Хорошо настроенный, т.е. написанный обмен дает очень много.

    Reply
  19. Minotavrik

    Основная проблема в стандартном автообмене это регистрация изменений без разбора. А нужно регистрировать изменения при записи объекта согласно политики миграции документов. Еще много ньюансов, которые можно поправить если выключить стандартную регистрацию.

    Reply
  20. hamsar

    8.2+оракл

    Reply
  21. Шёпот теней

    … мнение от «дедушки» …

    1. свой обмен (выгрузка паралельно с дкументом) …

    2. упростить данные для передачи …

    2.1. переписать документы дающиё большую нагрузку на обмен …

    2.2. упростить структуру данных (конфигурация) …

    2.3. создать паралельные регистры для «нагруженных документов) …

    3. не дано …

    п.с.1. переделывать с запасом …

    п.с.1. переход на другую систему учёта видимо будет ешЁ зАтратнее чем п.1. и п.2. или покупка оборудования …

    … вотТАКОЕмнение …

    Reply
  22. larisab

    На дату и автора то смотрели, советчики по переписыванию конфигураций? 😀

    Reply
  23. Шёпот теней

    (22) … разве это имеет значение ? .. ! … да пусть хоть 1Апреля …

    … задача интересная и далеко идущая … на таких вот и бывают прорывы в сознании …

    … тем более можно узнать и результат … так чем тАмА дело кончилось-то … ???

    … вот …

    Reply
  24. larisab

    (23) Судя по твоему ответу в 21 ты последний абзац статьи не читал.

    Reply
  25. Шёпот теней

    … почему же … читал … поэтому и пишу от «дедушки» …

    … порядок цифр не пугает … пугает переход на 8-ку … странные у нас программы — прям ка игрушки … сколько им не дай «железа» всЁ мало …

    … у нас в регионе есть компания которая написала свою программу … она работает и сейчас … сейчас её меняют на Р/3 … и что ? … да ничего … программа работает а Р/3 нет … Р/3 внедряют уже 6 лет человек 100 (програму местную обслуживаеь коллектив в 12 человек) … вОт … обЪём данных сопаставим с (0) …

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

    .. вот …

    Reply
  26. Шёпот теней

    … так чем тАмА дело кончилось-то … ???

    … ТАКхочетсяУЗНАТЬвот …

    Reply
  27. a.ivanov

    Обратитесь в SoftPoint. Там вам помогут. У них есть очень хорошее решение для он-лайн обмена данными

    Reply
  28. Душелов

    (27) Посмотрите на дату публикации.

    Reply
  29. a.ivanov

    Да я потом только посмотрел. Сначала глянул на дату последнего комментария, думал еще актуально )))

    Reply

Leave a Comment

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