Библиотека PHP программиста 👨🏼‍💻👩‍💻
2.17K subscribers
328 photos
169 videos
7 files
337 links
Полезные материалы по PHP, Laravel, Symfony, CodeIgniter, CakePHP, Phalcon

По всем вопросам @evgenycarter
Download Telegram
Столкнулись с проблемой пересечения временных интервалов в вашем сервисе бронирования? В PostgreSQL есть решение, и мы готовы поделиться им с вами!

1 июля на вебинаре "Решение проблемы пересечения временных интервалов с использованием PostgreSQL" вы получите подробное руководство по использованию trigger functions и constraints для построения эффективной системы бронирования.

👨‍💻 Покажем, как использовать встроенные возможности PostgreSQL для упрощения разработки и повышения надежности системы.

💡 Для кого это важно? Для разработчиков на PHP, работающих с системами бронирования и ищущих лучшие практики.

Открытый урок проходит в преддверии старта курса «Разработчик на Spring Framework» — все участники получат скидку на обучение.

📅 Присоединяйтесь к вебинару и научитесь работать с PostgreSQL так, как этого требует реальная практика: https://vk.cc/cN4NdY

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Сегодня я покажу вам, как быстро разрулить хаос в проекте с кастомным фреймворком, где нет нормального логирования.

Ситуация: клиент дал старый проект, ошибок — куча, но логов нет вообще. В коде try-catch, а в catch — пусто. Что делать?

Вот мой быстрый чеклист, который спасал не раз:


1. Глобальный обработчик ошибок и исключений


set_error_handler(function ($errno, $errstr, $errfile, $errline) {
error_log("[PHP ERROR] $errstr in $errfile:$errline");
return false;
});

set_exception_handler(function (Throwable $e) {
error_log("[UNCAUGHT EXCEPTION] " . $e->getMessage() . ' in ' . $e->getFile() . ':' . $e->getLine());
});


Добавил в index.php, и уже вижу, что именно валится.


2. Простой логгер на каждый чих

Создал файл logger.php:


function log_debug($msg) {
file_put_contents(__DIR__.'/debug.log', date('[Y-m-d H:i:s] ') . $msg . PHP_EOL, FILE_APPEND);
}


В нужных местах пишу log_debug('что-то случилось');. Дёшево и сердито, зато работает.


3. Прокинул заголовки и запросы

В самых первых строках запроса:


log_debug("REQUEST: " . $_SERVER['REQUEST_METHOD'] . ' ' . $_SERVER['REQUEST_URI']);
log_debug("HEADERS: " . json_encode(getallheaders()));
log_debug("POST: " . json_encode($_POST));


Теперь видно, с чем именно клиент ломает мой старый код.


Не всегда есть время подтягивать Monolog и делать всё красиво. Иногда нужно быстро найти, где горит — и потушить. А уже потом наводить красоту.

А вы как действуете в таких ситуациях? Есть свои приёмы?

👉 @php_lib
👍11😁1💯1
Laravel lazy() против get()

Знаешь ли ты… что можно обрабатывать большие объёмы данных из базы с помощью lazy() — это гораздо эффективнее по памяти, чем get().

👉 @php_lib
👍61
Хотите стать тимлидом на PHP? Задумывались, как сделать следующий шаг в своей карьере и перейти к менеджерской роли?

16 июля в 20:00 МСК OTUS проведет открытый вебинар «Что нужно знать, чтобы стать тимлидом на PHP». Мы подробно разберем, какие soft и hard skills нужны для этой роли, какую литературу стоит изучить, какие типичные вопросы задают на собеседованиях для тимлидов, и какие ожидания предъявляют компании.

Этот вебинар поможет не только тем, кто уже является тимлидом, но и разработчикам, стремящимся к карьерному росту. Узнайте, как подготовиться к качественно новому шагу в вашем профессиональном пути и получите практические рекомендации для карьерного роста.

