Обновить
128K+

PHP *

Скриптовый язык общего назначения

70,15
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Как не потратить полдня, прикручивая Юмани-оплату к сайту

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели6.3K

Спойлер: кажется SHA1 устарел, а туториалы этого еще не знают

Привет всем.
Для контекста: я не программист. Я гуманитарий, который до безумия боится цифрового неравенства, которое уже наступает. Поэтому, вооружившись AI‑агентом (Cursor) и бесплатными Claude, Gemini, DeepSeek пытаюсь быть в тренде (некоторые называют это вайб‑кодингом). Признаться я тоже думал, что это что‑то легкое, «вайбовое» — главное, все внятно описать, что ты хочешь. Но по факту в том, что происходит, всё равно приходится разбираться самому.

Свежий пример моих «грабель» — решил прикрутить оплату ЮМани.
Казалось бы, ЮМани, всё придумано до меня. Но есть нюансы...

Читать далее

Wild World, два года спустя: как заброшенная текстовая MMORPG в Telegram получила второе дыхание

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели6.8K

Полтора года я не трогал код — а люди продолжали сами находить игру, регистрироваться и играть. Рассказываю с реальными цифрами, что технически изменилось в моей текстовой MMORPG в Telegram за два года и почему проект получил второе дыхание.

Читать далее

Какие проблемы чаще всего ломают кастомизации Битрикс24 после перехода на ORM и PHP 8

Уровень сложностиСредний
Время на прочтение16 мин
Охват и читатели8.5K

Пятница, 18:00. Вы обновляете PHP на сервере с 7.4 на 8.0 — что может пойти не так? Деплой проходит, страница обновляется, и вместо привычного портала вы видите белый экран с TypeError: array_search(): Argument #2 ($haystack) must be of type array, null given. Мессенджер разрывается от сообщений: «Ничего не работает». Знакомо?

Читать далее

AI для PHP-разработчиков. Часть 7: Экосистема AI-агентов в PHP – от простых вызовов OpenAI до мультиагентных платформ

Время на прочтение8 мин
Охват и читатели12K

За последние два года в экосистеме PHP вокруг AI-разработки сформировалась целая индустрия. Если раньше интеграция LLM выглядела как несколько строк кода с вызовом OpenAI API, то сегодня разработчики строят полноценные агентные системы: с памятью, инструментами, workflow, наблюдаемостью (observability) и даже командами специализированных агентов.

Обычно, когда говорят об AI-разработке, в первую очередь говорят о Python. Тут полно интересных вещей, таких как: LangChain, LangGraph, CrewAI, AutoGen – весь основной шум долгое время происходил именно там.

Но параллельно интересная история развивается и в PHP. И меня это, безусловно, очень радует.

Причем если еще пару лет назад PHP-разработчику приходилось буквально собирать все вручную поверх SDK провайдеров, то сегодня уже существует полноценная экосистема инструментов разного уровня абстракции – от клиентов для работы с моделями до платформ управления многоагентными системами.

Давайте посмотрим, как выглядит этот рынок сейчас.

Читать далее

UUID мертв? Да здравствует Smart ID! Почему ваш проект заслуживает лучшего

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели10K

В этой статье я поделюсь опытом проектирования идентификаторов для крупной медицинской системы. Мы пройдем путь от простых автоинкрементов до UUID, ULID и в итоге создадим гибридное решение, которое оказалось лучше всех существующих подходов. Спойлер: идеальный ID — это не технология, а архитектура.

Читать далее

Как я хотел две странички для SAMBA и NFS, а сделал полноценную панель управления NAS на 20+ страницах

Время на прочтение4 мин
Охват и читатели16K

Как я хотел две странички для SAMBA и NFS, а сделал полноценную панель управления NAS на 20+ страницах

Читать далее

Как я написал плагин для WooCommerce под Yandex YCP или как купить в 1 клик из Алисы

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели8.2K

В конце мая Яндекс открыл Yandex Commerce Protocol для всех — теперь онлайн-магазины могут подключать продажи через Алису AI, Поиск и Яндекс Ритм. Из коробки готовые решения есть для Яндекс KIT, Яндекс Маркета и 1С-Битрикс. Для WooCommerce — нет. У меня магазин на WP, и я написал плагин сам. Open-source, GPL-2.0, все 10 эндпоинтов протокола закрыты. Разбираю архитектуру: как боролся с письмами “новый заказ на 0 ₽”, зачем идемпотентность по session_id, как сделать совместимость с HPOS-хранилищем заказов, и пара других граблей, в которые наступил.

