Оптимизация SQL-запросов в PHP: избавляемся от тормозов! 🚀
Сегодня я расскажу, как повысить производительность SQL-запросов в PHP и уменьшить нагрузку на базу данных.
1. Используйте подготовленные запросы. Это не только защита от SQL-инъекций, но и возможность кеширования запросов внутри системы управления базами данных.
Пример с PDO:
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email");
$stmt->execute(['email' => $email]);
$user = $stmt->fetch();
2. Выбирайте только необходимые данные.
Зачем вам использовать SELECT *, если нужны только id и name? Выбирайте только нужные колонки!
$stmt = $pdo->query("SELECT id, name FROM users");
3. Индексы – ваши друзья.
Проверьте, есть ли индексы на полях, которые часто используются в WHERE и JOIN. Без индексов база данных будет выполнять полный перебор строк!
CREATE INDEX idx_email ON users(email);
4. Избегайте N+1 запроса.
Вместо того чтобы выполнять 100 мелких запросов, сделайте один с JOIN.
❌ Плохо (100 запросов в цикле!):
foreach ($users as $user) {
$stmt = $pdo->prepare("SELECT * FROM orders WHERE user_id = ?");
$stmt->execute([$user['id']]);
$orders[$user['id']] = $stmt->fetchAll();
}
✅ Хорошо (один запрос):
$query = "SELECT users.id, users.name, orders.id as order_id
FROM users
LEFT JOIN orders ON users.id = orders.user_id";
$stmt = $pdo->query($query);
$result = $stmt->fetchAll();
5. Используйте кеширование.
Храните часто запрашиваемые данные в Redis или Memcached, чтобы снизить нагрузку на базу данных.
$cacheKey = "users_list";
$users = $redis->get($cacheKey);
if (!$users) {
$users = $pdo->query("SELECT id, name FROM users")->fetchAll();
$redis->setex($cacheKey, 3600, json_encode($users));
}
Эти советы помогут вам ускорить ваш PHP-код, снизить нагрузку на базу данных и сделать сайт более отзывчивым.
👉 [|@php_be1]
Сегодня я расскажу, как повысить производительность SQL-запросов в PHP и уменьшить нагрузку на базу данных.
1. Используйте подготовленные запросы. Это не только защита от SQL-инъекций, но и возможность кеширования запросов внутри системы управления базами данных.
Пример с PDO:
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email");
$stmt->execute(['email' => $email]);
$user = $stmt->fetch();
2. Выбирайте только необходимые данные.
Зачем вам использовать SELECT *, если нужны только id и name? Выбирайте только нужные колонки!
$stmt = $pdo->query("SELECT id, name FROM users");
3. Индексы – ваши друзья.
Проверьте, есть ли индексы на полях, которые часто используются в WHERE и JOIN. Без индексов база данных будет выполнять полный перебор строк!
CREATE INDEX idx_email ON users(email);
4. Избегайте N+1 запроса.
Вместо того чтобы выполнять 100 мелких запросов, сделайте один с JOIN.
❌ Плохо (100 запросов в цикле!):
foreach ($users as $user) {
$stmt = $pdo->prepare("SELECT * FROM orders WHERE user_id = ?");
$stmt->execute([$user['id']]);
$orders[$user['id']] = $stmt->fetchAll();
}
✅ Хорошо (один запрос):
$query = "SELECT users.id, users.name, orders.id as order_id
FROM users
LEFT JOIN orders ON users.id = orders.user_id";
$stmt = $pdo->query($query);
$result = $stmt->fetchAll();
5. Используйте кеширование.
Храните часто запрашиваемые данные в Redis или Memcached, чтобы снизить нагрузку на базу данных.
$cacheKey = "users_list";
$users = $redis->get($cacheKey);
if (!$users) {
$users = $pdo->query("SELECT id, name FROM users")->fetchAll();
$redis->setex($cacheKey, 3600, json_encode($users));
}
Эти советы помогут вам ускорить ваш PHP-код, снизить нагрузку на базу данных и сделать сайт более отзывчивым.
👉 [|@php_be1]
Как справиться с «загадочными» ошибками в PHP? 🤔
Сегодня я хочу обсудить одну из самых неприятных проблем в программировании — «загадочные» ошибки. Это те сбои, которые проявляются только в рабочей среде, исчезают при попытке отладки и вызывают нервное напряжение 😬.
🔍 Почему это происходит?
- Разные среды — на локальной машине у вас PHP 8.2, а на сервере 7.4 (и вдруг функция match ломает весь код).
- Необработанные ошибки — ошибки игнорируются с помощью @, а логи ничего не показывают.
- Состояние кэша — в OpCache или APCu осталась старая версия кода.
- Конкуренция потоков — скрипты выполняются одновременно и мешают друг другу.
🛠 Как с этим бороться?
1⃣ Отключить OpCache на тестовом сервере. Это позволит быстрее проверять изменения и исключить проблемы с кэшем.
2⃣ Настроить логирование. Включите error_reporting(E_ALL) и убедитесь, что display_errors=Off, а log_errors=On с указанием пути к файлу логов.
3⃣ Сравнить среды. Используйте phpinfo() или php -m для проверки версий PHP и установленных модулей.
4⃣ Включить трассировку ошибок. Xdebug поможет отследить стек вызовов, а Laravel Telescope покажет детали запроса.
5⃣ Воспроизвести проблему на копии продакшена. Запустите код в Docker с конфигурацией продакшена или создайте staging-сервер.
6⃣ Подключить мониторинг и оповещения. Инструменты вроде Sentry, Bugsnag или New Relic помогут обнаруживать ошибки раньше, чем их заметят пользователи.
👉 [|@php_be1]
Сегодня я хочу обсудить одну из самых неприятных проблем в программировании — «загадочные» ошибки. Это те сбои, которые проявляются только в рабочей среде, исчезают при попытке отладки и вызывают нервное напряжение 😬.
🔍 Почему это происходит?
- Разные среды — на локальной машине у вас PHP 8.2, а на сервере 7.4 (и вдруг функция match ломает весь код).
- Необработанные ошибки — ошибки игнорируются с помощью @, а логи ничего не показывают.
- Состояние кэша — в OpCache или APCu осталась старая версия кода.
- Конкуренция потоков — скрипты выполняются одновременно и мешают друг другу.
🛠 Как с этим бороться?
1⃣ Отключить OpCache на тестовом сервере. Это позволит быстрее проверять изменения и исключить проблемы с кэшем.
2⃣ Настроить логирование. Включите error_reporting(E_ALL) и убедитесь, что display_errors=Off, а log_errors=On с указанием пути к файлу логов.
3⃣ Сравнить среды. Используйте phpinfo() или php -m для проверки версий PHP и установленных модулей.
4⃣ Включить трассировку ошибок. Xdebug поможет отследить стек вызовов, а Laravel Telescope покажет детали запроса.
5⃣ Воспроизвести проблему на копии продакшена. Запустите код в Docker с конфигурацией продакшена или создайте staging-сервер.
6⃣ Подключить мониторинг и оповещения. Инструменты вроде Sentry, Bugsnag или New Relic помогут обнаруживать ошибки раньше, чем их заметят пользователи.
👉 [|@php_be1]
JetBrains взяло на себя выпуск браузерных расширений Xdebug Helper
@php_be1
https://blog.jetbrains.com/phpstorm/2025/03/jetbrains-xdebug-helper/
@php_be1
https://blog.jetbrains.com/phpstorm/2025/03/jetbrains-xdebug-helper/
The JetBrains Blog
JetBrains Xdebug Helper Browser Extension
Introducing the official Xdebug Helper extension by JetBrains, ensuring seamless PHP debugging in Chrome.
Уязвимость в Laravel
Затронуты все версии. Исправления готовы только для 12-10.
https://github.com/advisories/GHSA-78fx-h6xr-vch4
@php_be1
Затронуты все версии. Исправления готовы только для 12-10.
https://github.com/advisories/GHSA-78fx-h6xr-vch4
@php_be1
Laravel-Zero (https://laravel-zero.com/) - это микро-фреймворк для консольных приложений на базе Laravel Framework, позволяющий легко и быстро разрабатывать функционал работающий без веба. Но инициатором этой статьи стал кейс при использовании Laravel Prompts (https://laravel.com/docs/prompts) с несколькими часами потраченного времени.
Для экономии Вашего времени при столкновении с этой ошибкой или вовсе преждевременным её устранением, добро пожаловать в пост:
https://habr.com/ru/articles/892010/
@php_be1
Для экономии Вашего времени при столкновении с этой ошибкой или вовсе преждевременным её устранением, добро пожаловать в пост:
https://habr.com/ru/articles/892010/
@php_be1
Laravel Starter Kits: A New Beginning for Your Next Project
@php_be1
https://blog.laravel.com/laravel-starter-kits-a-new-beginning-for-your-next-project
@php_be1
https://blog.laravel.com/laravel-starter-kits-a-new-beginning-for-your-next-project
The Laravel Blog
Laravel Starter Kits: A New Beginning for Your Next Project - The Laravel Blog
We’ve overhauled our starter kits, replacing Jetstream and Breeze with three distinct, purpose-built starter kits in Livewire, React, and Vue. These new kits allow you to focus on building your app instead of creating boilerplate code from scratch.
⚡️Laravel — это не просто PHP-фреймворк, а инструмент, который меняет подход к веб-разработке. Он помогает писать чистый, поддерживаемый код, ускоряет работу и открывает доступ к мощному инструментарию, который используется в крупных проектах.
Если вы уже работаете с PHP, но хотите выйти на новый уровень, Laravel — ваш лучший выбор. Мы научим вас грамотно использовать этот фреймворк, обеспечивать безопасность приложений, развертывать код и использовать встроенные инструменты для ускорения разработки.
Программа курса строится на реальных задачах и практике. Вы научитесь применять Laravel в продакшен-разработке. А поддержка опытных менторов и разбор сложных кейсов помогут вам быстрее освоить фреймворк и прокачать навыки.
👉Пройдите вступительное тестирование и получите скидку на обучение: https://clck.ru/3JWcV3
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Если вы уже работаете с PHP, но хотите выйти на новый уровень, Laravel — ваш лучший выбор. Мы научим вас грамотно использовать этот фреймворк, обеспечивать безопасность приложений, развертывать код и использовать встроенные инструменты для ускорения разработки.
Программа курса строится на реальных задачах и практике. Вы научитесь применять Laravel в продакшен-разработке. А поддержка опытных менторов и разбор сложных кейсов помогут вам быстрее освоить фреймворк и прокачать навыки.
👉Пройдите вступительное тестирование и получите скидку на обучение: https://clck.ru/3JWcV3
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Сегодня я расскажу вам о простой, но эффективной технике, которая может улучшить ваш PHP-код — использование Value Object вместо обычных типов.
Часто мы передаём параметры в виде строк, целых чисел или массивов. Это просто и понятно. Но когда бизнес-логика становится более сложной, типы начинают нас подводить.
Предположим, у вас есть метод:
function sendSms(string $phoneNumber, string $message): void
Сколько раз вы замечали, что номер телефона передаётся в неправильном формате? Или вообще пустым? Или из другой страны, а вы это не учли?
Вот здесь на помощь приходят Value Object'ы:
final class PhoneNumber
{
public function __construct(private string $number)
{
if (!preg_match('/^\+7\d{10}$/', $number)) {
throw new InvalidArgumentException('Недействительный номер телефона');
}
}
public function value(): string
{
return $this->number;
}
}
Теперь ваш метод будет выглядеть следующим образом:
function sendSms(PhoneNumber $phoneNumber, Message $message): void
Что мы получаем:
- Гарантия валидности данных на этапе создания объекта.
- Код становится самодокументируемым — нет необходимости читать описание, чтобы понять, что именно передаётся.
- IDE и статическая проверка типов не позволят случайно передать email вместо номера телефона.
Да, это чуть больше кода. Но в данном случае "больше" означает "надежнее".
Часто мы передаём параметры в виде строк, целых чисел или массивов. Это просто и понятно. Но когда бизнес-логика становится более сложной, типы начинают нас подводить.
Предположим, у вас есть метод:
function sendSms(string $phoneNumber, string $message): void
Сколько раз вы замечали, что номер телефона передаётся в неправильном формате? Или вообще пустым? Или из другой страны, а вы это не учли?
Вот здесь на помощь приходят Value Object'ы:
final class PhoneNumber
{
public function __construct(private string $number)
{
if (!preg_match('/^\+7\d{10}$/', $number)) {
throw new InvalidArgumentException('Недействительный номер телефона');
}
}
public function value(): string
{
return $this->number;
}
}
Теперь ваш метод будет выглядеть следующим образом:
function sendSms(PhoneNumber $phoneNumber, Message $message): void
Что мы получаем:
- Гарантия валидности данных на этапе создания объекта.
- Код становится самодокументируемым — нет необходимости читать описание, чтобы понять, что именно передаётся.
- IDE и статическая проверка типов не позволят случайно передать email вместо номера телефона.
Да, это чуть больше кода. Но в данном случае "больше" означает "надежнее".
Сегодня я расскажу, как удобно использовать .env файлы в проектах на PHP, особенно если вы не работаете с Laravel.
В Laravel всё просто — доступна встроенная поддержка через библиотеку vlucas/phpdotenv. Но если у вас свой фреймворк или самописный проект, можно также легко организовать работу с переменными окружения.
Вот что я делаю:
1. Устанавливаю библиотеку:
composer require vlucas/phpdotenv
2. Создаю .env файл в корне проекта:
APP_ENV=local
DB_HOST=localhost
DB_NAME=test
3. Загружаю переменные в PHP:
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
// Теперь можно использовать $_ENV['DB_HOST'] или getenv('DB_HOST').
Важно: createImmutable с PHP 7.1+ — безопасный вариант, не перезаписывает уже установленные переменные окружения.
💡 Совет: не забывайте добавлять .env в .gitignore и создавайте .env.example с шаблоном. Это будет полезно для команды и для вас в будущем.
А как вы храните конфигурации? Может быть, кто-то уже использует symfony/dotenv или даже Docker secrets?
Поделитесь в комментариях 👇
👉 [|@php_be1]
В Laravel всё просто — доступна встроенная поддержка через библиотеку vlucas/phpdotenv. Но если у вас свой фреймворк или самописный проект, можно также легко организовать работу с переменными окружения.
Вот что я делаю:
1. Устанавливаю библиотеку:
composer require vlucas/phpdotenv
2. Создаю .env файл в корне проекта:
APP_ENV=local
DB_HOST=localhost
DB_NAME=test
3. Загружаю переменные в PHP:
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
// Теперь можно использовать $_ENV['DB_HOST'] или getenv('DB_HOST').
Важно: createImmutable с PHP 7.1+ — безопасный вариант, не перезаписывает уже установленные переменные окружения.
💡 Совет: не забывайте добавлять .env в .gitignore и создавайте .env.example с шаблоном. Это будет полезно для команды и для вас в будущем.
А как вы храните конфигурации? Может быть, кто-то уже использует symfony/dotenv или даже Docker secrets?
Поделитесь в комментариях 👇
👉 [|@php_be1]
🔥Laravel — мощный PHP-фреймворк, но его скорость может быть ограничена стандартной связкой Nginx + PHP-FPM. Хотите разогнать своё приложение и сократить время отклика?
На открытом вебинаре 3 апреля в 20:00 мск разберём, как интегрировать Laravel с Roadrunner — высокопроизводительным сервером, который меняет подход к обработке запросов. Используем Octane, оптимизируем ресурсы и ускорим выполнение кода.
Вы научитесь подключать Roadrunner к своим проектам, поймёте, как он меняет жизненный цикл PHP-приложения, и сможете внедрить передовые технологии для масштабирования ваших сервисов.
👉Регистрируйтесь и получите скидку на большое обучение «Framework Laravel»: https://clck.ru/3KAfSd
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
На открытом вебинаре 3 апреля в 20:00 мск разберём, как интегрировать Laravel с Roadrunner — высокопроизводительным сервером, который меняет подход к обработке запросов. Используем Octane, оптимизируем ресурсы и ускорим выполнение кода.
Вы научитесь подключать Roadrunner к своим проектам, поймёте, как он меняет жизненный цикл PHP-приложения, и сможете внедрить передовые технологии для масштабирования ваших сервисов.
👉Регистрируйтесь и получите скидку на большое обучение «Framework Laravel»: https://clck.ru/3KAfSd
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🔥 Laravel Telemetry 🔥
Команда Laravel объявляет о включении во фреймворк Telemetry — нового модуля для сбора анонимной статистики об использовании фреймворка. Это поможет анализировать популярные фичи, оптимизировать производительность и сделать Laravel ещё лучше! Telemetry будет включена по умолчанию и собирать такие данные, как версия PHP, используемые пакеты, время выполнения запросов и частота ошибок.
Если вдруг вы не хотите участвовать в улучшении Laravel, всегда можно отключить сбор данных через env-переменную TELEMETRY_ENABLED=false.
@php_be1
Команда Laravel объявляет о включении во фреймворк Telemetry — нового модуля для сбора анонимной статистики об использовании фреймворка. Это поможет анализировать популярные фичи, оптимизировать производительность и сделать Laravel ещё лучше! Telemetry будет включена по умолчанию и собирать такие данные, как версия PHP, используемые пакеты, время выполнения запросов и частота ошибок.
Если вдруг вы не хотите участвовать в улучшении Laravel, всегда можно отключить сбор данных через env-переменную TELEMETRY_ENABLED=false.
@php_be1
Сегодня я хочу поделиться с вами простым и удобным приемом, который помогает поддерживать порядок в больших PHP-проектах — это использование кастомных коллекций вместо обычных массивов.
Если вы когда-либо передавали массивы объектов в методы или возвращали их из них, то, вероятно, сталкивались с ситуацией, когда неясно, что именно содержится в массиве. А потом кто-то мог передать туда строку или null — и вот вам, баги.
Я начал использовать свои классы коллекций. Вот простой пример:
class UserCollection
{
/** @ var User[] */
private array $users = [];
public function __construct(array $users = [])
{
foreach ($users as $user) {
$this->add($user);
}
}
public function add(User $user): void
{
$this->users[] = $user;
}
public function all(): array
{
return $this->users;
}
public function filterByActive(): self
{
return new self(array_filter($this->users, fn(User $u) => $u->isActive()));
}
// и так далее
}
Теперь везде, где раньше использовался массив User[], я применяю UserCollection. Это сразу дает:
- типизацию (и защиту от случайных ошибок),
- автодополнение в IDE,
- методы прямо в коллекции (например, filterByActive, sortByName, first() и т.д.),
- более чистые и понятные сигнатуры методов.
Это похоже на коллекции из Laravel, но я использую это везде, даже в небольших проектах без фреймворков. Такие объекты делают код более чистым, устойчивым и легче читаемым.
Попробуйте в одном из ваших проектов заменить массивы объектов на такие коллекции — и вы удивитесь, как стало лучше.
👉 [|@php_be1]
Если вы когда-либо передавали массивы объектов в методы или возвращали их из них, то, вероятно, сталкивались с ситуацией, когда неясно, что именно содержится в массиве. А потом кто-то мог передать туда строку или null — и вот вам, баги.
Я начал использовать свои классы коллекций. Вот простой пример:
class UserCollection
{
/** @ var User[] */
private array $users = [];
public function __construct(array $users = [])
{
foreach ($users as $user) {
$this->add($user);
}
}
public function add(User $user): void
{
$this->users[] = $user;
}
public function all(): array
{
return $this->users;
}
public function filterByActive(): self
{
return new self(array_filter($this->users, fn(User $u) => $u->isActive()));
}
// и так далее
}
Теперь везде, где раньше использовался массив User[], я применяю UserCollection. Это сразу дает:
- типизацию (и защиту от случайных ошибок),
- автодополнение в IDE,
- методы прямо в коллекции (например, filterByActive, sortByName, first() и т.д.),
- более чистые и понятные сигнатуры методов.
Это похоже на коллекции из Laravel, но я использую это везде, даже в небольших проектах без фреймворков. Такие объекты делают код более чистым, устойчивым и легче читаемым.
Попробуйте в одном из ваших проектов заменить массивы объектов на такие коллекции — и вы удивитесь, как стало лучше.
👉 [|@php_be1]
This media is not supported in your browser
VIEW IN TELEGRAM
Анонс Laravel Wayfinder
Генерация TypeScript-функций для ваших Laravel-контроллеров и маршрутов
https://github.com/laravel/wayfinder
@php_be1
Генерация TypeScript-функций для ваших Laravel-контроллеров и маршрутов
https://github.com/laravel/wayfinder
@php_be1
Сегодня я расскажу, как я упростил настройку и запуск проектов на Laravel с помощью кастомной команды Make.
Когда ты постоянно работаешь с Laravel, такие команды, как php artisan migrate, npm run dev, php artisan serve, php artisan key:generate становятся рутиной. А если у тебя несколько проектов, путаницы не избежать.
Я решил, что это невыносимо.
Поэтому я создал простую команду в Makefile, которая за считанные секунды поднимает проект в нужной последовательности. Вот пример:
up:
@cp .env.example .env || true
@php artisan key:generate
@composer install
@npm install
@php artisan migrate
@php artisan db:seed
@npm run dev
@php artisan serve
Теперь я просто пишу make up — и Laravel запускается 🚀
Можно добавить и другие команды: make test, make down, make fresh, make lint, и каждый проект будет управляться по единому сценарию. Это экономит много времени.
💡 Совет: обязательно ставь @ перед командами — так терминал не будет засорён выводом строк Makefile.
👉 @php_be1
Когда ты постоянно работаешь с Laravel, такие команды, как php artisan migrate, npm run dev, php artisan serve, php artisan key:generate становятся рутиной. А если у тебя несколько проектов, путаницы не избежать.
Я решил, что это невыносимо.
Поэтому я создал простую команду в Makefile, которая за считанные секунды поднимает проект в нужной последовательности. Вот пример:
up:
@cp .env.example .env || true
@php artisan key:generate
@composer install
@npm install
@php artisan migrate
@php artisan db:seed
@npm run dev
@php artisan serve
Теперь я просто пишу make up — и Laravel запускается 🚀
Можно добавить и другие команды: make test, make down, make fresh, make lint, и каждый проект будет управляться по единому сценарию. Это экономит много времени.
💡 Совет: обязательно ставь @ перед командами — так терминал не будет засорён выводом строк Makefile.
👉 @php_be1