Открытый урок пройдет в преддверии старта курса «PHP Developer. Professional». Все участники вебинара получат скидку на обучение.

Регистрация открыта: https://vk.cc/cNsThX

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👎3
💡Совет по Laravel

Знаешь ли ты… о методе skip в планировщике Laravel?

С помощью skip() можно указать, когда команда не должна выполняться.

👉 @php_lib
👍6🤣1
Простой, но полезный приём для дебага в Laravel — логирование SQL-запросов в человекочитаемом виде.

По умолчанию DB::listen() в Laravel выводит запрос с плейсхолдерами ?, а значения параметров идут отдельно. Это не всегда удобно — сложно быстро понять, что реально выполняется.

Вот сниппет, который собирает полный SQL-запрос с подставленными значениями:


DB::listen(function ($query) {
$sql = $query->sql;
foreach ($query->bindings as $binding) {
$binding = is_numeric($binding) ? $binding : "'{$binding}'";
$sql = preg_replace('/\?/', $binding, $sql, 1);
}
logger()->info("Executed query: {$sql}");
});


📌 Пример:


select * from users where email = 'john@example.com' and age > 18


Очень удобно, когда ты хочешь понять, почему условие WHERE не сработало или почему запрос медленный.

Можно кинуть это в AppServiceProvider::boot(), и на локальной машине всегда видеть, что реально уходит в базу.

👉 @php_lib
👍11
💡 Совет для Laravel‑разработчиков

Используйте Crypt facade — он уже есть в Laravel:

- Работает на вашем APP_KEY
- Шифрует данные через AES‑256‑CBC
- Защищает от подделки (MAC) 🔐

Храните API‑токены, пароли и секреты безопасно — прямо из коробки.

👉 @php_lib
👍4
Совет по PHP/Laravel 🚀

Когда у вас есть два случая для кастомных исключений, относящихся к одному и тому же домену, вместо создания нескольких классов исключений можно использовать один класс с разными методами!

Так код будет чище и лучше структурирован! 💪🔥

👉 @php_lib
👍51🍓1
🚀 Вебинар: Тестируем скорость сайтов как профи с WebPageTest!

Привет, backend-разработчик! Ты уверен, что твой сайт летает, а не ползет, как улитка в пробке? 🐌💨

Бесплатный вебинар по WebPageTest покажет, как измерить скорость твоего веб-приложения без магии и шаманских бубнов: регистрация

Разберем:
Как тестировать скорость правильно (спойлер: F5 – не метод)
Что скрывает архитектура WebPageTest
Как читать результаты тестов и не плакать

После вебинара ты сможешь:
🔹 Выбирать систему тестирования
🔹 Проводить тесты так, чтобы даже Google позавидовал
🔹 Анализировать результаты и чинить тормоза

📅 Регистрируйся → получишь напоминалку перед стартом: регистрация

P.S. Если хочешь прокачаться в оптимизации на 100%, приходи на курс «Оптимизация производительности веб-приложений». Не упусти шанс сделать сайты быстрее, чем твой коллег успевает сказать «Это не баг, это фича»! 😉

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Как правильно работать с большими массивами данных в PHP, чтобы не убить память и сервер.

Когда мы пишем скрипты, которые обрабатывают тысячи (или миллионы) строк — будь то импорт из CSV, выгрузка из БД или массовая обработка, — часто допускается ошибка: всё грузится в память сразу. В итоге сервер умирает от нехватки памяти, а скрипт - от таймаута.

Что делать?

1. Частями, а не всё сразу
Например, если вы работаете с PDO:


$stmt = $pdo->query("SELECT * FROM big_table");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
process($row); // Обрабатываем каждую строку на лету
}


Так данные не будут храниться в огромном массиве — обработка идёт построчно.

2. Используйте генераторы
Генераторы (yield) позволяют работать с большими данными лениво:


function getRows($pdo) {
$stmt = $pdo->query("SELECT * FROM big_table");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
yield $row;
}
}

