12 лет програмирования
12 лет программирования — PHP, Laravel, Backend
Канал PHP-разработчика о программировании и backend-разработке. Laravel, PHP, MySQL, Docker, Linux, Git, архитектура, производительность, GitHub, реальные проекты, задачи и ошибки, собеседования и фриланс.
- Каналов в рубрике
- 1 736
- Место этого канала
- № 1 089
Дашборд
16 октября — 22 октября 2026
Загрузка…
Главные числа
Рост аудитории
0подписчиков за период
Число подписчиков за период не менялось
Индекс качества
Индекс качества пока не рассчитан. Он появляется у каналов от 500 подписчиков, которые публикуют посты хотя бы раз в неделю, после недели наблюдения.
Просмотры и охват
0просмотров за период
За период публикаций с просмотрами не было.
Вовлечённость подписчиков
—ER = реакции ÷ просмотры
За период у постов нет прочитанных реакций.
Индекс цитируемости
Индекс цитируемости пока не рассчитан: он появится после ночного расчёта, когда канал упомянут другие каналы.
Когда и сколько публикует
Форматы публикаций
Каждый пост — точка
Выше — больше просмотров, крупнее — больше реакций. Нажмите на точку, чтобы открыть пост.
Итоги периода
Нажмите на показатель — ниже он появится по точкам периода
Реклама в канале
Лучшие публикации
По просмотрам за период
Публикации по дням
Бледные столбики — дни, линия — среднее за 7 дней: видно, разгоняется канал или затихает
Данные обновлены в 00:35 по Москве. Просмотры — текущие у постов, вышедших в эти дни; средний охват — по постам старше двух суток. Как считается индекс качества
Публикации за период
Загрузка…
Сначала я пошёл, казалось бы, очевидным путём — хотел вынести настройки в `config.json`.
Но когда начал это реализовывать, столкнулся с противоречиями.
Откуда библиотека должна брать этот файл? Зависеть от директории проекта? А где вообще эта директория в конкретном приложении? Насколько удобно пользователю каждый раз думать, где должен лежать `config.json`? А как всё это нормально поддерживать внутри Composer-пакета?
В какой-то момент пришёл к мысли, что для библиотеки такой подход вообще не нужен.
Ценность пакета как раз в том, чтобы получить готовый функционал с минимальным количеством дополнительных действий. А если после установки нужно ещё разбираться с каким-то конфигурационным файлом, который библиотека должна самостоятельно искать, то получается лишняя сложность.
Поэтому от `config.json` отказался.
Следующая идея — обычные getter и setter.
Реализовал их и уже собирался на этом остановиться, как вдруг IDE подсказала одну интересную вещь: раз пакет требует PHP 8.5, зачем вообще писать весь этот boilerplate?
Я вспомнил про `get` / `set` property hooks, которые появились в PHP 8.4.
Честно говоря, я просто забыл про эту возможность. Когда читал описание PHP 8.4, видел про property hooks, но на практике ни разу их не использовал.
В итоге вместо набора `getTimeout()`, `setTimeout()`, `getConnectTimeout()` и так далее получилась гораздо более компактная конструкция:
$config->timeout = 60;
$config->connectTimeout = 10;
При этом в `set` hook можно оставить необходимую валидацию.
Получилось красиво, минимально и, на мой взгляд, гораздо удобнее в поддержке.
Но на этом мозговой штурм не закончился.
Появилась вторая задача: я хотел, чтобы `User-Agent` всегда содержал идентификатор моего клиента. Его можно получить, но я не хочу, чтобы пользователь библиотеки мог его изменить.
И тут на помощь пришло ещё одно «чудо» из PHP 8.4 — асимметричная видимость.
В итоге можно сделать свойство публичным для чтения, но закрыть запись:
public private(set) string $userAgent = 'alf89/http-client/0.2.1';
И вот в результате обычная задача «добавить конфигурацию» привела меня сразу к двум современным возможностям PHP, которыми я раньше практически не пользовался.
В очередной раз убедился, что иногда полезно не сразу писать код, а немного остановиться и подумать: а точно ли старый привычный подход здесь лучший?
Так что `property hooks` и асимметричную видимость я точно беру себе на вооружение. Думаю, и дальше буду искать им применение там, где они действительно упрощают код.
В итоге продолжение этого тестового превратилось в статью на Хабре.
Разбираю, зачем вообще добавлять промежуточный сервис, почему не стал сразу тащить RabbitMQ, как подошёл к идемпотентности, очереди, retry и хранению истории.
https://habr.com/ru/sandbox/305258/
В новой версии 0.2.0 добавил конфигурацию HTTP-клиента: настройки `timeout`, `connectTimeout`, `User-Agent` и проверки SSL-сертификата теперь вынесены в отдельный `Config`.
Сам `CurlTransport` теперь получает конфигурацию отдельно от своей логики.
Это пока промежуточный вариант. Следующим шагом хочу вынести настройки из класса `Config` в JSON-файл, чтобы их можно было менять без редактирования исходников библиотеки.
Версия 0.2.0
https://github.com/alf07/http-client-composer/releases/tag/0.2.0
Публикация без текста
Нужно было спроектировать интеграцию 1С → Go → Yandex 360 для отправки email и сбора событий почты.
Самое интересное для меня здесь — не сама отправка письма, а то, что происходит вокруг неё: очередь, повторные попытки, падение сервиса, защита от дублей и корреляция событий между 1С, нашим сервисом и Yandex.
Например, если SMTP-запрос завершился таймаутом, нельзя просто отправить письмо ещё раз — сначала нужно понять, не было ли оно уже принято. Для этого предусмотрена дополнительная проверка Yandex.
В результате получилась архитектура, в которой состояние хранится в БД, обработка идёт асинхронно, события собираются отдельно, а падение Go-сервиса не приводит к потере очереди.
Кода не требовалось — основной упор был именно на проектирование решения.
Пожалуй, такие задания мне сейчас даже интереснее обычных CRUD.
В проекте — авторизация, работа с организациями, парсинг данных Яндекс Карт, отзывы и рейтинг. Для тяжёлого парсинга использовал очереди, чтобы не блокировать основной запрос.
Для меня это был хороший практический проект: пришлось поработать не только с Laravel, но и с Vue, Sanctum, очередями, HTTP-запросами и разбором данных без официального API.
Возможно, позже ещё вернусь к нему и что-нибудь улучшу.
🔗 https://github.com/alf07/test-intera
Заодно сделать что-то полезное для себя.
Начал с HTTP-клиента для PHP — без привязки к фреймворкам, устанавливается как обычный Composer-пакет.
Пока проект небольшой, но планирую постепенно добавлять возможности, улучшать архитектуру и тестировать новые идеи.
Да и самому такой инструмент может пригодиться. 🙂
🔗 https://github.com/alf07/http-client-composer
`sudo` — мощная и потенциально опасная команда, поэтому полезно знать, кто, когда и где её использовал.
Небольшой инструмент, который может пригодиться для контроля серверов и поиска подозрительных действий.
Загрузка…
Загрузка…
Загрузка…
Загрузка…
Загрузка…
Загрузка…
Загрузка…
Загрузка…