
Генерация PDF и Excel в PHP: сравниваем библиотеки
Отчёт на 5000 строк кладёт PHP-воркер по памяти, а красивый инвойс из HTML разъезжается на печати. Разбираем, какие библиотеки для PDF и Excel выбрать под задачу и чем каждая платит.

Отчёт на 5000 строк кладёт PHP-воркер по памяти, а красивый инвойс из HTML разъезжается на печати. Разбираем, какие библиотеки для PDF и Excel выбрать под задачу и чем каждая платит.

Отчёты на 20 тысяч строк валят память, кириллица в PDF превращается в квадратики, а Excel открывает файл с предупреждением о повреждении. Разбираем рабочие подходы к генерации документов на PHP.

Загрузка аватарки на 40 мегапикселей роняет PHP-процесс по памяти, а MIME-типу из формы верить нельзя. Разбираем типичные ошибки обработки изображений и рабочие приёмы для GD и Imagick.

AddressSanitizer, UBSanitizer и ThreadSanitizer ловят use-after-free, гонки и переполнение буфера в рантайме. Разбираем, как включить их в проекте и не сломать себе CI ложными и настоящими срабатываниями.

Загрузка аватарки в 8 мегапикселей кладёт PHP-процесс по памяти, а «проверка по расширению» пускает на сервер PHP-шелл под видом картинки. Разбираем ошибки, на которые натыкаются почти все.

Загрузка картинок кажется тривиальной, пока сервер не падает от 40-мегапиксельного PNG или пока в аплоаде не оказывается PHP-скрипт под видом JPEG. Разбираем, что проверить до релиза.

Вебхук от платёжки пришёл дважды — и вы дважды выдали товар. Разбираем, что проверить в PHP-обработчике до выката: подпись, идемпотентность, таймауты и повторы.

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

Вебхук от платёжки пришёл дважды, а заказ оплатился один раз — и ваш скрипт создал две доставки. Разбираем идемпотентность, проверку подписи и быстрый ответ 200, чтобы отправитель не долбил ретраями.

Скрипт на PHP падает с Allowed memory size exhausted при обработке файла на 500 МБ. Разбираем, почему file_get_contents и fetchAll съедают всю память и какие подходы держат постоянный расход независимо от размера файла.

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

Загрузка файла на 2 ГБ падает с ошибкой, скрипт съедает всю память, а Nginx отдаёт 413 ещё до того, как PHP успел вмешаться. Разбираем, что проверить до релиза.