Обновить
128K+

PHP *

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

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

WPS: асинхронные бизнес-процессы для SuiteCRM

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

Мы выложили в open source под лицензией MIT Workflow Processing Service (WPS) — отдельный сервис для бизнес-процессов над записями CRM. Вместе с ним вышли два плагина: для SuiteCRM 7 и для SuiteCRM 8. В статье — какие проблемы встроенного движка процессов SuiteCRM мы решали, как устроен WPS и как подключить его к своей CRM.

Читать далее

Новости

Три месяца pet‑проекта: 450 Telegram‑каналов стримеров, 20 тысяч строк PHP и 1 рубль в день

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

Летом я сделал сайт, который собирает публичные Telegram‑каналы российских стримеров в одну ленту. Идея была простая: я подписан на десяток таких каналов и устал листать их по очереди, чтобы узнать, будет ли сегодня стрим.

Через три месяца у проекта 260 коммитов, 450 каналов, больше 60 тысяч постов в базе, около 4 тысяч страниц в поиске Яндекса и доход от рекламы — 1–2 рубля в день. Это честная ретроспектива: что сработало, на какие грабли я наступил и что показали данные про то, зачем люди на самом деле приходят на такой сайт. Спойлер: не за тем, для чего я его делал.

Читать далее

Пять стадий принятия ИИ: история болезни одного разработчика

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

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

Сама Кюблер-Росс оговаривалась, что стадии не обязаны идти строго по порядку: их можно проскочить, к ним можно вернуться, на них можно застрять. Особенно застрять.

Читать далее

WordPress не умрёт: ИИ-агенты, вайб-кодинг, Laravel, фриланс и будущее сайтов после прихода нейросетей

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

WordPress уже много лет пытаются «похоронить». Сначала казалось, что его вытеснят конструкторы сайтов, затем современные JavaScript-фреймворки, headless-подход и облачные платформы. Теперь к этому добавились нейросети, которые умеют не только писать код, но и работать с проектом целиком: запускать WP-CLI, подключать плагины, готовить тесты и помогать с деплоем.

Так что происходит с WordPress в 2026 году? Есть ли смысл новому разработчику изучать его с нуля? Как ИИ-агенты и вайб-кодинг меняют привычную работу с сайтами? Где заканчиваются возможности WordPress и начинается Laravel? Насколько еще актуальны Elementor, Gutenberg, ACF и WooCommerce? И что вообще останется разработчику, если все больше задач можно поставить обычной фразой?

Я, Александр, автор телеграм-канала «Shulepov Code», поговорил с Александром Сокиркой — разработчиком, который пришел во фриланс еще школьником, начинал с баннера за пять долларов, затем работал с Joomla и WordPress, продавал шаблоны на маркетплейсах, сотрудничал с американскими студиями и сейчас активно экспериментирует с вайб-кодингом и ИИ-инструментами. У Александра также есть YouTube-канал: «Быть Программистом», где он публикует материалы о разработке и своем опыте.

Разговор получился не только про WordPress. Мы обсудили Laravel, Copilot, Claude, Codex и Qwen, рынок фриланса и зависимость от платформ, Elementor и Gutenberg, ACF и таксономии, Docker и CI/CD, WooCommerce, выгорание и то, как меняется сама роль разработчика. Отдельно поговорили о том, что сегодня действительно имеет смысл учить, где ИИ уже экономит часы работы, а где без понимания архитектуры, кода и логики проекта по-прежнему не обойтись.

Читать далее

Session replay и 152-ФЗ: что нельзя записывать и как мы маскируем поля

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

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

Привет! Я Паша, участвую в разработке сервиса записи сессий Broux. В этой статье я расскажу, как мы добиваемся соответствия продукта российским законам с точки зрения персональных данных, что в нашей нише не так уж просто. И я не юрист: юридическая часть ниже описывает, как мы это поняли. Проверяйте со своим юристом.

Первый вопрос, который задают про запись сессий: «а вы видите, что я ввожу в поле?». Честный ответ: технически скрипт записи видит всё, что видит браузер. Вопрос только в том, что он отправит на сервер.

Ниже о том, где обычно утекает лишнее, как с этим работать и при чём здесь 152-ФЗ.

Читать далее

Опечатка в YAML удаляет контент из базы

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

В репозитории проекта лежит 146 YAML-файлов с контентом: персонажи, сюжеты, настройки моделей. На каждом деплое они импортируются в базу — прямо там же, где выполняются миграции схемы.

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

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

Читать далее

Integrals: где я научился веб-разработке на практике

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

Небольшая веб-студия в Тбилиси, множество встреч с клиентами и два года разработки сайтов — с 2016 по 2018 год.

Читать далее

Один SoapFault — и сборщик мусора PHP выключен навсегда. История одной утечки памяти

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