Читать далее

Обновление Битрикса через миграции: как не словить инсульт, нажимая «Обновить»

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели9.1K

Привет! Меня зовут Артем Валевич, я тимлид в AGIMA. Данная статья про битрикс, а конкретно про его обновление. Казалось бы, что может быть проще, чем нажать на проде кнопку «Обновить» и дождаться полного обновления системы? Но чем проект больше и старше, тем сильнее хочется прочитать какую-нибудь молитву перед тем как это сделать. Если повезло — выдыхаем и радуемся обновлению. Если всё пошло «как всегда», то распаковываем бэкапы и пробуем снова.

В некоторых случаях такой подход граничит с безумством. В какой-то момент мы устали от ритуалов и сюрпризов при обновление Битрикса на проде и придумали новый способ — обновление через миграции. Ниже я расскажу, как это вообще работает и почему обновляться с кнопки может быть затруднительным.

Читать далее

Альтернативы Centrifugo для Laravel: Reverb, Pusher, Ably, Socket.IO, SSE и polling

Уровень сложностиПростой
Время на прочтение11 мин
Охват и читатели5.6K

Заключительная часть серии статей про Laravel + Centrifugo и как его готовить.

Сравниваем альтернативы Centrifugo для Laravel: Reverb, Pusher, Ably, Socket.IO, SSE и polling. Разбираем плюсы, минусы и сценарии выбора real-time решения.

Читать далее

Миграции конфигурации Битрикс24 CRM: как мы перестали делать это руками

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели6.2K

Если вы разрабатываете на Битрикс24 и поддерживаете несколько окружений — тест, стейдж, прод — вы знаете эту боль. Настроил воронку, добавил пользовательские поля, написал робота с десятком условий, всё это поправил в карточке, назначил права. А потом нужно повторить то же самое на проде. Руками. Забыв половину.

Конфигурация CRM — это не код. Она живёт в базе данных, не попадает в git, и нет адекватного механизма переноса между окружениями. При этом объём этой конфигурации на реальных проектах значительный: десятки смарт-процессов, сотни пользовательских полей, сложные роботы с условиями, матрицы прав доступа, кастомные виды карточек. Всё это нужно как-то синхронизировать.

В Битрикс24 есть разрозненные инструменты для переноса отдельных частей настроек — штатный экспорт некоторых сущностей через интерфейс, партнёрские модули, закрывающие часть задач. Но каждый работает по-своему, покрывает свой кусок, и ни один не даёт того, что нужно на реальном проекте: полного покрытия CRM-конфигурации в одном инструменте, версионируемого вместе с кодом.

Мы прошли этот путь и в итоге написали набор Version Builder'ов для модуля sprint.migration, покрывающих основные сущности CRM Битрикс24. В этой статье — о самой задаче, подходе и подводных камнях.

Пишите в личку по вопросам.

Читать далее

Centrifugo JS client в Laravel: frontend и production

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели8K

Разбираем frontend и эксплуатацию real-time системы на Laravel и Centrifugo: JS client, reconnect, token refresh, HTTP recovery, Nginx, логи и мониторинг.

Читать далее

Публикация событий из Laravel в Centrifugo: Events, listeners, queue jobs и безопасный real-time payload

Уровень сложностиПростой
Время на прочтение12 мин
Охват и читатели6.9K

В этой статье разберём, как правильно организовать публикацию real-time событий в Laravel: почему не стоит отправлять сообщения напрямую из контроллеров, как использовать Laravel Events и listeners, зачем нужны queue jobs, почему afterCommit() критичен для корректности данных и каким должен быть безопасный payload без полной Eloquent-модели.

Читать далее

Каналы и авторизация в Centrifugo: как безопасно подключить real-time в Laravel

Уровень сложностиПростой
Время на прочтение10 мин
Охват и читатели6.4K

Real-time без авторизации опасен. Если пользователь может подписаться на чужой канал, он может получать чужие уведомления, статусы заказов, сообщения, события админки или финансовые обновления. В обычном HTTP API такая ошибка выглядела бы как доступ к чужому endpoint. В WebSocket-архитектуре ошибка такая же, просто выглядит менее очевидно.

Разбираем в Centrifugo: публичные и приватные подписки, connection token, subscription token, права доступа и безопасное подключение

Читать далее

Ближайшие события

Шрифтовые иски в РФ: 15,3 млн ₽ взысканий за 5 лет и как технически проверить свой сайт

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели17K

