
- Главная
- Каталог
- Интернет технологии
- Библиотека PHP программиста 👨🏼💻👩💻
Библиотека PHP программиста 👨🏼💻👩💻
Полезные материалы по PHP, Laravel, Symfony, CodeIgniter, CakePHP, Phalcon По всем вопросам
Статистика канала
string, int, array. Всё просто и понятно. Но как только бизнес-логика усложняется — типы начинают нас подводить.
Допустим, у вас есть метод:
function sendSms(string $phoneNumber, string $message): void
{}
А теперь скажите честно — сколько раз вы ловили себя на том, что phoneNumber передаётся в неправильном формате? Или вовсе пустым? Или из другой страны, а вы это не предусмотрели?
Вот тут и приходят на помощь Value Object'ы:
final class PhoneNumber
{
public function __construct(private string $number)
{
if (!preg_match('/^\+7\d{10}$/', $number)) {
throw new InvalidArgumentException('Invalid phone number');
}
}
public function value(): string
{
return $this->number;
}
}
{}
Теперь ваш метод будет выглядеть так:
function sendSms(PhoneNumber $phoneNumber, Message $message): void
{}
Что мы получаем:
- Валидность данных гарантируется на этапе создания объекта.
- Код становится самодокументируемым — не нужно читать описание, чтобы понять, что именно сюда передаётся.
- IDE и статическая проверка типа не дадут случайно передать email вместо phone.
Да, это чуть больше кода. Но это тот случай, когда "больше" — значит надёжнее.
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 помогут ловить ошибки раньше, чем их заметят пользователи.
if/else начинают расползаться по проекту, логика дублируется, а добавление нового статуса превращается в риск для всей системы.
📅 На открытом уроке 22 апреля:
— Разберём, как использовать Symfony Workflow для формализации бизнес-процессов через конечный автомат.
— Покажем, чем конечный автомат отличается от рабочего процесса, когда применять каждый подход, как описывать состояния и переходы в YAML и как Symfony умеет автоматически визуализировать процесс.
— На практическом примере рассмотрим сущность заказа со статусами new → paid → shipped → delivered, методы can() и apply(), а также построение схемы состояний через workflow:dump.
Урок не для тех, кто считает, что строковое поле status и набор if/else — это нормальная архитектура «на вырост», и не для тех, кто не работает со сложной бизнес-логикой в приложении.👉 Записаться: https://vk.cc/cWIYAd Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
$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-код, снизить нагрузку на базу данных и сделать сайт более отзывчивым.
isset() и empty() в PHP?
Сегодня разберём две часто используемые функции в PHP — isset() и empty(), которые могут вести себя не так, как вы ожидаете.
📌 isset()
Функция isset($var) проверяет, была ли переменная установлена и не равна ли она null.
❗ Пример подвоха:
$var = null;
var_dump(isset($var)); // false
{}
Если переменной вообще нет в коде — тоже будет false.
📌 empty()
Функция empty($var) проверяет, считается ли переменная "пустой".
❗ Пустыми считаются:
- "" (пустая строка)
- 0 (число)
- "0" (строка с нулём)
- null
- false
- [] (пустой массив)
Пример:
$var = "0";
var_dump(empty($var)); // true, хотя строка не null
{}
⚠️ Ошибка: проверка if (!isset($var) || empty($var)) может привести к неожиданному результату.
🔥 Лучший подход?
Используйте строгие проверки:
if ($var === null) { /* Переменная null */ }
if ($var === '') { /* Пустая строка */ }
if ($var === 0) { /* Число 0 */ }
{}
Если проверяете массивы, то:
if (count($var) === 0) { /* Массив пуст */ }
{}
Вывод: не злоупотребляйте isset() и empty(), а проверяйте переменные строго!
Redis, Memcached), а если данные редко меняются – сохраняйте их в файл.
🔥 2. Используйте isset() вместо array_key_exists()
Функция isset() работает быстрее, чем array_key_exists(), потому что она не только проверяет наличие ключа, но и сразу его значение.
// Медленный вариант
if (array_key_exists('key', $array)) { }
// Быстрый вариант
if (isset($array['key'])) { }
{}
🔥 3. Не злоупотребляйте foreach при больших объемах данных
Если у вас массив с десятками тысяч элементов, попробуйте array_map() или array_walk() – они работают быстрее за счет встроенной оптимизации в C.
🔥 4. Подключайте файлы правильно
Разница между require, include, require_once и include_once может сильно повлиять на производительность. require_once проверяет, был ли уже подключен файл, что замедляет выполнение. Если точно знаете, что файл не дублируется – используйте require.
🔥 5. Включите OPCache
OPCache кэширует байт-код PHP и ускоряет его выполнение в разы. Включите его в php.ini:
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
opcache.validate_timestamps=1
{}
🔥 6. Используйте json_encode() вместо serialize()
Функция json_encode() работает быстрее, чем serialize(), и при этом генерирует более компактные данные.
$data = ['name' => 'John', 'age' => 25];
// Медленный вариант
$serialized = serialize($data);
// Быстрый вариант
$json = json_encode($data);
{}
✅ Оптимизация PHP кода — это не магия, а грамотный подход к написанию скриптов. Используйте эти советы, и ваши проекты станут быстрее!
symfony/translation, разберём подходы к хранению переводов, варианты моделей данных и практическую реализацию получения локализованного содержимого через Doctrine.
Урок не для тех, кто хочет решить многоязычность «одной таблицей на всё», не думает о поддержке архитектуры и считает, что локализация заканчивается на переводе кнопок и заголовков.👉 Записаться: https://vk.cc/cWoJXu Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
timestamps при сохранении модели?
Отзывы канала
Каталог Телеграм-каналов для нативных размещений
Библиотека PHP программиста 👨🏼💻👩💻 — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 2.1K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 6.1, количество отзывов – 0, со средней оценкой 0.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 3496.5 ₽, а за 3 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий