fa
Feedback
Библиотека PHP программиста 👨🏼‍💻👩‍💻

Библиотека PHP программиста 👨🏼‍💻👩‍💻

رفتن به کانال در Telegram

Полезные материалы по PHP, Laravel, Symfony, CodeIgniter, CakePHP, Phalcon По всем вопросам @evgenycarter

نمایش بیشتر
2 099
مشترکین
اطلاعاتی وجود ندارد24 ساعت
-57 روز
-730 روز
جذب مشترکین
ژوئن '26
ژوئن '26
+1
در 0 کانال‌ها
مه '26
+11
در 0 کانال‌ها
Get PRO
آوریل '26
+15
در 0 کانال‌ها
Get PRO
مارس '26
+12
در 0 کانال‌ها
Get PRO
فوریه '26
+20
در 0 کانال‌ها
Get PRO
ژانویه '26
+29
در 0 کانال‌ها
Get PRO
دسامبر '25
+17
در 0 کانال‌ها
Get PRO
نوامبر '25
+35
در 32 کانال‌ها
Get PRO
اکتبر '25
+36
در 0 کانال‌ها
Get PRO
سپتامبر '25
+45
در 36 کانال‌ها
Get PRO
اوت '25
+31
در 0 کانال‌ها
Get PRO
ژوئیه '25
+27
در 26 کانال‌ها
Get PRO
ژوئن '25
+47
در 20 کانال‌ها
Get PRO
مه '25
+47
در 43 کانال‌ها
Get PRO
آوریل '25
+59
در 37 کانال‌ها
Get PRO
مارس '25
+46
در 38 کانال‌ها
Get PRO
فوریه '25
+62
در 32 کانال‌ها
Get PRO
ژانویه '25
+50
در 34 کانال‌ها
Get PRO
دسامبر '24
+42
در 35 کانال‌ها
Get PRO
نوامبر '24
+47
در 33 کانال‌ها
Get PRO
اکتبر '24
+51
در 30 کانال‌ها
Get PRO
سپتامبر '24
+117
در 29 کانال‌ها
Get PRO
اوت '24
+69
در 18 کانال‌ها
Get PRO
ژوئیه '24
+42
در 1 کانال‌ها
Get PRO
ژوئن '24
+56
در 24 کانال‌ها
Get PRO
مه '24
+67
در 19 کانال‌ها
Get PRO
آوریل '24
+51
در 1 کانال‌ها
Get PRO
مارس '24
+81
در 21 کانال‌ها
Get PRO
فوریه '24
+75
در 19 کانال‌ها
Get PRO
ژانویه '24
+102
در 24 کانال‌ها
Get PRO
دسامبر '23
+82
در 24 کانال‌ها
Get PRO
نوامبر '23
+66
در 17 کانال‌ها
Get PRO
اکتبر '23
+106
در 18 کانال‌ها
Get PRO
سپتامبر '23
+69
در 0 کانال‌ها
Get PRO
اوت '23
+66
در 0 کانال‌ها
Get PRO
ژوئیه '23
+60
در 0 کانال‌ها
Get PRO
ژوئن '23
+76
در 0 کانال‌ها
Get PRO
مه '23
+113
در 0 کانال‌ها
Get PRO
آوریل '23
+66
در 0 کانال‌ها
Get PRO
مارس '23
+20
در 0 کانال‌ها
Get PRO
فوریه '23
+50
در 0 کانال‌ها
Get PRO
ژانویه '23
+108
در 0 کانال‌ها
Get PRO
دسامبر '22
+106
در 0 کانال‌ها
Get PRO
نوامبر '22
+73
در 0 کانال‌ها
Get PRO
اکتبر '22
+90
در 0 کانال‌ها
Get PRO
سپتامبر '22
+302
در 0 کانال‌ها
Get PRO
اوت '22
+341
در 0 کانال‌ها
Get PRO
ژوئیه '22
+3 386
در 0 کانال‌ها
تاریخ
رشد مشترکین
اشارات
کانال‌ها
04 ژوئن+1
03 ژوئن0
02 ژوئن0
01 ژوئن0
پست‌های کانال
Сегодня я покажу вам, как безопасно работать с пользовательским вводом в PHP — тема старая, но до сих пор частая причина уязв
Сегодня я покажу вам, как безопасно работать с пользовательским вводом в PHP — тема старая, но до сих пор частая причина уязвимостей. Часто вижу в коде что-то вроде:

$id = $_GET['id'];
$query = "SELECT * FROM users WHERE id = $id";
Если вы всё ещё так делаете — пора остановиться. Это прямое приглашение для SQL-инъекций. Даже если вы думаете "ну я же intval() применяю", это не решение. Правильный подход — использовать подготовленные выражения (prepared statements). Пример на PDO:

