❓ PDO или ORM?
PDO — для тех, кто ценит полный контроль. Пишете SQL вручную, понимаете, что происходит под капотом. Гибкость максимальна, но код засоряется повторениями, а сложные запросы становятся испытанием при развитии проекта.
ORM (Eloquent, Doctrine) — путь удобства. Работаете с объектами вместо SQL, код становится чище, а разработка быстрее. Но магия абстракции может привести к неожиданным SQL-запросам, проблемам с производительностью и сложной отладке.
💬 Вы за прозрачность и контроль или удобство и скорость разработки? Какой путь выбираете вы?
Библиотека пхпшника (https://t.me/phpproglib) #междусобойчик
PDO — для тех, кто ценит полный контроль. Пишете SQL вручную, понимаете, что происходит под капотом. Гибкость максимальна, но код засоряется повторениями, а сложные запросы становятся испытанием при развитии проекта.
ORM (Eloquent, Doctrine) — путь удобства. Работаете с объектами вместо SQL, код становится чище, а разработка быстрее. Но магия абстракции может привести к неожиданным SQL-запросам, проблемам с производительностью и сложной отладке.
💬 Вы за прозрачность и контроль или удобство и скорость разработки? Какой путь выбираете вы?
Библиотека пхпшника (https://t.me/phpproglib) #междусобойчик
🥱6
🐘 Оживляем веб-сервисы: разработка автономных AI-агентов на промышленном уровне
В 2026 году AI-агенты — это не только чаты, но и автоматизация браузеров, работа с
📚 В программе курса:
— управление браузером: новый модуль по автоматизации действий и визуальным подтверждениям;
—
— экономика процесса: считаем токены, управляем кэшем и снижаем затраты на
— закон и порядок: как развернуть AI-решение, не нарушая
Доступ к вводным лекциям вы получите сразу — начинайте подготовку уже сегодня.
⏳ Специальные условия до 28 февраля:
— введите промокод
— участвуйте в **акции «3 курса по цене 1» — два дополнительных курса в подарок.
👉 Получить доступ к курсу и подаркам
В 2026 году AI-агенты — это не только чаты, но и автоматизация браузеров, работа с
legacy-интерфейсами и умный поиск по документам. Мы обновили курс, чтобы вы могли строить полноценные системы, а не просто дёргать API.📚 В программе курса:
— управление браузером: новый модуль по автоматизации действий и визуальным подтверждениям;
—
RAG высокого уровня: как заставить агента искать информацию в таблицах и сканах;— экономика процесса: считаем токены, управляем кэшем и снижаем затраты на
LLM;— закон и порядок: как развернуть AI-решение, не нарушая
152-ФЗ.Доступ к вводным лекциям вы получите сразу — начинайте подготовку уже сегодня.
⏳ Специальные условия до 28 февраля:
— введите промокод
Agent для получения скидки 10 000 рублей**; — участвуйте в **акции «3 курса по цене 1» — два дополнительных курса в подарок.
👉 Получить доступ к курсу и подаркам
⌛️ Как настроить production-ready логирование в PHP
Логи в проде — это не просто error_log(). Это структурированные данные, correlation ID, асинхронная запись и ротация. Разбираем пошаговую настройку.
1️⃣ Выбираем стек: Monolog
PHP де-факто стандарт для логирования — Monolog. Устанавливаем через Composer:
Если на Laravel, уже есть из коробки. Если нет, то подключаем вручную.
2️⃣ Базовая конфигурация с JSON-форматом
JSON-формат удобен для парсинга в ELK / Grafana Loki.
3️⃣ Добавляем Correlation ID
Трекаем каждый запрос через Processor:
Теперь каждая строка лога привязана к конкретному запросу.
4️⃣ Ротация и лимиты
Для ограничения по размеру связываем с logrotate на уровне системы:
5️⃣ Асинхронная запись
PHP синхронный по природе, но можно буферизовать тяжёлые хендлеры:
Буферизуем записи и сбрасываем пачкой → меньше I/O операций.
6️⃣ Интеграция с мониторингом
Отправляем в Graylog через GELF:
Или напрямую в Telegram для критических ошибок. Отдельный хендлер, 5 минут работы.
📌 Итог
Monolog + JsonFormatter + CorrelationId + logrotate = логи, с которыми не стыдно идти в прод.
Библиотека пхпшника
Логи в проде — это не просто error_log(). Это структурированные данные, correlation ID, асинхронная запись и ротация. Разбираем пошаговую настройку.
PHP де-факто стандарт для логирования — Monolog. Устанавливаем через Composer:
composer require monolog/monolog
Если на Laravel, уже есть из коробки. Если нет, то подключаем вручную.
use Monolog\Logger;
use Monolog\Handler\RotatingFileHandler;
use Monolog\Formatter\JsonFormatter;
$log = new Logger('app');
$handler = new RotatingFileHandler(
__DIR__ . '/logs/application.log',
maxFiles: 30,
level: Logger::INFO
);
$handler->setFormatter(new JsonFormatter());
$log->pushHandler($handler);
JSON-формат удобен для парсинга в ELK / Grafana Loki.
Трекаем каждый запрос через Processor:
class CorrelationIdProcessor implements ProcessorInterface
{
private string $correlationId;
public function __construct()
{
$this->correlationId = $_SERVER['HTTP_X_CORRELATION_ID']
?? bin2hex(random_bytes(16));
header('X-Correlation-ID: ' . $this->correlationId);
}
public function __invoke(array $record): array
{
$record['extra']['correlation_id'] = $this->correlationId;
return $record;
}
}
$log->pushProcessor(new CorrelationIdProcessor());
Теперь каждая строка лога привязана к конкретному запросу.
$handler = new RotatingFileHandler(
filename: __DIR__ . '/logs/app.log',
maxFiles: 30,
level: Logger::WARNING,
);
Для ограничения по размеру связываем с logrotate на уровне системы:
# /etc/logrotate.d/php-app
/var/www/app/logs/*.log {
daily
rotate 30
compress
missingok
size 100M
}
PHP синхронный по природе, но можно буферизовать тяжёлые хендлеры:
use Monolog\Handler\BufferHandler;
$bufferHandler = new BufferHandler(
handler: new StreamHandler('logs/app.log'),
bufferSize: 100,
flushOnOverflow: true
);
$log->pushHandler($bufferHandler);
Буферизуем записи и сбрасываем пачкой → меньше I/O операций.
Отправляем в Graylog через GELF:
use Monolog\Handler\GelfHandler;
use Gelf\Publisher;
use Gelf\Transport\UdpTransport;
$publisher = new Publisher(
new UdpTransport('logstash.example.com', 12201)
);
$log->pushHandler(new GelfHandler($publisher));
Или напрямую в Telegram для критических ошибок. Отдельный хендлер, 5 минут работы.
Monolog + JsonFormatter + CorrelationId + logrotate = логи, с которыми не стыдно идти в прод.
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥2❤1
⌨️ Топ-вакансий по PHP за неделю
PHP-разработчик — от 150 000 до 200 000 ₽ — удалёнка, гибрид (Москва)
PHP Developer FinTech — от 200 000 ₽ — гибрид (Санкт-Петербург)
Backend разработчик — от 480 000 ₽ — удалёнка
➡️ Еще больше топовых вакансий — в нашем канале PHP Jobs
PHP-разработчик — от 150 000 до 200 000 ₽ — удалёнка, гибрид (Москва)
PHP Developer FinTech — от 200 000 ₽ — гибрид (Санкт-Петербург)
Backend разработчик — от 480 000 ₽ — удалёнка
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
За год мы провели три потока курса по ИИ-агентам, а теперь запускаем масштабное обновление!
В новом, четвёртом потоке мы учли все пожелания студентов, добавили большой блок про
В программе:
— интеграция агентов с инструментами и базами данных по протоколу
— оркестрация в
— продвинутый
— контроль экономики агентов: маршрутизация и кеширование запросов;
— развёртывание локальных опенсорс-моделей с соблюдением 152-ФЗ.
В честь старта продаж действует спецпредложение: 3 курса по цене 1 (два дополнительных курса в подарок).
Доступ к материалам для предварительной подготовки откроется сразу после оплаты.
По промокоду
👉 Присоединиться к четвёртому потоку и вывести агентов в прод
В новом, четвёртом потоке мы учли все пожелания студентов, добавили большой блок про
AgentOps и сместили фокус с базовых концепций на суровый инжиниринг. Интегрировать LLM в веб-проект по API легко, а вот сделать так, чтобы бэкенд не отваливался от галлюцинаций нейросети, а агент не сливал бюджет — задача со звёздочкой.В программе:
— интеграция агентов с инструментами и базами данных по протоколу
MCP;— оркестрация в
LangGraph: механизм time-travel и обработка ошибок;— продвинутый
RAG для продакшена и парсинг сложных документов;— контроль экономики агентов: маршрутизация и кеширование запросов;
— развёртывание локальных опенсорс-моделей с соблюдением 152-ФЗ.
В честь старта продаж действует спецпредложение: 3 курса по цене 1 (два дополнительных курса в подарок).
Доступ к материалам для предварительной подготовки откроется сразу после оплаты.
По промокоду
Agent забирайте скидку 10 000 ₽ (89 000 ₽ вместо 99 000 ₽). Успейте занять место до 28 февраля!👉 Присоединиться к четвёртому потоку и вывести агентов в прод
🥱2
🔧 Фишка PHP
array_walk_recursive + замыкание — обходим вложенные массивы без рекурсии вручную.
Часто видишь код, где разработчик пишет свою рекурсивную функцию для обхода многомерного массива. Но PHP уже давно умеет это из коробки.
Почему это удобно:
— Не нужно писать свой рекурсивный обход
— Работает с любой глубиной вложенности
— Передача по ссылке (&$value) позволяет менять данные на месте
Где применяется на практике:
— Санитизация входящих данных из форм / API
— Нормализация конфигов
— Очистка данных перед валидацией
💡 Помни: array_walk_recursive пропускает ключи-массивы и заходит внутрь — то есть колбэк вызывается только для скалярных значений. Это поведение стоит учитывать, если тебе нужно обрабатывать и промежуточные узлы.
Библиотека пхпшника
array_walk_recursive + замыкание — обходим вложенные массивы без рекурсии вручную.
Часто видишь код, где разработчик пишет свою рекурсивную функцию для обхода многомерного массива. Но PHP уже давно умеет это из коробки.
$data = [
'name' => ' John ',
'address' => [
'city' => ' Berlin ',
'zip' => ' 10115 ',
],
];
array_walk_recursive($data, function (&$value) {
if (is_string($value)) {
$value = trim($value);
}
});
// Все строки на любом уровне вложенности — обрезаны
Почему это удобно:
— Не нужно писать свой рекурсивный обход
— Работает с любой глубиной вложенности
— Передача по ссылке (&$value) позволяет менять данные на месте
Где применяется на практике:
— Санитизация входящих данных из форм / API
— Нормализация конфигов
— Очистка данных перед валидацией
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2🔥1
🐘 PHP для начинающих (и напоминание для опытных)
🔹 Область видимости переменных (Variable Scope)
Одна из вещей, которая поначалу ставит в тупик.
В PHP у каждой функции своя область видимости. Она не видит глобальные переменные в отличие от многих других языков.
🔹 Как получить доступ к глобальной переменной
Через ключевое слово global:
Или через суперглобальный массив $GLOBALS:
🔹 Статические переменные
Если нужно, чтобы переменная «помнила» своё значение между вызовами функции, используй static:
Без static каждый раз было бы 1.
🔹 Что важно помнить
→ Глобальные переменные внутри функций — не лучшая практика. Лучше передавать данные через аргументы.
→ static — удобно для счётчиков, кешей внутри функции, рекурсии.
→ В замыканиях (Closure) переменные захватываются через use:
Библиотека пхпшника
#php_азбука
🔹 Область видимости переменных (Variable Scope)
Одна из вещей, которая поначалу ставит в тупик.
Почему переменная есть снаружи, но не видна внутри функции?
$name = 'Alice';
function greet() {
echo $name; // ⚠️ Undefined variable!
}
В PHP у каждой функции своя область видимости. Она не видит глобальные переменные в отличие от многих других языков.
🔹 Как получить доступ к глобальной переменной
Через ключевое слово global:
php
$name = 'Alice';
function greet() {
global $name;
echo $name; // Alice ✅
}
Или через суперглобальный массив $GLOBALS:
php
function greet() {
echo $GLOBALS['name']; // Alice ✅
}
🔹 Статические переменные
Если нужно, чтобы переменная «помнила» своё значение между вызовами функции, используй static:
function counter() {
static $count = 0;
$count++;
echo $count;
}
counter(); // 1
counter(); // 2
counter(); // 3Без static каждый раз было бы 1.
🔹 Что важно помнить
→ Глобальные переменные внутри функций — не лучшая практика. Лучше передавать данные через аргументы.
→ static — удобно для счётчиков, кешей внутри функции, рекурсии.
→ В замыканиях (Closure) переменные захватываются через use:
$name = 'Alice';
$greet = function() use ($name) {
echo $name; // Alice ✅
};
Библиотека пхпшника
#php_азбука
🥱10👍6🔥2😢1
Не все знают, что array_filter() без второго аргумента убирает все «пустые» значения автоматически:
php
$data = [0, '', null, false, 'hello', 42, [], 'world'];
$result = array_filter($data);
// ['hello', 42, 'world']
Удалит: 0, '', null, false, []
Оставит: всё, что приводится к true
Используй это для очистки данных формы или фильтрации результатов из БД перед обработкой.
Библиотека пхпшника
#vardump
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥1
Последний шанс: 3 курса по цене 1 и запуск AI-агентов в продакшн
Писать контроллеры на
В обновлённой программе фокус смещён на инжиниринг и вывод ИИ-фич в прод. Вы изучите архитектуру ReAct-циклов, интеграцию оркестраторов вроде
Почему нельзя откладывать:
— масштабная акция «3 курса по цене 1» сгорит уже завтра;
— промокод
— сразу после оформления открываются материалы для подготовки — начать учиться можно прямо сейчас.
Забронировать место на курсе и забрать бонусы до 28 февраля
Писать контроллеры на
Laravel — привычно, но бизнесу нужна умная автоматизация. Как обогатить бэкенд мультиагентными системами, контролировать затраты на внешние API и работать по 152-ФЗ?В обновлённой программе фокус смещён на инжиниринг и вывод ИИ-фич в прод. Вы изучите архитектуру ReAct-циклов, интеграцию оркестраторов вроде
LangGraph, продвинутый RAG, стандарты MCP и AgentOps. Все ключевые навыки в одном месте: измеримость, time-travel дебаггинг, стабильная структурная генерация JSON, human-in-the-loop и интеграция агентов с легаси-системами.Почему нельзя откладывать:
— масштабная акция «3 курса по цене 1» сгорит уже завтра;
— промокод
Agent на скидку 10 000 рублей действует последние часы;— сразу после оформления открываются материалы для подготовки — начать учиться можно прямо сейчас.
Забронировать место на курсе и забрать бонусы до 28 февраля
Phiki помогает подсветить синтаксис. Написан на PHP. Он использует файлы грамматики TextMate и темы Visual Studio Code для генерации кода с подсветкой синтаксиса для веба.
Название и публичный API Phiki во многом вдохновлены Shiki — пакетом, который делает примерно то же самое в экосистеме JavaScript. Реализация пакета также во многом вдохновлена vscode-textmate — мощным пакетом, лежащим в основе Visual Studio Code, Shiki и других инструментов.
Библиотека пхпшника
#инструменты
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🎉2🔥1
Forwarded from Библиотека задач по PHP | тесты, код, задания
Что напечатает код $str = 'a\\b\n'; echo $str;
Anonymous Quiz
5%
ab(перенос строки)
34%
a\b(перенос строки)
14%
a\b\n
10%
a\\b(перенос строки)
37%
a\\b\n
🔥5👍2🌚2❤1
Да, PHP умирает... уже 20 лет, а зарплаты всё растут. Но готов ли ты к роли кофаундера? 🚀
Пока эксперты хоронят стек, Proglib App строит будущее EdTech-платформы. Это экосистема с квизами, курсами и ИИ-тьюторами. MVP в проде, юзеры на борту, и проекту нужен технический лидер, готовый взять на себя архитектуру.
Это шанс выйти за рамки привычного бэкенда и стать партнёром в амбициозном продукте.
🛠️ Стек (без legacy-боли):
React 18, TypeScript, Vite, Express 5, PostgreSQL, Drizzle ORM.
Твои задачи:
• Проектировать масштабируемую архитектуру и пилить фичи. • Рефакторить, писать тесты и делать качественное код-ревью. • Работать автономно в связке с основателем.
Идеальный мэтч, если:
• Уверенно владеешь TS, React и Node.js (или готов быстро пересесть). • Используешь Claude Code и Cursor для ускорения разработки. • Бонус: опыт создания ИИ-агентов и интерес к обучению.
Удалёнка, гибкий график, отсутствие бюрократии.
Готов делать продукт, которым будут пользоваться тысячи коллег? Пиши о себе и кидай GitHub 👇
Пока эксперты хоронят стек, Proglib App строит будущее EdTech-платформы. Это экосистема с квизами, курсами и ИИ-тьюторами. MVP в проде, юзеры на борту, и проекту нужен технический лидер, готовый взять на себя архитектуру.
Это шанс выйти за рамки привычного бэкенда и стать партнёром в амбициозном продукте.
🛠️ Стек (без legacy-боли):
React 18, TypeScript, Vite, Express 5, PostgreSQL, Drizzle ORM.
Твои задачи:
• Проектировать масштабируемую архитектуру и пилить фичи. • Рефакторить, писать тесты и делать качественное код-ревью. • Работать автономно в связке с основателем.
Идеальный мэтч, если:
• Уверенно владеешь TS, React и Node.js (или готов быстро пересесть). • Используешь Claude Code и Cursor для ускорения разработки. • Бонус: опыт создания ИИ-агентов и интерес к обучению.
Удалёнка, гибкий график, отсутствие бюрократии.
Готов делать продукт, которым будут пользоваться тысячи коллег? Пиши о себе и кидай GitHub 👇
❤4😁4🥱1
💡 Используй array_map + array_filter с null колбэком для мультимерного flatten
Не городи рекурсию там, где достаточно одной строки через SPL или array_merge(...array_map(...)):
Но вот где реальная магия — когда нужно flatten + filter за раз:
⚠️ Ловушки
— array_merge(...$matrix) упадёт с ошибкой на пустом массиве [].
— Работает только для одного уровня вложенности.
📦 В продакшене это спасает при обработке сгруппированных результатов из БД, когда ORM отдаёт Collection[] и нужно быстро схлопнуть в плоский список.
Библиотека пхпшника
#vardump
Не городи рекурсию там, где достаточно одной строки через SPL или array_merge(...array_map(...)):
$matrix = [[1, 2, 3], [4, 5], [6]];
// ❌ Цикл или рекурсия
$result = [];
foreach ($matrix as $row) {
foreach ($row as $item) {
$result[] = $item;
}
}
// ✅ Одна строка
$result = array_merge(...$matrix);
// [1, 2, 3, 4, 5, 6]
Но вот где реальная магия — когда нужно flatten + filter за раз:
$data = [[1, 0, 2], [null, 3], [false, 4, '']];
$result = array_values(
array_filter(
array_merge(...$data)
)
);
// [1, 2, 3, 4]
— array_merge(...$matrix) упадёт с ошибкой на пустом массиве [].
— Работает только для одного уровня вложенности.
📦 В продакшене это спасает при обработке сгруппированных результатов из БД, когда ORM отдаёт Collection[] и нужно быстро схлопнуть в плоский список.
Библиотека пхпшника
#vardump
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2🔥1😁1🥱1
⏳ Как устроена типизация в PHP 8.x?
PHP долго был языком с динамической типизацией и репутацией «всё приведётся само». Начиная с PHP 7, а особенно с версий 8.0–8.3, система типов стала по-настоящему выразительной.
🔍 Что появилось и зачем
🔹 Union Types (8.0)
Тип может быть одним из нескольких:
Раньше это документировали только в PHPDoc и надеялись на лучшее.
🔹 mixed, never, void
▪️ mixed — явно говорит "любой тип", в отличие от отсутствия типа
▪️ never — функция никогда не вернёт управление (бросает исключение или завершает процесс)
▪️ void — функция ничего не возвращает
🔹 Intersection Types (8.1)
Значение должно реализовывать все указанные интерфейсы одновременно:
Полезно при работе с коллекциями и DTO, которые соответствуют нескольким контрактам.
🔹 Enums (8.1)
Наконец-то нативные перечисления вместо констант в классах:
Теперь нельзя передать произвольную строку туда, где ожидается Status.
🔹 Readonly properties (8.1) и readonly классы (8.2)
В 8.2 можно пометить весь класс как readonly — все свойства автоматически становятся иммутабельными. Отлично подходит для Value Objects и DTO.
🔹 DNF Types — Disjunctive Normal Form (8.2)
Комбинация union и intersection:
Тип читается как: "реализует оба интерфейса, либо null".
🔹 typed class constants (8.3)
До 8.3 константы классов не имели типов — теперь контракт полный.
⚠️ Нюансы
— declare(strict_types=1) обязателен, иначе PHP будет тихо приводить типы и "5" пройдёт там, где ожидается int
— Intersection types не работают с примитивами только с интерфейсами и классами
— readonly нельзя применить к static свойствам
— Enums не поддерживают наследование
Библиотека пхпшника
PHP долго был языком с динамической типизацией и репутацией «всё приведётся само». Начиная с PHP 7, а особенно с версий 8.0–8.3, система типов стала по-настоящему выразительной.
🔹 Union Types (8.0)
Тип может быть одним из нескольких:
function process(int|string $id): User|null {
// ...
}Раньше это документировали только в PHPDoc и надеялись на лучшее.
🔹 mixed, never, void
▪️ mixed — явно говорит "любой тип", в отличие от отсутствия типа
▪️ never — функция никогда не вернёт управление (бросает исключение или завершает процесс)
▪️ void — функция ничего не возвращает
function redirect(string $url): never {
header("Location: $url");
exit();
}🔹 Intersection Types (8.1)
Значение должно реализовывать все указанные интерфейсы одновременно:
function process(Serializable&Countable $data): void {
// ...
}Полезно при работе с коллекциями и DTO, которые соответствуют нескольким контрактам.
🔹 Enums (8.1)
Наконец-то нативные перечисления вместо констант в классах:
enum Status: string {
case Active = 'active';
case Inactive = 'inactive';
}
function setStatus(Status $status): void { ... }Теперь нельзя передать произвольную строку туда, где ожидается Status.
🔹 Readonly properties (8.1) и readonly классы (8.2)
class User {
public function __construct(
public readonly int $id,
public readonly string $name,
) {}
}В 8.2 можно пометить весь класс как readonly — все свойства автоматически становятся иммутабельными. Отлично подходит для Value Objects и DTO.
🔹 DNF Types — Disjunctive Normal Form (8.2)
Комбинация union и intersection:
function handle(Countable&Iterator|null $collection): void {
// ...
}Тип читается как: "реализует оба интерфейса, либо null".
🔹 typed class constants (8.3)
class Config {
const string VERSION = '1.0.0';
const int MAX_RETRIES = 3;
}До 8.3 константы классов не имели типов — теперь контракт полный.
— declare(strict_types=1) обязателен, иначе PHP будет тихо приводить типы и "5" пройдёт там, где ожидается int
— Intersection types не работают с примитивами только с интерфейсами и классами
— readonly нельзя применить к static свойствам
— Enums не поддерживают наследование
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤3🔥2
Forwarded from Библиотека собеса по PHP | вопросы с собеседований
Fiber — примитив для кооперативной многозадачности. Позволяет приостановить выполнение функции в произвольной точке через Fiber::suspend() и возобновить позже, передав значение обратно.
Главное отличие от async/await: Fibers не заражают сигнатуры. В JS как только где-то await — вся цепочка выше должна быть async. В PHP Fiber::suspend() можно вызвать на любой глубине стека, не меняя сигнатуры вызывающих функций.
Второе отличие — Fibers это низкоуровневый примитив, event loop в них не встроен. Сами по себе они не дают параллелизма — это строительный блок, поверх которого ReactPHP, Revolt и Amp строят настоящую неблокирующую конкурентность.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍2❤1
Иногда пишу нейронке «спасибо»
А вы как? Благодарите после удачного ответа или общаетесь с ИИ как с микроволновкой?
#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8😁5🔥1
🔥 PDO vs MySQLi
Каждый рано или поздно задаёт себе вопрос:
Чаще всего ответ → «так исторически сложилось». Но давай разберём более делательно.
🔹 MySQLi — быстрый, но привязанный
Работает только с MySQL/MariaDB. Зато даёт нативные async-запросы через mysqli_poll(), что редкость, но иногда критично.
Синтаксис bind_param с типами — это боль при большом числе параметров.
🔹 PDO — абстракция с характером
Поддерживает 12+ драйверов: MySQL, PostgreSQL, SQLite, MSSQL, и др. Именованные плейсхолдеры — читаемость на уровне:
Одна нотация везде. Смена БД без переписывания логики запросов.
📊 Что реально важно на проекте
Смена БД когда-либо → PDO (без вариантов)
Legacy MySQL-проект → MySQLi уже там, не трогай
Нужен fetchAll в объекты → PDO::FETCH_CLASS чище
Производительность → разница < 1%, забудь
💡 Вердикт
MySQLi — это не "плохо". Это инструмент под конкретный стек.
Но если ты стартуешь проект с нуля или пишешь библиотеку, то лучше PDO. Любой ORM (Doctrine, Eloquent) под капотом использует именно его.
🐸 Библиотека пхпшника
#элементарный_выбор
Каждый рано или поздно задаёт себе вопрос:
«А почему мы вообще используем именно это?»
Чаще всего ответ → «так исторически сложилось». Но давай разберём более делательно.
🔹 MySQLi — быстрый, но привязанный
Работает только с MySQL/MariaDB. Зато даёт нативные async-запросы через mysqli_poll(), что редкость, но иногда критично.
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();Синтаксис bind_param с типами — это боль при большом числе параметров.
🔹 PDO — абстракция с характером
Поддерживает 12+ драйверов: MySQL, PostgreSQL, SQLite, MSSQL, и др. Именованные плейсхолдеры — читаемость на уровне:
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id AND role = :role");
$stmt->execute(['id' => $id, 'role' => $role]);Одна нотация везде. Смена БД без переписывания логики запросов.
📊 Что реально важно на проекте
Смена БД когда-либо → PDO (без вариантов)
Legacy MySQL-проект → MySQLi уже там, не трогай
Нужен fetchAll в объекты → PDO::FETCH_CLASS чище
Производительность → разница < 1%, забудь
MySQLi — это не "плохо". Это инструмент под конкретный стек.
Но если ты стартуешь проект с нуля или пишешь библиотеку, то лучше PDO. Любой ORM (Doctrine, Eloquent) под капотом использует именно его.
#элементарный_выбор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2❤1😢1