foreach (getRows($pdo) as $row) {
process($row);
}


Память почти не растёт — магия генераторов.

3. Разбивайте на батчи
Иногда эффективнее брать кусками:


$limit = 1000;
for ($offset = 0; ; $offset += $limit) {
$rows = $pdo->query("SELECT * FROM big_table LIMIT $limit OFFSET $offset")->fetchAll();
if (!$rows) break;
foreach ($rows as $row) {
process($row);
}
}


4. Не забывайте про стриминг файлов
Если это CSV или JSON — читайте построчно через fgets() или stream_get_line(), а не file_get_contents().

Такие подходы сильно упрощают жизнь и экономят ресурсы.
А вы как работаете с большими данными? Используете генераторы или предпочитаете батчи?

👉 @php_lib
👍81
💡Совет по Laravel: Проверка дат с помощью Carbon

Уверен, тебе хоть раз приходилось проверять, истекла ли дата или находится в будущем.
Так как Laravel под капотом использует Carbon, у тебя есть доступ к множеству удобных методов, которые позволяют делать это элегантно 🚀

👉 @php_lib
👍5
🐘 Тест по PHP

🔥 Проверь насколько хорошо ты знаешь PHP

Ответишь — пройдешь на продвинутый курс "PHP Developer. Professional" от OTUS по специальной цене.

➡️ ПРОЙТИ ТЕСТ: https://vk.cc/cO9GRJ

🎁 Дарим промокод, который дает скидку на обучение - PHP_PRO_07

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Полный курс Laravel Swagger. REST API Laravel

00:00:00 Введение
00:04:25 Делаем заготовку
00:16:20 Установка Swagger
00:22:18 Общие аннотации и настройки Swagger
00:28:01 CRUD со Swagger
01:03:03 Установка JWT Auth
01:13:08 Авторизация и защищенные роуты в Swagger
01:20:20 Бонус. Нестандартные тело запроса и ответа

источник

👉 @php_lib
👍6
Сегодня хочу поделиться полезной практикой, которая реально экономит время при работе с чужим кодом — быстрая навигация и понимание проекта через composer.json.

Когда попадаешь в новый проект, чаще всего первым делом начинаешь блуждать по папкам, читать контроллеры, роуты, сервисы… Но есть более быстрый способ понять архитектуру - сразу открыть composer.json.

Что можно сразу понять:

- Какие библиотеки используются - а значит, какие фреймворки, ORM, инструменты кеширования или логирования ждут нас внутри.
- Какая версия PHP нужна — помогает избежать сюрпризов с несовместимыми функциями.
- Автозагрузка - раздел autoload и autoload-dev сразу подскажет, где искать код и как он структурирован. Например, если вижу App\\ => src/, я знаю, что основной код живёт в src.
- Скрипты - в scripts иногда прячутся удобные команды для деплоя, генерации, тестов, которые можно запускать через composer run-script.

Я часто делаю так: открываю composer.json, сразу строю для себя “карту” проекта и понимаю, где искать бизнес-логику и какие инструменты уже встроены.

А вы как знакомитесь с новым проектом? С чего начинаете?

👉 @php_lib
👍6🤷‍♂1
🔥 Ищете эффективные способы кэширования в Symfony и хотите повысить производительность приложений?🚀

Присоединяйтесь к открытому уроку «Инструменты кэширования в Symfony» 7 августа в 20:00 МСК.

Что вы узнаете:
- Теория кэширования и её применение в Symfony
- Как правильно использовать компоненты Symfony Cache
- Эффективная работа с распределённым кешем и блокировками

Получите практические знания, которые можно применить в реальных проектах, и улучшите производительность своих приложений с помощью продвинутых методов кэширования в Symfony.

📎Зарегистрируйтесь на урок и получите скидку на большую программу обучения «Symfony Framework»: https://vk.cc/cOfb5D

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Сегодня хочу поделиться темой, которая регулярно спасает мне часы (а иногда и дни) работы — как быстро находить и устранять узкие места в производительности PHP-приложения.

