Обновить
64K+

PHP *

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

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

Анти Бот для 1C Битрикс: как антиспам для WordPress обзавёлся родственником на Битриксе

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

Некоторое время назад я писал здесь про антиспам для WordPress – историю о том, как из недоступного клиентам Cloudflare и дырявых бесплатных решений родился свой плагин геоблокировки, а чуть позже – вторую часть с разбором критики и рассказом, что успело поменяться. В конце самой первой статьи была одна проходная фраза: «параллельно ведется разработка аналогичного решения для 1С Битрикс – задача там несколько сложнее архитектурно, но подход тот же». С тех пор модуль доехал до Маркетплейса, обзавелся парой обновлений и первыми покупателями. Расскажу, что получилось – и почему для Битрикса такая защита понадобилась даже раньше, чем для WordPress.

Читать далее

Новости

Как загрузить файл через JSON-RPC, если в JSON нет типа для файла

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

В JSON нет типа для файла - так как же загрузить файл через JSON-RPC? Разбираю, как это устроено в otezvikentiy/json-rpc-api 5.2: multipart как транспортный адаптер, валидация через Assert\File, честно про CSRF. И историю о том, как эту фичу принёс внешний контрибьютор.

Читать статью

Как PHP превратился в героя мемов и пережил все свои «похороны»

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

Если бы в интернете вручали премию за количество мемов, в финал наверняка вышли бы Леонардо ДиКаприо, коты с осуждающим взглядом и язык PHP. Над последним разработчики шутят уже столько лет, что фразу «я пишу на PHP» лучше говорить шепотом или не говорить вовсе.

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

Читать далее

Почему e2e тесты это круто, но никто их не пишет. На примере Laravel Dusk

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

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

Читать далее

SOLID в реальном мире: LSP без квадратов и прямоугольников

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

SOLID в реальном мире: LSP без квадратов и прямоугольников Дисклеймер: статья для разработчиков уровня junior и middle, которые знакомятся с принципами чистого кода и SOLID. Примеры кода — PHP 8.1+.

Читать далее

Антиспам для WordPress, часть 2: что успело поменяться

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

В прошлой статье я рассказывал, почему в какой-то момент пришлось делать собственный Анти Бот для WordPress: Cloudflare для части клиентов стал недоступен, а платные альтернативы вроде облачных WAF просят от 10 тысяч рублей в месяц за один сайт – и это при том, что задача у большинства клиентов скромная: отсеять спам-регистрации, спам в комментариях и мусор в формах обратной связи.

Статья неожиданно вызвала живое обсуждение, и часть комментариев была настолько по делу, что отвечать одной строкой в треде было бы нечестно. Так что это скорее не «часть 2» в смысле новой большой темы, а закрытие долгов перед читателями плюс рассказ о том, что успело измениться в плагине с мая.

Читать далее

ИИ-картограф: как карты сшиваются в бесшовный мир — тулсеты (toolsets) для MMORPG игр на PHP, ч. 21

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

Я сшил разрозненные карты MMO в один бесшовный мир: игрок выходит из города в пустыню и не замечает, что под ним уже работает другой сервер. А всю рутину картографа — импорт, разметку препятствий, разрезание карт и проверку связей — отдаю ИИ. Заодно проверил, что происходит, если доверить ему игровую графику

Читать далее

Cделал бесплатный чат для сайта с функциями платных сервисов, делюсь

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

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

Читать далее

Как не начать кодить слишком рано?

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

Часто разработка начинается с кода. Есть идея - мы открываем IDE, создаём проект и начинаем писать. Не задумываясь о том, что в этот момент мы ещё можем не понимать, какую проблему решаем и что вообще должна делать система.

В этой статье разберём путь от пользовательской потребности до реализации: UCD → FR/NFR → KISS → компонентная разработка → код.

Читать далее

Yii1: извлечение Active Record в отдельный composer пакет

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

Может показаться, что старый Yii1 в 2026 году уже никому не нужен. Но, на удивление, проектов, застрявших на этом фреймворке, довольно много. Чаще всего сдерживающими факторами от переезда являются размер проекта, какие‑то свои надстройки над фреймворком или отсутствие денег у бизнеса. Переезд сопряжён с рисками получить два проекта на годы вперёд. Параллельно требуются какие‑либо доработки, что требует вдвое больше ресурсов и от разработчиков, и от бизнеса.