Консьюмер очереди на PHP, который раньше раз в пять-шесть часов падал по OOMKilled. Сообщения при этом не терялись: Kubernetes поднимал под, и консьюмер дочитывал очередь, так что снаружи проблема была почти незаметна. Но регулярное падение по памяти — не норма, и мы решили докопаться до причины...

Читать далее

Большое тестирование способов запуска PHP

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

Я провёл бенчмарки различных серверов и режимов запуска PHP: PHP-FPM + Nginx, FrankenPHP (классический и worker-режим), Rapira (классический, worker, dispatcher), OxPHP (классический, worker), RoadRunner, FreeUnit, Swoole.

Читать далее

Как я два месяца отдавал Яндексу пустую страницу: SSR на Laravel + Inertia на shared-хостинге

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

Сделал калькулятор налога для самозанятых на Laravel + Inertia + Vue с SSR и выложил на обычный shared-хостинг. Сам калькулятор написал за пару вечеров. Всё остальное время ушло на то, чтобы поисковики увидели сайт так же, как браузер.

За два месяца: SSR-демон падал с EPERM, порт оказывался занят «через раз», главная месяц уходила в кэш пустой страницей, а проверка SSR в CI была зелёной, потому что не могла упасть в принципе. Плюс месяц блокировки хостером, о которой я не знал, и фильтр «малоценных страниц» от Яндекса.

Разбираю грабли по порядку — может, кому-то это сэкономит месяц.

Читать далее

Доставка вебхуков: повторы, дубли и ещё три источника проблем

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

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

Читать далее

chunk() пропустил половину рассылки

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

Раз в минуту четыре фоновые команды обходят таблицу на сотни тысяч чатов и решают, кому бот напишет первым: у кого обновились суточные лимиты, кто начал разговор и замолчал, у кого кончилась подписка.

Год назад выяснилось, что за один проход каждая обслуживает ровно половину тех, кого сама же выбрала. Ошибок при этом нет, лог чистый, метрика отправленных растёт. Виноват chunk(), который листает выборку через OFFSET: обработанная строка из этой выборки выпадает, и окно уезжает.

Разбор на живом проекте с 300 тысячами пользователей в месяц: как chunk() теряет строки и чем его заменить, почему withoutOverlapping() по умолчанию блокирует команду на сутки, откуда берутся дубли рассылки и зачем пришлось переворачивать порядок колонок в составном индексе.

Читать далее

Разбираемся с MCP на практике: сервер документации Swagger на Laravel

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

Разбираемся, как дать AI-ассистенту доступ к документации API, не загружая в контекст всю спецификацию. Импортируем Swagger PetStore в PostgreSQL и собираем на официальном пакете laravel/mcp сервер с четырьмя инструментами: поиск по документации, детали операции, именованная схема и список операций по тегу. Проверяем контракт в MCP Inspector и подключаем сервер к Claude Code.

Читать далее

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

Ложка мёда в бочке уязвимостей: разбираем цепочку SSRF → IAM → RCE + бонус

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

Привет, Хабр! Меня зовут Владимир Аламов, я инженер по информационной безопасности и комьюнити-лидер сообщества Security Champions в  Авито. 

Недавно AvitoTech совместно с SPbCTF организовали соревнование по спортивному хакингу HoneyBadger CTF. Участникам нужно было найти в системе дыру и через неё дотянуться до спрятанных данных. Лиги сделали две: «Медовую» для новых игроков и «Барсучью» для продвинутых.

В этой статье я расскажу про одно из самых сложных заданий «Медовой лиги» — МёдХантер. Это игрушечный сервис для поиска работы. В нём нужно пройти целую цепочку и достать из одной системы сразу три флага. Начинается всё с безобидного импорта резюме по ссылке, а заканчивается запуском своего кода на чужом сервере.

Читать далее

Два дня искали баг в Telegram-боте и нашли

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

Мы занимаемся веб-разработкой, CRM-системами и интеграциями. В одном из текущих проектов имеем CRM, где Telegram используется не просто для уведомлений, а как один из каналов взаимодействия с пользователем.

Наш telegram бот перестал работать.

Причём перестал весьма интересно: Telegram прекрасно принимал наши исходящие обращения через API, бот мог отправлять сообщения пользователю, но в обратную сторону — Telegram → наш webhook — запросы практически перестали доходить

Читать далее

Вебхук, в котором нельзя работать

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

Каждое нажатие кнопки в телеграм-боте — это HTTP-запрос от Telegram к вам. Около трёхсот тысяч человек в месяц, у каждого в сессии десятки нажатий, и всё это приходит в один POST-эндпоинт, у которого нет ни права на пятисотку, ни права подумать.

Пропускная способность считается до обидного просто: max_connections, делённое на время ответа. Отвечаете за 200 мс при сорока соединениях — двести апдейтов в секунду. Отвечаете за две секунды — двадцать. И ждёт при этом не абстрактный клиент, а конкретный пользователь, у которого следующее нажатие просто не доедет.

