Когда воспользовался хинтом от IDE на апгрейд функции (PHP 7 - PHP 8) и положил сервер на 4 часа из-за OOM
А почему бы и нет
И на прод
Апдейт коснулся разных частей системы, htop красный, кеш увеличили, кол-во процессов уменьшили, все равно php-fpm тупит, php демоны не отзываются и падают с непредсказуемой периодичностью
Оказывается это был блок с полифилами, новая версия str_contains на сервере с PHP 7 впадала в бесконечную рекурсию. Вернули строку как было - все ожило.
Будто бы на опиойдах я ебашил бириксойдом ойойой Не фронтендер и не повар А ебучий говнокодер ойойой Было время я ебашил просто так за хлеб и кашу ойойой Сто скриптов добавил в кроне навалил говна в шаблоне ойойой
Опенкарт битрикс или вордпресс Наговнять на любой ЦМС Только доступы ты мне давай Всё готово - иди проверяй
Говнокод говнокод говнокод я художник, а не идиот Я так вижу работу свою Пойду правки в продакшн солью
Я не знаю как в европе может быть там тоже жоппа ойойой Там друпалы и магенты На фреймворках есть проекты ойойой Кода строк у них поменьше Может в них говна поменьше ойойой Но я скажу вам за подход там изначально говнокод ойойой
На фреймворке или на цмс На реакте или на вью джи эс По хуЮ мне на чем сделан сайт Ведь везде можно накостылять
Говнокод говнокод говнокод я художник, а не идиот Я так вижу работу свою Пойду правки в продакшн солью
Заезжают и модЫксы Сайтов много там говнистых ойойой Плагины все от народа сто процентов говнокода ойойой И какой-то черт бывалый обосрет все материалы ойойой Сниппеты в код навставляет А что делать сам не знает ойойой
Даже если на МодЭксе сайт Его можно легко обговнять Много способов для этого есть Но пора знать бы нам всем и честь
Говнокод говнокод говнокод я художник, а не идиот Я так вижу работу свою Пойду правки в продакшн солью
Стих мой - тег моё. За ошибки прошу прощения, я синий как изолента.
Это мой первый опыт в разработке публичных модулей для Laravel, поэтому прошу не судить строго!
Данный модуль позволяет легко и быстро настроить отправку логов и сообщений об ошибках в Telegram сообщество, где под каждый тип события вы можете выбрать отдельный топик. Таким образом вы можете отправлять сообщения о кастомных событиях, исключения и системные ошибки.
Конечно, есть более продвинутые решения для логирования, но они требуют более глубокую настройку. Я же хотел создать модуль, который будет быстро настраиваться и хорошо подойдёт для мелких и средних проектов.
Настройка модуля
Для начала вам нужно создать Telegram бота который будет отвечать за отправку оповещений. После этого создаём группу, включаем в ней «Темы» и добавляем созданного бота в группу (обязательно с правами администратора).
После установки модуля, вам необходимо создать конфигурационный файл config/tg-logger.php и прописать в нём параметры для работы модуля.
Вы можете создать файл вручную или перенести заготовленную версию конфигурации, которая находится внутри модуля, прописал следующую команду.
php artisan vendor:publish --tag=config
После настройки tg-logger.php, вам необходимо запустить команду которая создаст темы в группе.
php artisan tglogger:create-topics
*После запуска данной команды, файл tg-logger.php будет перезаписан и в нём будут указаны id тем
На этом настройка модуля закончена, ниже рассмотрим как работать с модулем TgLogger.
Работа с модулем TgLogger
Отлов системных ошибок
Для отлова всех типов ошибок вам необходимо изменить базовый обработчик логов в конфигурационном файле config/logging.php, указав в качестве обработчиков классы модуля.
Вы также можете отправлять оповещения, напрямую, используя класс TgLogger и статический метод sendLog().
TgLogger::sendLog('Your message', 'level');
Большое спасибо тем кто дочитать данную статью до конца! Буду очень рад если вы поддержите данное решение на GitHub и напишете свой комментарий под данным постом.
Год с небольшим назад начал торговать кое-каким товаром на Wildberries, а поставщик требовал удерживать РРЦ- очень очень. Иначе штрафы и другие проблемы. Поэтому начал искать, сначала один программист, сделал сыроватый продукт, потом другой сделал как надо.. В итоге, стал сам пользоваться, и другим продавцам у нашего продавца тоже предоставил такую возможность.
В итоге, спустя полгода доработок- в неспешном тормозном стиле ( мне вообще-то 48 лет, и последний раз программировал в институте на турбо-паскале и бейсике в школе), получилось то что получилось, ниже это просто своего рода памятки. Рекламные статьи будут совсем на других ресурсах.
А тут пост для мотивации, что можно натворить не будучи программистом ( вру вру, в душе то я программист, мысленно программировал, писал тех.задания программистам, но кроме include в php ничего не знаю, при том что по логике пытаюсь код читать, который писал нейросети, они ведь иногда ошибаются, что-то иногда понимаю..)
Так что думаю совсем с нуля такое не получится написать, надо хотя бы немного уметь читать документацию и задавать чёткие запросы нейросетям, тем не менее, как говорится, не верю своим глазам!
Если бы учился программированию на php, думаю пришлось бы года два на это убить и то не факт, поскольку нет у меня необходимой для программирования усидчивости, и основные то интересы в жизни это психология (по последнему образованию клинический психолог), кое-какие сайты делал для продажи тех же товаров ( но опять же, без программирования, на конструкторе), написал книгу в конце июля вообще на абсолютно другие темы, не связанные никак с техническим программированием, больше на тему психологии, но тоже не совсем, сейчас планирую вторую книгу, и третья это книга стихов. Чтобы вы понимали, что я не очень то фанат компьютеров:-) Но видимо была детская мечта стать программистом, в своё время не хватило баллов для поступления на автоматизацию металлургических процессов в Красноярске ( цветмет), и поступил просто на металлурга.. Это к тому, что некоторое вдохновение имеется, к тому же меня немножко подпинывали и давали идеи, что можно сделать ( сам то как человек ленивый наверное ограничился бы обычным репрайсером, как он был изначально написан супер-программистом)
Итак, что мы имеем в сухом остатке:
Было изначально:
Репрайсер, удерживающий РРЦ (рекомендованную розничную цену), с проверкой раз в 7 минут ( задается в настройках планировщика хостинг-панели), хранение данных в файловой бд sqlite. Контроль СПП и WB кошелька. ( первоначальные затраты 50 000 р, оплата программистам, первый создал неудачный костыльный вариант ( блин комом), второй создал очень хорошую основу с удачной архитектурой для обновления и для обучения на примере)
Также репрайсер изначально содержит возможность телеграм уведомления при ошибках обновления цен ( в основном это говорит о том, что на WB неполадки того или иного рода)
Что было далее сделано мной с помощью DeepSeek и Le Chat, вначале использовался Copilot, но быстро отправился в утиль..:
В самом репрайсере:
1) Изменение цен в заданных диапазонах времени ( свой прайс- под каждый диапазон времени)
2) Таблица репрайсера показывает остатки товара ( можно выгрузить в CSV, или Excel, с остальными параметрами, чтобы отфильтровать по заданным диапазонам)
3) Загрузка цен до СПП ( изначально репрайсер создан для удержания РРЦ)
4) Загрузка цен до WB кошелька.
5) Юнит-калькулятор ( расчет прибыльности и маржи в %, выгрузка в виде Excel-отчета, быстрая проверка рекламных расходов)
6) Полуавтоматическое обновление цен поставщика при условии заданного артикула поставщика в первой колонке Excel прайса.
7) Реализация создания отчета для отправки поставщику, при выполнении условия из п.6
8) Установка в прайсе товаров, которые не нужно менять
9) Горячая замена цен ( клик мышкой, открывается окно, вписывается цена). В основном цены задавались только напрямую через excel прайс, и приходилось каждый раз загружать новый прайс с измененной ценой.
10) Быстрый вывод товаров с нулевым СПП.
11) Вывод логов действий репрайсера за последние два дня- в модальном окне, либо скачивание файлов отчетов ( до этого только я мог сам посмотреть по FTP)
12) Выводится дата годности токена на видном месте ( ранее информации не было).
Внешние доработки, для себя, не используются другими клиентами, но можем сделать и вам😊
1) Выдача пропусков по расписанию ( актуально для FBS)
2) Синхронизация цен с OZON ( можно ставить в WB такие же цены как в Ozon, при условии доступа к api ozon, либо к сторонним json выгрузкам с прайсом в Ozon.
3) Слежение за конкурентами и создание таблиц с отчетами, проверка цены раз в час, выгружаются таблицы за последние 10 дней, а также в режиме реального времени,с уведомлением о нарушении в телеграм.
4) Слежение за конкурентами и следование ценовым стратегиям ( держать цену на 1р ниже, или такую же как у конкурента, но не ниже заданного предела). В процессе тестирования, проверялось на малом количестве товаров, планируется интеграция в репрайсер
5) Суммирование возвратов ( упрощение процесса работы с возвратами), актуально если очень много товаров.
Для удобства работы с клиентами
1) Обновитель-updater ( эдакая замена GIT по простому), на основе WinSCP ( да, голь на выдумки хитра, и до сих пор не научился пользоваться git, контроль версий проводится кустарно ( в этой папке старое, в этой новое, тестирую, смотрю). При нажатии одной кнопки происходит обновление на разных ftp-серверах, в разных папках, всех установленных репрайсеров, когда была сделана доработка.
2) Панель для контроля оплат, интегрирована с платёжной системой Prodamus через API ( автоматическое продление подписок), в целом реализована система автоматического выключения при неоплате, но пока достаточно всё видно и по таблице оплат.
3) Инсталлятор, то есть клиент вводит в заданной форме емайл, телефон, название организации, логин и пароль, репрайсер устанавливается автоматически по заданному адресу, настройки выдаются на экране установщика и отправляются на почту. Ранее всё делалось вручную, пароли задавались также, файлы копировались через FTP вручную.
Roadmap. Что будет сделано ( в процессе, или в планах):
Для себя: Уведомление об остатках ( если товара мало- приходит уведомление на почту и в телеграм), уже работает, но с колебаниями, в процессе доработки
Для клиентов: Whatsapp-уведомление для желающих ( выбор в настройках), если WB-кошелек сменился ( ранее работало автоматическое обновление WB-кошелька, сейчас задаётся вручную, ввиду изменений WB, возможно это обновление и не понадобится. если WB вернет доступ к настройкам). Также будет сделано уведомление о времени завершения работы токена ( за неделю).
Для клиентов: Задание диапазона обновления/проверки цен в админ/панели, от 7 до 60 минут ( сейчас в основном задаю вручную 1 раз в 7 минут, 1 раз в 10-15 минут, кому этого достаточно и не нужно очень быстро). Отключение/Включение обновления через админ/панель.
Для клиентов: Возможное добавление юнит-калькулятора для учёта % возвратов ( актуально для одежды, где много возвратов, и существующий юнит-калькулятор показывает тогда далеко не точные цифры). Также в общем будет сделана доработка юнит-калькулятора для удобства использования ( цветовые диапазоны для разных уровней прибыльности), сейчас выводится красным если ниже 0, а также другие доработки для горячего анализа прибыльности, сейчас таблица с параметрами добавляется через Excel.
Возможно создание PWA приложения, но это если хватит знаний и если так можно по архитектуре проекта ( до конца не проверено), в этом случае будет возможен запуск на любом мобильном с ярлыка, по аналогии с приложением в телефоне. ( пока это на последнем месте по приоритету)
Возможны другие доработки в меру сил, по пожеланиям клиентов.
Доработки с пометкой для себя чаще всего не внедряются в репрайсер, чтобы его не загромождать ( да и не всем клиентам это нужно), внедряются в первую очередь полезные доработки.
Ежели будут любые вопросы спрашивайте, авось отвечу:-)
Интеграция оборудования с веб-системами часто становится непростой задачей, особенно когда дело касается специфических устройств, таких как кассы. В одном из наших проектов потребовалось настроить взаимодействие кассы АТОЛ 30Ф с веб-приложением, работающим на PHP. Этот кейс стал для нас важным шагом в изучении возможностей автоматизации и оптимизации бизнес-процессов.
Как все начиналось
Касса АТОЛ 30Ф — это популярное решение для ритейла, но её работа традиционно рассчитана на использование с локальными системами, такими как 1С. Нам же нужно было подключить её к веб-приложению, чтобы обеспечить удалённое управление операциями.
Проблема заключалась в том, что драйверы кассы были написаны на языке C и не имели нативной поддержки PHP. Задача заключалась в том, чтобы связать веб-приложение с физическим устройством напрямую, сохранив его функциональность и производительность. Решение мы нашли в технологии FFI (Foreign Function Interface), позволяющей PHP взаимодействовать с библиотеками на других языках.
FFI: как PHP взаимодействует с C
FFI — это расширение PHP, которое открывает доступ к библиотекам на C. С его помощью можно описать функции библиотеки и вызывать их из PHP-кода, как если бы они были встроенными.
Работа началась с изучения заголовочного файла библиотеки Драйвер контрольно-кассовой техники v.10. Этот файл содержал описание ключевых функций, включая команды для управления устройством, передачи данных и получения ответов. Благодаря FFI мы смогли подключить библиотеку и использовать её функции прямо из веб-приложения.
Например, команда для печати чека выглядела следующим образом:
Для упрощения взаимодействия с функциями и переменными из кода на C мы создали PHP-классы-заглушки. Они полностью повторяли структуру заголовочного файла библиотеки, предоставляя описание необходимых функций и переменных на уровне PHP.
Этот подход значительно упростил работу: разработчики могли удобно вызывать методы, а также быстро просматривать их сигнатуры и параметры прямо в IDE, без необходимости заглядывать в исходные файлы на C.
PHP вызывал функцию драйвера, которая напрямую передавала команды кассе.
Стек технологий
Для реализации проекта мы использовали следующий стек технологий:
PHP 8.0: основной язык разработки веб-системы.
FFI: для связи с библиотекой на C.
MySQL: для хранения данных о транзакциях и конфигурациях касс.
Nginx: в качестве веб-сервера.
Docker: для упрощения тестирования и развёртывания.
Linux: серверная операционная система, обеспечивающая поддержку необходимых драйверов.
Особенностью проекта стало сочетание гибкости PHP для веб-разработки и производительности библиотек на C.
С какими трудностями мы столкнулись
Этот проект не обошёлся без сложностей, которые потребовали нестандартного подхода. Одной из основных проблем стало различие в форматах данных: PHP использует строки в кодировке UTF-8, тогда как драйвер кассы ожидал 32-битные данные.
Ещё одной сложностью стало управление памятью. В PHP оно происходит автоматически, тогда как в C за это отвечает разработчик. Чтобы избежать утечек и сохранить стабильность работы, мы реализовали дополнительные меры для корректного освобождения памяти. Кроме того, нам нужно было обеспечить поддержку разных способов подключения кассы — USB, Bluetooth и IP. Мы адаптировали систему так, чтобы она могла работать с любым из этих интерфейсов, обеспечивая гибкость использования в зависимости от сценария.
Как это работает в веб-системе
На финальном этапе наша команда завершила настройку интеграции. Теперь взаимодействие с кассой выглядит просто и интуитивно. Например, чтобы напечатать чек, достаточно вызвать PHP-функцию, а всё остальное — от преобразования данных до отправки команды — происходит под капотом.
Это позволило клиенту управлять кассовыми операциями удалённо, что особенно полезно в ситуациях, когда устройство подключено через IP. При необходимости веб-система также поддерживает работу с кассой через локальные интерфейсы, такие как USB или Bluetooth.
Что мы вынесли из этого проекта
Опыт, полученный в процессе реализации задачи, показал, насколько мощным инструментом может быть FFI. Он позволяет интегрировать устройства и системы на разных языках, что открывает широкие возможности для автоматизации и оптимизации бизнес-процессов.
Этот подход оказался универсальным и может быть применён для работы не только с кассами, но и с другими устройствами: от драйверов видеокарт до сетевых адаптеров.
Работа с FFI и драйверами на C расширила наши представления о возможностях PHP и показал, что грамотное использование технологий позволяет находить простые и эффективные решения для сложных задач.