PHPMiddleExperience

Для каких задач PHP является сильным выбором, а где лучше честно выбрать другой язык?

PHP — сильный выбор для web-приложений на Laravel/Symfony, CMS и команд с PHP-экспертизой. Честно выбрать другой язык стоит для CPU-bound задач, высококонкурентных сервисов (Go) и систем с гарантиями компилятора (Rust, Kotlin).

Где PHP — сильный выбор

PHP 8.x — зрелая платформа с предсказуемой моделью развёртывания. Его стоит выбирать в следующих сценариях:

  • Web-приложения с богатой экосистемой: Laravel, Symfony, WordPress. Для CRUD-сайтов, SaaS-продуктов, CMS и интернет-магазинов экосистема закрывает 90% задач готовыми пакетами (Eloquent ORM, Symfony Messenger, WooCommerce). Скорость выхода первой версии продукта обычно выше, чем на Go или Java.
  • Команды с PHP-экспертизой: найм PHP-разработчиков дешевле, чем Rust или Kotlin; порог входа для junior ниже. Если команда уже умеет писать на PHP с PHPStan level 8 и Pest, переход на другой стек — это риск, а не улучшение.
  • Shared-hosting и простая операционка: PHP-FPM + nginx — стандартная конфигурация большинства хостеров; нет необходимости в оркестрации контейнеров для небольших проектов.
  • Сайты с высокой нагрузкой на чтение + кэш: WordPress.com и Facebook (HHVM) исторически показали, что с правильным опкод-кэшем (OPcache) PHP справляется с миллионами запросов в день.

Где честно выбрать другой язык

  • CPU-bound вычисления: обработка видео, ML-инференс, криптография — Go, Rust, C++ дадут на порядок лучшую производительность. PHP не компилируется в нативный код (JIT в 8.x помогает, но ограниченно).
  • Высококонкурентные сервисы с тысячами одновременных соединений: Go goroutines или Erlang/Elixir processes масштабируются дешевле, чем PHP-FPM с N воркерами. Swoole/FrankenPHP частично решают проблему, но усложняют операционку.
  • Строго типизированные системы с гарантиями компилятора: TypeScript (strict mode), Kotlin, Rust дают ошибки на этапе компиляции; PHPStan/Psalm — статические анализаторы, но не компилятор, и артефакты сборки не гарантируют корректность типов в runtime без declare(strict_types=1) в каждом файле.
  • Микросервисы с gRPC и бинарными протоколами: Go и Java имеют более зрелые grpc-экосистемы; PHP gRPC работает, но инструментарий беднее.
  • CLI-инструменты и системное программирование: Go компилируется в один бинарник без зависимостей, что удобнее, чем дистрибутировать PHP-скрипты.

Конкретное сравнение по осям

# Грубое сравнение RPS на Hello World (один воркер, ApacheBench)
# PHP 8.3 OPcache: ~15 000 rps
# Go net/http:     ~80 000 rps
# Node.js Fastify: ~50 000 rps
# Разрыв реален, но для DB-bound приложений нивелируется задержкой БД

Для типичного Laravel-приложения с Eloquent bottleneck — это PostgreSQL, а не PHP. Оптимизация запросов даёт больше, чем смена языка.

Подводные камни

  • Выбор PHP «потому что я его знаю» без анализа нагрузки и команды — это технический долг, а не техническое решение.
  • PHP без PHPStan/Psalm уровня 6+ в CI — это динамически типизированный язык со всеми рисками: TypeError в production, невидимые null-dereference.
  • Long-running PHP (Swoole, RoadRunner) меняет модель памяти: утечки, shared state, нужны reset-хуки — команда должна это знать до перехода.
  • OPcache работает только при opcache.enable=1 и правильном opcache.revalidate_freq; неправильная конфигурация делает PHP на порядок медленнее.
  • WordPress-экосистема и современный PHP (8.x, Composer, PSR-4) — разные миры; не стоит оценивать PHP по коду WordPress-плагинов 2012 года.
  • Найм «любого PHP-разработчика» и найм «PHP-разработчика с опытом Symfony, event sourcing и асинхронной обработкой» — разная стоимость и разный рынок.

What hurts your answer

  • Выбирать PHP по популярности, а не по требованиям проекта
  • Игнорировать опыт команды, эксплуатацию и стоимость поддержки
  • Не называть ситуации, где PHP будет плохим выбором

What they're listening for

  • Называет критерии выбора PHP
  • Учитывает команду, эксплуатацию, стоимость и риски
  • Может назвать сценарии, где выбрал бы альтернативу

Related topics