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

По всем вопросам @evgenycarter
Download Telegram
💡Совет по Laravel

Строишь URL с динамическими параметрами для HTTP-запроса?
Не нужно вручную склеивать длинную строку!

Используй URI-шаблоны с методом withUrlParameters() — так код станет чище и понятнее при работе с API.

https://laravel.com/docs/12.x/http-client#uri-templates

👉 @php_lib
👍5
strlen() vs mb_strlen(): Почему 71% PHP-разработчиков ошибаются

В этой статье разберем, как PHP работает со строками и почему даже простой вызов strlen() может привести к неожиданным результатам. На примере крайне простой задачи "что выведет echo strlen('привет!');" посмотрим, что и как влияет на подсчет длины строки, заглянем внутрь реализации strlen() и развенчаем миф о строках как массивах.

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

👉 @php_lib
👍4
Сегодня я покажу вам, как быстро разрулить хаос в проекте с кастомным фреймворком, где нет нормального логирования.

Ситуация: клиент дал старый проект, ошибок — куча, но логов нет вообще. В коде 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
💡Совет по Laravel

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

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

👉 @php_lib
👍7🤣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
👍13
💡 Совет для Laravel‑разработчиков

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

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

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

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

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

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

👉 @php_lib
👍51🍓1
Как правильно работать с большими массивами данных в 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
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
👍7
Сегодня хочу поделиться полезной практикой, которая реально экономит время при работе с чужим кодом — быстрая навигация и понимание проекта через composer.json.

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

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

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

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

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

👉 @php_lib
👍61🤷‍♂1
Сегодня хочу поделиться темой, которая регулярно спасает мне часы (а иногда и дни) работы — как быстро находить и устранять узкие места в производительности PHP-приложения.

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

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

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

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

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

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

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

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

👉 @php_lib
👍15
Сегодня хочу поговорить о ситуации, с которой сталкивался, думаю, каждый 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
🤡8👍6
Нужно ли в PHP перед вызовом функций ставить обратный слэш?

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

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

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

👉 @php_lib
👍7🔥2
💡 Совет по Laravel

Передавайте большие файлы без перебоев, используя потоки.

👉 @php_lib
👍5
💡 Совет по Laravel

Не позволяй запросам к базе данных замедлять работу. Используй фасад Cache в Laravel для временного кэширования данных и сокращения количества обращений к базе.

👉 @php_lib
👍10
Сегодня хочу поделиться одной небольшой, но очень полезной привычкой, которая здорово экономит время в работе с PHP-проектами.

Когда я только начинал, я постоянно забывал про php artisan tinker (если речь про Laravel) или встроенный интерактивный шелл php -a. А ведь это супер-удобный способ быстро проверить кусок кода, протестировать работу функции или глянуть, что вернет тот или иной запрос.

Например, нужно быстро понять, как работает кастомный accessor в модели? Вместо того чтобы городить временные роуты или var_dump-ить в контроллере - открываешь tinker:


php artisan tinker


И сразу работаешь с моделью:


$user = App\Models\User::find(1);
$user->profile->full_name;


Буквально за пару секунд получаешь ответ, без лишнего мусора в коде.

Еще круто использовать tinker для тестирования сервисов или вызова хелперов. Иногда я даже проверяю SQL-запросы через Eloquent, чтобы потом использовать их в сидерах или тестах.

Короче, мой совет: если еще не используете — приучите себя чаще заходить в tinker. Это ваш "быстрый песочница", которая всегда под рукой.

А вы как чаще отлаживаете код в Laravel - через tinker, dd() или дебаггер в IDE? Напишите в комментах, будет интересно сравнить!

👉 @php_lib
👍111👎1🤔1
Gemini API PHP Client

Клиент Google Gemini API для PHP позволяет вам использовать модель искусственного интеллекта Gemini.

Установка

composer require gemini-api-php/client


Базовая генерация текста


use GeminiAPI\Client;
use GeminiAPI\Resources\Parts\TextPart;

$client = new Client('GEMINI_API_KEY');
$response = $client->geminiPro()->generateContent(
new TextPart('PHP in less than 100 chars'),
);

print $response->text();
// PHP: A server-side scripting language used to create dynamic web applications.
// Easy to learn, widely used, and open-source.


https://github.com/gemini-api-php/client

👉 @php_lib
👍8