Если вы веб‑разработчик и хоть раз подключали шрифт «потому что он красивее, чем системный Arial» — есть ненулевая вероятность, что у вас на сайте лежит коммерческий гарнитур без лицензии. Российский бизнес три‑пять лет назад массово открыл для себя, что это не безобидно: за период 2021–2025 годов через арбитражные суды по шрифтовым искам взыскано 15,3 млн ₽ (данные Коммерсанта), число исков выросло в 2,5 раза за пять лет, и тренд продолжается.

При этом проверить свой сайт на потенциально опасные шрифты — технически нетривиальная задача. Парсить CSS «как получится» через регулярки не работает: получаются ложные срабатывания на CSS‑ключевые слова, на источниках вроде Яндекс.Метрики, на иконочных шрифтах. Дальше — про правовую сторону вопроса и про то, как мы написали детектор, который этим не страдает.

Читать далее

Архитектура Laravel + Centrifugo: кто за что отвечает в real-time системе

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели6.5K

В первой части мы разобрались, что Real-time на Laravel-сайте нужен там, где интерфейс должен получать изменения без перезагрузки страницы: новые уведомления, смену статуса заказа, сообщения в чате, обновления виджетов, события в административной панели. Для таких задач классическая модель HTTP-запроса уже недостаточна, а polling создаёт лишнюю нагрузку на backend. Один из практичных вариантов решения — использовать Centrifugo как отдельный WebSocket-сервер рядом с Laravel-приложением.

В этой статье разберём архитектуру Laravel + Centrifugo: за что отвечает Laravel, какую роль выполняет Centrifugo, как frontend подключается к real-time каналу и как выглядит типовой сценарий публикации события, например при изменении статуса заказа.

Читать далее

Перевёл 16 курсов Anthropic Academy на русский и собрал платформу за выходные

Уровень сложностиСредний
Время на прочтение3 мин
Охват и читатели19K

Перевёл 16 курсов Anthropic Academy на русский за неделю. 448 уроков, субтитры, Telegram-авторизация, пейволл и т.п. на shared-хостинге за $2/мес. Рассказываю, как устроен пайплайн и что пошло не так.

Читать далее

AI для PHP-разработчиков. Часть 6: Bag of Words и TF–IDF – как компьютер превращает текст в математику

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели12K

Когда мы говорим, что нейросети "понимают текст", легко забыть: компьютер изначально вообще не понимает слова. Для него текст – это набор чисел, статистики и векторов.

В этой статье разберём Bag of Words и TF–IDF – фундаментальные подходы, с которых начинались NLP, поисковые системы и анализ текста. А заодно реализуем поиск похожих документов на чистом PHP без библиотек.

Читать далее

Real-time на сайте с Laravel и Centrifugo: зачем нужен WebSocket

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели7.8K

Разбираем, зачем нужен real-time на сайте, почему polling создаёт лишнюю нагрузку и как Centrifugo помогает добавить WebSocket в Laravel-приложение без разрушения backend-архитектуры.

Читать далее

Email в Bitrix24 и amoCRM: техническая архитектура отправки, типичные узкие места и как починить доставляемость

Время на прочтение11 мин
Охват и читатели5.7K

Bitrix24 и amoCRM — две доминирующие CRM в России — отправляют email принципиально разным образом, но имеют общую проблему: ни одна из них не показывает, дошло ли письмо до инбокса получателя. Зелёный статус «Письмо отправлено» в карточке сделки означает только то, что SMTP‑сервер получателя принял письмо. Куда оно легло у клиента — спам, входящие, промоакции — CRM не знает.

В статье:

Читать далее

Переопределение классов ядра Joomla с помощью плагина на примере MVCFactory

Время на прочтение16 мин
Охват и читатели7.1K

Разработчики сайтов, веб-мастера, рассматривая Joomla как CMS, чаще всего используют компоненты ядра такими, какие они есть. Но компоненты ядра, обеспечивающие CRUD-ы в Joomla, следует рассматривать ещё и как примеры использования Joomla в качестве фреймворка. Иногда реалии проекта таковы, что требуется внести изменения именно в логику классов ядра Joomla. Я покажу это на нескольких примерах: как исхитрялись раньше и какие возможности появились в современных версиях Joomla.

Сразу оговорюсь: речь не о том, чтобы править файлы ядра. Это плохая идея почти всегда. При обновлении Joomla такие изменения будут потеряны, а сопровождать их потом придётся вручную. Речь о другом: как изменить точку создания MVC-классов компонента через плагин и DI-контейнер, не залезая в core-файлы.

Ну и приятный бонус - Joomla-археология и немного красивого и ужасного треша из практики 😎

Читать далее