Последний год я активно изучаю устройство современных PHP‑фреймворков и PSR‑стандарты. Относительно недавно мне пришла мысль: а что ценного есть в Yii1 и что блокирует возможность быстро съехать на другой фреймворк? Ответ довольно банален — это Active Record. Можно сказать, что это сердце фреймворка. Почему же так получилось? Как ни странно, внешний API данного слоя довольно неплох даже в 2026 году, не говоря уже о 2008-м, когда он появился на свет, а скорее всего, намного раньше.

Что же мы имеем из возможностей данной ORM?

Читать далее

Hermes c локальными LLM vs GigaCode: сравниваем агентов на реальных PHP/Symfony-задачах

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

На YouTube очень часто мне попадаются видео, где сравнивают разные LLM для вайбкодеров: сделай 3D-аквариум с рыбками, напиши игру, слепи лендинг. Но по ним совсем непонятно, как эти модели поведут себя на существующем проекте с большой кодовой базой и можно ли их применять для ежедневных задач веб-разработчика.

Уже давно пользуюсь Claude Code, и он, в принципе, закрывает все потребности. Но при активной разработке лимиты кончаются довольно быстро... Кроме того, есть риск блокировок, поэтому я всё чаще посматривал в сторону локальных LLM. Было интересно, когда же настанет момент, что их реально можно будет использовать в повседневной разработке.

К сожалению, все модели, которые получалось запустить на своих 16 ГБ VRAM, не внушали оптимизма. Да, их можно использовать для суммаризации текста или написания короткого фрагмента кода, но до агентского кодинга им было очень далеко. И вот мне выдалась возможность поэкспериментировать с DGX Spark, который имеет 128 ГБ унифицированной памяти. Результатами этого эксперимента и хочу поделиться.

В качестве агента для локальных моделей выбрал Hermes — его имя постоянно мелькало в обсуждениях, и многие его хвалили, так что решил попробовать именно его. Модели крутились через vLLM на DGX Spark: весь процесс — чтение кода, поиск нужных мест, внесение правок, запуск тестов и статического анализа — выполнялся самим агентом, без участия человека (но иногда нужно было написать «продолжай», когда работа прерывалась по каким-то причинам).

Тестировал всё на реальных задачах из своего проекта на Symfony. Результатами первых прогонов поделился с коллегами, и им стало интересно, могут ли локальные модели конкурировать с детищем Сбера — тем более что GigaChat недавно обзавёлся агентным режимом. Так в сравнение добавился GigaCode (использовал его внутри GigaIDE) — облачный агент, который на момент написания статьи бесплатен.

Читать далее

Symfony JSON-RPC API Bundle три года спустя: что боевая эксплуатация сделала с кодом

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

В августе 2023-го я писал здесь про свой бандл для JSON-RPC API на Symfony. С тех пор он дорос с 1.x до 5.1 и работает в нескольких продакшенах - от финтех-инструментов до HRM-системы. Честный отчёт: 17 найденных отклонений от спецификации, приватные поля, утекавшие в ответы, CORS-заголовок через запятую - и что из этих уроков стало фичами бандла.

Читать далее

Три месяца спустя: стемы, которые убивали вкладку, и синхрон, который меня чуть не доконал

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

Год назад я рассказал, как из боли «песни разбросаны по чатам» вырос сервис для команд прославления: PHP на дешёвом хостинге, React, деплой по FTP руками. В конце той статьи было три обещания одним абзацем — сделаю стемы, синхронизирую сцену, перееду с shared-хостинга. Все три оказались на порядок сложнее, чем звучали.

Эта статья — про то, что было дальше. Честно, с провалами. Про то, где я бился неделями, где всё падало и где приходилось заходить по пять-семь раз, прежде чем получилось.

Сразу оговорюсь: сами нейросети для разделения на дорожки и распознавания аккордов — не мои. Я использую API Moises. Всё остальное — доставка, движок, синхрон, продукт — моё, и об этом ниже.

Читать далее

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

Joomla-дайджест. 2-й квартал 2026 года

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