$id = $_GET['id'];
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute(['id' => $id]);
$user = $stmt->fetch();
Если вы используете mysqli, там тоже есть prepare() — не игнорируйте его. Никогда не вставляйте переменные напрямую в SQL-запросы. Также стоит помнить: фильтрация ≠ экранирование, и экранирование ≠ защита. Настоящая защита — это изоляция данных от SQL с помощью prepare(). ✍️ А как вы валидируете и обрабатываете пользовательские данные? Используете ли какую-то свою обёртку или ORM? Поделитесь в комментариях. 📲 Мы в MAX 👉 @php_lib

2
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП
172
3
Сегодня я покажу вам, как быстро и удобно организовать автозагрузку классов в PHP без использования Composer. Мы все любим Co
Сегодня я покажу вам, как быстро и удобно организовать автозагрузку классов в PHP без использования Composer. Мы все любим Composer, но бывают ситуации, когда он просто неуместен — например, в небольшом проекте, скрипте или легаси-коде, где Composer не использовался изначально. В таких случаях можно сделать свою простую, но эффективную автозагрузку. Вот базовый пример: spl_autoload_register(function ($class) { $baseDir = __DIR__ . '/src/'; $classPath = str_replace('\\', '/', $class) . '.php'; $file = $baseDir . $classPath; if (file_exists($file)) { require $file; } }); Что здесь происходит: - spl_autoload_register регистрирует анонимную функцию, которая будет вызываться при попытке использовать неизвестный класс. - Класс App\Services\MailService превратится в путь src/App/Services/MailService.php - Если файл существует — он подключается. Это суперудобный способ структурировать код и избавиться от бесконечных require. Если хочется чуть больше гибкости — можно добавить поддержку нескольких базовых директорий, логирование ошибок или даже кэширование найденных путей. 📲 Мы в MAX 👉 @php_lib
329
4
Сегодня хочу рассказать вам про одну ошибку, которую я часто встречаю у начинающих PHP-разработчиков — неправильную работу с
Сегодня хочу рассказать вам про одну ошибку, которую я часто встречаю у начинающих PHP-разработчиков — неправильную работу с датами и временем. Когда вы используете функции вроде date(), strtotime(), time() напрямую без явной установки временной зоны (timezone), ваш код может начать вести себя непредсказуемо. Особенно если ваш проект запущен на серверах в разных регионах. Чтобы избежать проблем: - Всегда задавайте временную зону явно через date_default_timezone_set('Your/Timezone'); в начале вашего приложения. - Или лучше используйте объекты DateTime и DateTimeZone, они гораздо удобнее для работы с временными зонами и манипуляциями с датами. Пример хорошего подхода: $date = new DateTime('now', new DateTimeZone('Europe/Moscow')); echo $date->format('Y-m-d H:i:s'); И еще одна рекомендация — всегда храните даты в базе данных в формате UTC, а уже при выводе преобразовывайте их в нужную временную зону для пользователя. Небольшая дисциплина в работе с временем сэкономит вам кучу нервов в будущем. Проверено на реальных проектах! 📲 Мы в MAX 👉 @php_lib
334
5
Сегодня я хочу показать вам простой, но очень полезный приём для работы с массивами в PHP — использование функции array_column(). Очень часто бывает задача: из многомерного массива "вытащить" только один столбец данных. Например, у вас есть массив пользователей: $users = [ ['id' => 1, 'name' => 'Иван', 'email' => 'ivan@example.com'], ['id' => 2, 'name' => 'Ольга', 'email' => 'olga@example.com'], ['id' => 3, 'name' => 'Павел', 'email' => 'pavel@example.com'], ]; И нужно получить только список всех email'ов. Многие делают это через foreach, но есть более элегантное решение: $emails = array_column($users, 'email'); Результат будет таким: [ 'ivan@example.com', 'olga@example.com', 'pavel@example.com' ] А ещё array_column() позволяет указать третий параметр — ключ массива. Например, сделать email по id: $emailsById = array_column($users, 'email', 'id'); И тогда получится: [ 1 => 'ivan@example.com', 2 => 'olga@example.com', 3 => 'pavel@example.com' ] Это удобный способ быстрого преобразования данных без лишнего кода. Пользуетесь ли вы array_column() в своих проектах? Или предпочитаете что-то другое? Напишите в комментариях! 📲 Мы в MAX 👉 @php_lib
367
6
Сегодня я покажу вам простой способ, как разрулить хардкорный баг с session_start() в PHP. Недавно один подписчик столкнулся с ситуацией: скрипт падает с ошибкой "Cannot send session cache limiter - headers already sent". Думаю, каждый второй PHP-разработчик хотя бы раз в жизни это видел. Разбираемся. 💥 Причина Ошибка возникает, когда session_start() вызывается после того, как браузеру уже отправлены заголовки. В PHP это означает — где-то до session_start() был echo, пробел вне тегов <?php ?>, или даже var_dump() для отладки. Любой вывод в браузер = PHP уже отправил заголовки. А session_start() хочет их изменить — и ловим ошибку. ✅ Как лечить 1. Ищем вывод до session_start() - Проверь, нет ли echo, print, отладочных функций или лишних символов до вызова session_start(). - Включи буферизацию ob_start() в начале скрипта — поможет временно «глотать» вывод: ob_start(); session_start(); Но это костыль. Лучше всё же вычистить лишний вывод. 2. Идеальная структура файла <?php // Никакого вывода до этого места! session_start(); // Весь остальной код ?> 3. Ищи BOM Иногда редакторы типа Notepad++ добавляют невидимый символ BOM в начало файла. Он тоже считается выводом. Решается сохранением файла в UTF-8 без BOM. 🛠 Мой способ отладки Когда всё выглядит правильно, но ошибка всё равно есть: - Создай новый чистый файл, вставь туда session_start() — если работает, значит проблема в другом коде. - Используй headers_sent(): if (headers_sent($file, $line)) { echo "Вывод уже начат в $file на строке $line"; } Это сэкономило мне кучу времени при отладке старых легаси-проектов. 📲 Мы в MAX 👉 @php_lib
408
7
Сегодня я покажу вам, как удобно логировать в Laravel, не засоряя код и не превращая проект в болото из Log::info() на каждом шагу. 💡 Используем каналы логирования правильно Laravel предоставляет мощную систему логирования на базе Monolog. Но часто мы ограничиваемся дефолтным логом. А зря. Например, создаём отдельный канал для логов оплаты: // config/logging.php 'channels' => [ 'payment' => [ 'driver' => 'single', 'path' => storage_path('logs/payment.log'), 'level' => 'info', ], ], Теперь в нужном месте можно писать: Log::channel('payment')->info('Платёж прошёл', ['user_id' => $user->id, 'amount' => $amount]); И всё — никакой путаницы. В laravel.log остаётся только то, что важно для всего проекта, а логи оплаты — отдельно. Можно и в телеграм скидывать, если настроить webhook. 👀 Бонус: helper-функция Чтобы писать меньше: if (!function_exists('payment_log')) { function payment_log($message, array $context = []) { \Log::channel('payment')->info($message, $context); } } Теперь вызываем везде просто payment_log('Платёж принят'). Пишите в комментах, какие каналы логирования вы используете и куда пишете — в файл, телегу или Sentry? 📲 Мы в MAX 👉 @php_lib
373
8
🧑‍💻 Приглашаем на открытый урок курса «PHP-разработчик. Продвинутый уровень» 19 мая в 20:00 — Работа с очередями в Laravel:
🧑‍💻 Приглашаем на открытый урок курса «PHP-разработчик. Продвинутый уровень» 19 мая в 20:00 — Работа с очередями в Laravel: от настройки до решения типичных проблем Разберём, как очереди помогают ускорить приложение и вынести тяжёлые задачи в фон без потери стабильности. Обсудим настройку и обработку задач, типичные ошибки, повторы при сбоях, защиту от дублирования и мониторинг выполнения. Вы поймёте, как работают фоновые процессы в Laravel, научитесь правильно настраивать очереди и делать приложение быстрее и надёжнее. 🚀Открытый урок проходит в преддверии старта курса «PHP-разработчик. Продвинутый уровень» 19 мая в 20:00 МСК. Регистрация: https://vk.cc/cXMQc2 Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
456
9
Сегодня я покажу вам простой, но мощный способ, как ускорить отладку в Laravel при работе с большим количеством логики в контроллерах и сервисах. 🔍 Ловим баги быстрее с помощью ray() от Spatie Обычно мы используем dd() или dump() в Laravel, чтобы посмотреть, что творится с переменными. Но как только проект становится крупнее — эти методы начинают мешать, особенно когда нужно отслеживать несколько значений в разных местах. Спасает Ray — инструмент от Spatie, который интегрируется с Laravel и выводит отладочную информацию в отдельное десктопное приложение. Пример: ray($user); ray($order)->blue(); ray()->showQueries(); Ты можешь: - выводить переменные без прерывания скрипта; - смотреть SQL-запросы в реальном времени; - использовать цветовые метки, чтобы различать вывод из разных участков кода. ⚙️ Установка composer require spatie/laravel-ray --dev И по желанию установить десктоп-приложение с сайта Spatie. В config/ray.php можно кастомизировать поведение: включать Ray только на dev-среде, логировать только определённые запросы и т.д. 🧠 Совет от себя Ray особенно хорошо заходит, когда работаешь в команде — ты можешь добавить временный ray()-лог, не ломая исполнение и не мешая другим. Пробовали Ray? Или у вас есть свои инструменты для отладки — может, кастомные макросы или трейты? Делитесь в комментах 👇 📲 Мы в MAX 👉 @php_lib
444
10
.🛠 Как логировать SQL-запросы только при ошибках Часто сталкиваюсь с ситуацией: ошибка 500 в проде, а что именно пошло не так — неясно. Особенно если это была ошибка в SQL-запросе. Логировать все SQL-запросы — слишком жирно и шумно. Но логировать только при исключениях — вот это огонь! 🔍 Решение Добавьте следующий сниппет в AppServiceProvider: use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; public function boot() { DB::listen(function ($query) { if (app()->bound('exception.logged')) { Log::channel('sql')->debug($query->sql, $query->bindings); } }); app()->singleton('exception.logged', function () { return true; }); app()->error(function (\Throwable $e) { app()->instance('exception.logged', true); }); } 🔐 Пояснение - При каждом SQL-запросе мы проверяем, был ли в этом запросе выброшен exception. - Если да — логируем SQL. - Используем отдельный лог-канал sql, чтобы не засорять основной laravel.log. 👉 Создайте в config/logging.php канал sql, направьте его в отдельный файл, например storage/logs/sql.log. Теперь, если в продакшене будет падение — вы увидите какой SQL-запрос был выполнен перед ошибкой. Это невероятно ускоряет диагностику багов. 📲 Мы в MAX 👉 @php_lib
544
11
Сегодня я покажу вам, как я упростил настройку и запуск 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. 📲 Мы в MAX 👉 @php_lib
545
12
Сегодня покажу вам простой, но очень удобный приём, который помогает наводить порядок в больших 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, но я использую это везде, даже в маленьких проектах без фреймворков. Такие объекты делают код чище, устойчивее и легче читаемым. Попробуйте в одном из ваших проектов заменить массивы объектов на такие коллекции — и вы удивитесь, как стало лучше. 📲 Мы в MAX 👉 @php_lib
519
13
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы
375
14
Сегодня покажу вам простую, но мощную технику, которая может прокачать ваш PHP-код — Value Object вместо простых типов. Мы часто передаём параметры как 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. Да, это чуть больше кода. Но это тот случай, когда "больше" — значит надёжнее. 📲 Мы в MAX 👉 @php_lib
403
15
🔄Вы используете шаблоны, запросы и конфигурации каждый день. Но понимаете ли вы, как они устроены внутри? 📅На открытом урок
🔄Вы используете шаблоны, запросы и конфигурации каждый день. Но понимаете ли вы, как они устроены внутри? 📅На открытом уроке за 60 минут разберём, как работает любой язык — и соберём свой DSL на PHP. Покажем полный конвейер: от исходного текста до результата. Вы увидите, как писать лексер, строить синтаксическое дерево и реализовывать интерпретатор. Всё — на чистом PHP, без магии и скрытых механизмов. Это даёт не просто новый навык, а понимание, как работают инструменты, которыми вы уже пользуетесь: шаблонизаторы, запросы, правила. И как создавать собственные решения под задачи бизнеса — без хардкода и сложных обходных путей. 💡Открытый урок проходит в преддверии старта курса «PHP-разработчик. Продвинутый уровень» 29 апреля в 20:00 МСК. Регистрация: https://vk.cc/cX0ExN Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
375
16
Как бороться с «загадочными» багами в 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 помогут ловить ошибки раньше, чем их заметят пользователи. 📲 Мы в MAX 👉 @php_lib
388
17
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы
423
18
Symfony Workflow: конечный автомат для реализации бизнес-логики. Бесплатный урок курса «Symfony Framework» Во многих приложен
Symfony Workflow: конечный автомат для реализации бизнес-логики. Бесплатный урок курса «Symfony Framework» Во многих приложениях бизнес-логика держится на статусах: заказ создан, оплачен, отправлен, доставлен. Пока таких состояний мало, всё кажется простым. Но как только процесс растёт, цепочки 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
410
19
Оптимизация 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-код, снизить нагрузку на базу данных и сделать сайт более отзывчивым. 📲 Мы в MAX 👉 @php_lib
442
20
🔥 Как избежать проблем с 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(), а проверяйте переменные строго! 📲 Мы в MAX 👉 @php_lib
451