Что осталось внутри вебхука и что уехало в очередь, почему дедупликация по update_id обязана быть атомарной, зачем в ответ на вебхук можно вернуть вызов метода API — и четыре бага, которые нашлись в собственном коде, пока я это писал.

Читать далее

PHP: четыре Active Record в одной клетке — кто быстрее достаёт ваши данные

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

В прошлый раз я вытащил Active Record из Yii1 в отдельный composer-пакет и показал, что код Yii1 умеет жить без фреймворка. Но интереснее другое — насколько хорошо он это делает рядом с остальными. Поэтому я поднял четыре ORM на одной схеме, одних данных и одном железе и прогнал их через phpbench — код и данные лежат на GitHub. В клетке: Eloquent (Laravel), Yii2, Yiisoft Active Record (Yii3) и мой форк Active Record из Yii1 — yii1x/active-record, далее в статье — просто Yii1x.

Можно подумать: раз в предыдущем абзаце прозвучало «мой форк», то и замеры предвзяты. Признаюсь, изначально такой план и был — а потом я всё-таки постарался сделать всё максимально честно. Насколько получилось — судите по цифрам.

Читать далее

Чтобы поменять запятую в боте, нужен был деплой

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

255 — столько у нас было пар «экран × язык» в телеграм-боте, и каждая строчка текста лежала внутри PHP-класса. Чтобы поправить запятую в немецком, нужен был PR, ревью и деплой.

Рассказываю, как мы выносили экраны и переходы бота из кода в YAML на живом проде, без окна обслуживания: почему \n в PHP не равен \n в YAML, зачем понадобилось экранирование поверх экранирования, как 64 байта callback_data определили схему базы и почему стек навигации из JSON-колонки пришлось мигрировать совместимостью, а не конвертацией. Плюс чеклист из 12 пунктов.

Читать далее

Очереди, которых нет в конфиге: динамические супервизоры Laravel Horizon

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

Очереди задач — одна из тех вещей, которые настраивают один раз и боль­ше не тро­га­ют. Кон­фиг опи­сывает извест­ные по­то­ки фоно­вых ра­бот, деп­лой раска­тывает его, вор­керы подни­мают­ся и дела­ют своё дело. Так рабо­та­ет в по­дав­ляю­щем боль­шинст­ве про­ектов. А что если появ­ляется не­об­хо­ди­мость запус­кать мак­си­маль­но изо­ли­ро­ван­ные зада­чи, ко­то­ры­ми дол­жен управ­лять поль­зо­ва­тель, а не раз­работ­чик: соз­да­вать, за­пускать, оста­нав­ли­вать? Это еди­ни­ца, ко­то­рую надо изо­ли­ро­вать, по­яв­ля­ется и исчеза­ет между деп­лоя­ми, а единст­вен­ный спо­соб рас­сказать об этом сис­теме — от­ре­дак­тиро­вать кон­фиг и рас­ка­тать всё за­ново.

В Laravel Horizon доку­мента­ция закан­чи­вает­ся на конфи­ге и паре artisan-команд про то, как поднять супер­визо­ры, наст­роить ворке­ры, их масшта­биро­вание и указать очереди. А что, если нам нуж­но соз­дать свои собст­вен­ные очере­ди и их воркеры в ран­тайме? Об этом доку­мента­ция молчит. Но если про­читать ис­ход­ни­ки, выясня­ется, что конфиг — не единст­вен­ный источ­ник исти­ны.

Эта статья на приме­ре плат­фор­мы для email-рассылок рас­скажет про пост­рое­ние дина­мичес­ких очере­дей поверх стати­чес­ко­го конфига Laravel Horizon, исполь­зуя внут­рен­ние не­до­ку­мен­ти­ро­ван­ные ме­ха­низ­мы, кото­рые Horizon сам ис­поль­зу­ет внутри себя. Про архитек­туру с авто­мати­чес­ким восс­танов­ле­нием кон­сен­су­са, раз­ре­ше­нием оши­бок и оп­ти­ми­за­цией памя­ти для дол­го жи­ву­щих оче­ре­дей.

Читать далее

Anemic vs Rich entities: нечестная дилемма

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

Знаменитый тезис Мартина Фаулера «Anemic Domain Model — это Antipattern» знаком многим.

Тезис простой и звучит убедительно: если модель — это просто набор геттеров и сеттеров, а бизнес-логика живёт в сервисах, то это анемичная модель, процедурный код в объектной обёртке, шаг в сторону от объектного ориентирования. Звучит так себе. Правильнее — переносить поведение внутрь объекта, рядом с данными. Заказ должен уметь рассчитывать свою сумму, добавлять предметы и применять скидку. Данные и поведение живут вместе, инкапсуляция работает, сервисы превращаются в тонкие оркестраторы. Объекты — во главе вашего дизайна.

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

Читать далее
1
23 ...