Web Мастерская
Прощание с eval(): Как переписать код и спать спокойно
Функция
Хорошая новость: в 95% случаев можно найти безопасную альтернативу без потери функционала.

Проблема: Пользователь вводит формулу скидки, например
Решение 1: Библиотеки парсинга выражений
Вместо выполнения кода, разберите его синтаксис.
...
eval() — это попытка интерпретатора PHP выполнить произвольную строку как программный код. Это швейцарский нож, у которого вместо лезвия — циркулярная пила. Она удобна для написания «умных» конфигураций или динамических правил, но делает ваш проект уязвимым к RCE-атакам (Remote Code Execution) и невозможным для статического анализа инструментами вроде Psalm или PHPStan.Хорошая новость: в 95% случаев можно найти безопасную альтернативу без потери функционала.

Сценарий 1: Динамические правила и математические выражения
Проблема: Пользователь вводит формулу скидки, например
(price * quantity) - bonus. Вы используете eval("return $formula;").Решение 1: Библиотеки парсинга выражений
Вместо выполнения кода, разберите его синтаксис.
- Инструмент:
symfony/expression-languageилиnxp/math-parser. - Как работает: Эти библиотеки не исполняют код, а строят дерево операций (AST). Они понимают только математику и логику, игнорируя системные вызовы.
ВыделитьPHP
// Было (Опасно)
$result =- Жалоба
Ускоряем PHP: Как помочь интерпретатору понять код
PHP часто называют медленным языком, но проблема обычно не в самом языке, а в том, как мы его пишем. Zend Engine выполняет наш скрипт, переводя текстовый файл в байткод, а затем в машинные инструкции. Наша задача — сделать этот путь максимально коротким.
Разберем основные приемы оптимизации от простого к сложному.

Интерпретатор тратит время на поиск ключей.
Самая частая ошибка новичков — вызов функций внутри условия цикла.
Пример плохого кода:
...
Разберем основные приемы оптимизации от простого к сложному.

Избавляемся от «магических» поисков (isset vs array_key_exists)
Интерпретатор тратит время на поиск ключей.
- Плохо:
array_key_exists($key, $data). Эта функция ищет ключ по всему хэш-таблице массива. - Хорошо:
isset($data[$key]). Это языковая конструкция. Она проверяет существование переменной и то, что она не null, делая это на уровне ядра виртуальной машины гораздо быстрее.
ВыделитьPHP
// Медленно (функция)
if (array_key_exists('id', $_GET)) { ... }
// Быстро (языковая конструкция)
if (isset($_GET['id'])) { ... }Циклы: Вычисляй заранее
Самая частая ошибка новичков — вызов функций внутри условия цикла.
Пример плохого кода:
ВыделитьPHP
for ($i = 0; $i count($items); $i++) {
Установка библиотеки Imagick
Библиотека Imagick является PHP-интерфейсом к ImageMagick, мощному инструменту обработки изображений. Она позволяет разработчикам легко манипулировать изображениями прямо из PHP-кода, выполняя операции вроде изменения размера, поворота, наложения фильтров и многое другое.
Прежде всего убедитесь, что на вашем сервере установлен пакет ImageMagick. Если у вас Linux-дистрибутив, выполните следующую команду для проверки:
Если вывод команды показывает версию ImageMagick, значит, всё установлено правильно. Если же пакета нет, установите его одной из команд ниже в зависимости от вашей системы:
Ubuntu / Debian:
CentOS / RHEL:
macOS (Homebrew):
Для установки самого PHP-расширения вам потребуется компилятор и некоторые...
Проверка наличия ImageMagick
Прежде всего убедитесь, что на вашем сервере установлен пакет ImageMagick. Если у вас Linux-дистрибутив, выполните следующую команду для проверки:
ВыделитьBash
convert -versionЕсли вывод команды показывает версию ImageMagick, значит, всё установлено правильно. Если же пакета нет, установите его одной из команд ниже в зависимости от вашей системы:
Ubuntu / Debian:
ВыделитьBash
sudo apt-get update && sudo apt-get install imagemagickCentOS / RHEL:
ВыделитьBash
sudo yum install epel-release
sudo yum install ImageMagick-develmacOS (Homebrew):
ВыделитьBash
brew install imagemagickУстановка расширения PECL Imagick
Для установки самого PHP-расширения вам потребуется компилятор и некоторые...
Как хранить данные в виде массива в Базе Данных
Хранение данных в виде массива в базе данных — распространённая практика, особенно когда приходится работать с разнородными или динамическими данными. Однако традиционные реляционные базы данных (например, MySQL) не поддерживают хранение массивов напрямую. Рассмотрим лучшие практики хранения и обработки таких данных.
Допустим, у тебя есть таблица
...
Варианты хранения массивов в базе данных
- Тип данных JSON: Начиная с версии MySQL 5.7 появился тип данных JSON, позволяющий хранить массивы и объекты в виде JSON-строки. Это наиболее удобное и современное решение.
- Сериялизация: Можно сериализовать массив с помощью PHP-функций
serialize()илиjson_encode()и сохранить результат в виде строки в поле типаTEXTилиBLOB. - Нормализация: Нормализация данных подразумевает создание отдельной таблицы для хранения элементов массива. Это идеальный подход с точки зрения дизайна базы данных, но иногда неудобен в эксплуатации.
Пример использования JSON
Допустим, у тебя есть таблица
users с полем settings типа JSON:
ВыделитьSQL
CREATE TABLEКак предоставить сторонним сайтам доступ к вашим файлам для получения информации
Часто возникает потребность предоставить сторонним сайтам доступ к определенной информации, хранящейся на вашем сервере. Это может быть статистика, прайс-листы, фотографии или другие данные. Существует несколько способов сделать это, обеспечив безопасность и удобство использования.
Зачем предоставлять доступ сторонним сайтам?
- Монетизация: Продажа доступа к уникальным данным или услугам.
- Партнерство: Совместная работа с партнерами, предоставление информации о товарах или услугах.
- Повышение лояльности: Доступ к актуальной информации укрепляет доверие клиентов и партнеров.
Как это сделать?
- Использование API: Создайте RESTful API, который предоставляет доступ к информации в формате JSON или XML. Сторонние сайты могут отправлять запросы и получать данные.
- Файлы для скачивания: Поставьте файлы в общедоступную директорию или создайте защищённый доступ с помощью авторизации.
- RSS-каналы: Предоставьте RSS-канал с актуальными данными, чтобы сторонние сайты могли автоматически получать обновления.
- CDN (
