Если файл нужно переложить из одного хранилища в другое, необязательно делать get() и получать весь файл как строку.
$stream = Storage::disk('s3')
->getDriver()
->readStream($sourceFile);
Storage::disk('sftp')->put($targetFile, $stream);
Поток читается и передаётся дальше без необходимости загружать весь файл в память приложения.
Storage::disk('s3')->put(
$targetFile,
fopen($sourceFile, 'r')
);
📌 Для небольших файлов разница может быть незаметна. Для сотен мегабайт или гигабайт — уже совсем другая история.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍2
В Laravel не всегда нужно отдельно проверять наличие поля и его значение.
if ($request->filled('email')) {
// ...
}
В отличие от has(), здесь проверяется не только наличие ключа, но и то, что значение не является blank. При этом 0 и false считаются заполненными.
📌 Удобный маленький метод, который убирает лишние проверки из условной логики.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🥱4
Если нужно взять значение и подставить запасное, необязательно сначала проверять isset():
$name = isset($request['name'])
? $request['name']
: 'Guest’;
$name = $request['name'] ?? 'Guest’;
Он вернёт 'Guest', если значение отсутствует или равно null.
$value = 0 ?? 100; // 0
📌 Простое правило:
?? → «возьми значение, а если его нет — используй это».
isset() → «проверь, существует ли значение и не null ли оно».
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
php roadmap 2026.pdf
328.6 KB
Сохраняйте roadmap, чтобы не потеряться в огромном экосистемном дереве PHP
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
PHP компилирует каждый .php-файл в байткод при каждом запросе — если не настроен OPcache. Это означает лишние CPU-циклы на парсинг даже самого тривиального хелпера.
Минимальный конфиг для прода:
; включаем
opcache.enable=1
opcache.enable_cli=1
; кол-во кешируемых файлов (>= числа файлов в проекте)
opcache.max_accelerated_files=20000
; размер разделяемой памяти (MB)
opcache.memory_consumption=256
; кешируем строки — экономим RAM
opcache.interned_strings_buffer=16
; в продакшне: 0 (не проверять изменения файлов)
opcache.validate_timestamps=0
При каждом запросе PHP проверяет mtime файла на диске. На высоких RPS — это сотни лишних stat()-syscall'ов в секунду. Инвалидируйте кеш вручную через opcache_reset() или перезапуск PHP-FPM при деплое.
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
В PHP 8.4 ленивые объекты появились прямо в движке. Это особенно полезно для ORM, DI-контейнеров и объектов, создание которых может быть дорогим.
Создать lazy ghost можно через Reflection:
$reflector = new ReflectionClass(Order::class);
$order = $reflector->newLazyGhost(
function (Order $order): void {
$order->__construct(loadFromDb());
}
);
На этом этапе конструктор ещё не выполнялся. Когда объекту понадобится состояние, PHP вызовет initializer и объект инициализируется.
Есть и второй вариант — newLazyProxy(): он при инициализации создаёт реальный объект и проксирует дальнейшие обращения к нему.
И важный момент: lazy objects не означают автоматическое ускорение всего приложения. Если объект в итоге всегда используется, выигрыш от откладывания инициализации может быть минимальным.
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8
13 августа вышла Beta 1, а 27 августа запланирована Beta 2. Дальше по календарю: Beta 3 — 10 сентября, RC1 — 24 сентября и GA — 19 ноября.
Новые RFC для 8.6 уже не проходят — сейчас фокус смещается на совместимость, регрессии и баги.
Обычному приложению необязательно переходить на бету в проде. А вот отдельный CI-job с beta-версией может заранее показать, где релиз что-то сломал.
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
This media is not supported in your browser
VIEW IN TELEGRAM
В PhpStorm появился отдельный Laravel Tool Window, который собирает несколько вещей, ради которых раньше приходилось открывать терминал, логи и браузер.
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10😁4🥱1
Вместо:
if (!is_string($name) || $name === '') {
throw new InvalidArgumentException(
'Name must be a non-empty string'
);
}
можно написать:
use Webmozart\Assert\Assert;
Assert::stringNotEmpty($name);
Assert::email($email);
Assert::range($age, 18, 99);
Assert::allInstanceOf(User::class, $users);
Установка:
composer require webmozart/assert
📌 В итоге вместо десятков однотипных if/throw получаем компактные и единообразные guard-условия.
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
Please open Telegram to view this post
VIEW IN TELEGRAM
😢29😁7
Без библиотек — всё уже есть в языке:
// Быстро собрать список/словарь
$emails = array_column($users, 'email');
$map = array_column($users, 'email', 'id');
// Присвоить только если значения ещё нет
$config['timeout'] ??= 30;
// Объединить массивы с переопределением
$query = [...$defaults, 'limit' => 50];
// Проверить, является ли массив списком
array_is_list([1, 2, 3]); // true
// Передать метод напрямую как callable
$ids = array_map(User::getId(...), $users);
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Вместо того чтобы каждый раз объяснять AI-агенту правила проекта, фреймворка и инструменты, skills можно установить и хранить как переиспользуемые инструкции.
В PhpStorm 2026.2 появился отдельный Skills Manager:
📌 Особенно интересно для команд, где несколько разработчиков используют агентов и хотят, чтобы они работали по одинаковым правилам.
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🥱1