Все главные новости из мира Joomla за апрель, май и июнь 2026 года в одной статье. Традиционно дайджест собирает новости сообщества, релизы, расширения, интеграции, видео и статьи из мира Joomla. Прошлый выпуск доступен на Хабре.

Читать далее

Как бот ушёл в 7273 год: бесконечный календарь, 88 632 запроса и неожиданный нагрузочный тест Laravel

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

После запуска хобби-проекта я заметил, что один робот за сутки открыл календарь 88 632 раза и добрался до 7273 года. Причиной оказалась обычная ссылка “следующий месяц”, которая создавала бесконечную цепочку корректных URL.

Рассказываю, как удалось обнаружить проблему с помощью собственной аналитики, почему сервер спокойно пережил неожиданный нагрузочный тест и во что в итоге превратилась страница несуществующих дат.

Узнать, как бот дошёл до 7273 года

Тесты для кода, который пишет ИИ: контракты вместо ассертов — создание сервера для онлайн ММО игр на PHP, ч. 20

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

Половину контрактов моего игрового сервера нельзя записать ассертом: исход живёт в ответе живого процесса, в разметке страницы и в кадре игры. Я записал их таблицами «дано → действие → ожидание», а прогоняет их агент. Рассказываю, как устроен контур проверки кода, который пишет ИИ: контракты вместо юнит-тестов, ревью, где находку надо доказать, и граница, за которую машину не пускают.

Читать далее

Каталог ассетов и git для MMO: как командой вести игру в облаке — создание сервера для онлайн ММО игр на PHP, ч. 19

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

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

Читать далее

DepthNet: платформа для “живых” автономных AI-агентов с продвинутой памятью — год спустя

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

Год назад я написал здесь, что собрал на PHP/Laravel AI-агента, который способен рассуждать в циклах, потестил и остановился со словами «работает, но нужны идеи помощнее». Нужно что то необычное, новое.За год прототип оброс несколькими видами памяти, RAG, оркестрацией, зрением, голосом — и слоем, который даёт агенту что-то похожее на внутреннее состояние. Рассказываю, что выросло. Получился DepthNet 1.0

Подробнее о DepthNet

Process Forge — фреймворк для создания AI-процессов

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

На новогодних каникулах 2026 в одном из чатов Joomla-сообщества коллега по цеху поделился промптом для ИИ-агента и результатом этого промпта. За неделю до этого он впервые попробовал Gemini CLI. Я до этого ИИ пользовался только в веб версиях и в целом меня это устраивало. Увидев простыню текста, запрос в CLI и простыню ответа первое, что меня охватило: "Я НЕ ХОЧУ вот это всё изучать! Опять что-то новое, надоело...".

Потом были стадии проб и ошибок, попыток использовать готовые пакеты community skills с гитхаба с ролевым внушением "ты супер-пупер мега-бэкенд-Joomla разработчик с 40-летним опытом, сделай мне красиво". Где-то в середине этого полугодия я стал формализовать свои процессы (а это не только разработка). Формализация привела к моему пониманию некоторых базисов, которые общие для всех процессов. Об этом чуть ниже.

Теперь я хочу представить на суд уважаемой публике свои наработки по фреймворку для создания формализованных процессов работы для ИИ-агентов - Process Forge (GitHub).

Читать далее

Я написал мессенджер в одиночку. Поможете устроить ему краш‑тест?

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

Дисклеймер: Это статья-проверка на прочность. Проект работает на PHP + MySQL + Polling каждые 3 секунды. Если вы кликнули по ссылке, а сервер отдаёт 502 или упорно молчит — значит, поллинг взял своё под нагрузкой Хабра, а я прямо сейчас судорожно оптимизирую запросы и чиню базу!

Привет, Хабр!

Я в одиночку разработал web‑мессенджер Conlink Messenger. Его главная фича — полный отказ от привязки к номеру телефона: только email, пароль и никакого сбора персональных данных.

Я долго откладывал публикацию в ожидании «идеального кода», но понял, что этот момент никогда не наступит. Поэтому выкатываю MVP в том виде, какой он есть — с простой архитектурой, поллингом вместо WebSocket и кучей спорных решений.

Если после этой статьи окажется, что половину backend'а стоит переписать — значит, опубликовал не зря. Приглашаю устроить проекту честный краш‑тест!

Узнать, как устроен Conlink →
1
23 ...