Когда проект начинает подтормаживать, первая реакция — «ну, наверное, сервер слабый». А на деле 80% проблем можно найти прямо в коде. Вот мой рабочий чеклист:

1. Включаю профилировщик.
Если проект на Laravel — laravel-debugbar или Clockwork. Для чистого PHP — Xdebug или Tideways. Они показывают, какие функции и запросы жрут время.

2. Смотрю SQL-запросы.
Удивительно, сколько «тормозов» сидит именно в базе. Часто помогает банальное добавление индексов или переписывание одного запроса.

3. Ищу повторяющиеся операции.
Иногда вижу: одна и та же функция дергается в цикле по 1000 раз, хотя результат можно закешировать.

4. Анализирую работу с файлами.
Если есть много file_get_contents() или операций с большими файлами — выношу их в фоновые задачи (очереди).

5. Включаю кэширование.
Даже простой OPcache и Redis для хранения промежуточных данных творят чудеса.

Мой совет: не пытайтесь «оптимизировать на глаз». Всегда начинайте с измерений — профилировщик покажет правду.

А вы как ищете и устраняете узкие места? Какие инструменты используете чаще всего?

👉 @php_lib
👍14
Сегодня хочу поговорить о ситуации, с которой сталкивался, думаю, каждый PHP-разработчик — "магическое" исчезновение переменных.
Да, вот эти моменты, когда ты уверен, что $userData тут точно есть… а в реальности — Undefined variable: userData.

Причина часто банальна — область видимости.
Многие забывают, что переменные в PHP живут в контексте, где они созданы. Например, внутри функции нельзя просто так достучаться до переменной, объявленной снаружи — она там не существует.

Пример:


$userName = 'Иван';

function greet() {
echo "Привет, $userName"; // Ошибка!
}

greet();


Чтобы это работало, у нас есть три пути:

1. Передать параметром:


function greet($name) {
echo "Привет, $name";
}

greet($userName);


2. Использовать global (но я не советую — код становится менее предсказуемым):


global $userName;


3. Замыкание с use:


$userName = 'Иван';

$greet = function() use ($userName) {
echo "Привет, $userName";
};

$greet();


💡 Совет: всегда старайтесь передавать данные явно - это делает код чище и облегчает тестирование.

А вы как решаете проблему передачи переменных между функциями и методами? Используете глобальные, DI или что-то ещё?

👉 @php_lib
🤡6👍3
Нужно ли в PHP перед вызовом функций ставить обратный слэш?

Несколько лет назад я прочитал статью «How to dump and inspect PHP OPCodes» в которой наконец увидел, что опкоды в PHP действительно существуют. И кроме того, мы, разработчики, которые пишем на PHP на эти опкоды можем влиять, тем самым оптимизируя производительность нашего кода. В статье так же рассказывалось о том, как применение бэкслэшей может ускорить выполнение программ. Я был под впечатлением...

Опкодами (см. Код операции) называется некий промежуточный код, который всё ещё понятен человеку и который выполняется некой исполняющей средой. В случае PHP этой средой является Zend Virtual Machine (она же Zend Engine).

https://habr.com/ru/articles/934316/

👉 @php_lib
👍2
🔧 Сложности с масштабированием консьюмеров в RabbitMQ? Узнайте, как избежать ошибок, которые могут привести к потерям в порядке обработки сообщений.

📅 На открытом уроке 21 августа в 20:00 МСК разберём реальные кейсы и покажем, как правильно масштабировать консьюмеры, сохраняя порядок обработки. Узнаете, какие проблемы могут возникнуть при некорректном масштабировании и как их решить.

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

🚀 Посетите вебинар и получите скидку на полный курс «Symfony Framework»! Регистрация открыта: https://vk.cc/cOwLiZ

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru