Данфа

Прощание с eval(): Как переписать код и спать спокойно

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

Хорошая новость: в 95% случаев можно найти безопасную альтернативу без потери функционала.



Сценарий 1: Динамические правила и математические выражения


Проблема: Пользователь вводит формулу скидки, например (price * quantity) - bonus. Вы используете eval("return $formula;").

Решение 1: Библиотеки парсинга выражений
Вместо выполнения кода, разберите его синтаксис.
  • Инструмент: symfony/expression-language или nxp/math-parser.
  • Как работает: Эти библиотеки не исполняют код, а строят дерево операций (AST). Они понимают только математику и логику, игнорируя системные вызовы.

// Было (Опасно)
$result =
...

Ускоряем PHP: Как помочь интерпретатору понять код

PHP часто называют медленным языком, но проблема обычно не в самом языке, а в том, как мы его пишем. Zend Engine выполняет наш скрипт, переводя текстовый файл в байткод, а затем в машинные инструкции. Наша задача — сделать этот путь максимально коротким.

Разберем основные приемы оптимизации от простого к сложному.



Избавляемся от «магических» поисков (isset vs array_key_exists)


Интерпретатор тратит время на поиск ключей.
  • Плохо: array_key_exists($key, $data). Эта функция ищет ключ по всему хэш-таблице массива.
  • Хорошо: isset($data[$key]). Это языковая конструкция. Она проверяет существование переменной и то, что она не null, делая это на уровне ядра виртуальной машины гораздо быстрее.

// Медленно (функция)
if (array_key_exists('id', $_GET)) { ... }

// Быстро (языковая конструкция)
if (isset($_GET['id'])) { ... }


Циклы: Вычисляй заранее


Самая частая ошибка новичков — вызов функций внутри условия цикла.

Пример плохого кода:
for ($i = 0; $i  count($items); $i++) {
   
...

Установка библиотеки Imagick

PHP
Библиотека Imagick является PHP-интерфейсом к ImageMagick, мощному инструменту обработки изображений. Она позволяет разработчикам легко манипулировать изображениями прямо из PHP-кода, выполняя операции вроде изменения размера, поворота, наложения фильтров и многое другое.

Проверка наличия ImageMagick


Прежде всего убедитесь, что на вашем сервере установлен пакет ImageMagick. Если у вас Linux-дистрибутив, выполните следующую команду для проверки:
convert -version

Если вывод команды показывает версию ImageMagick, значит, всё установлено правильно. Если же пакета нет, установите его одной из команд ниже в зависимости от вашей системы:

Ubuntu / Debian:
sudo apt-get update && sudo apt-get install imagemagick

CentOS / RHEL:
sudo yum install epel-release
sudo yum install ImageMagick-devel

macOS (Homebrew):
brew install imagemagick

Установка расширения PECL Imagick


Для установки самого PHP-расширения вам потребуется компилятор и некоторые...

Как хранить данные в виде массива в Базе Данных

Хранение данных в виде массива в базе данных — распространённая практика, особенно когда приходится работать с разнородными или динамическими данными. Однако традиционные реляционные базы данных (например, MySQL) не поддерживают хранение массивов напрямую. Рассмотрим лучшие практики хранения и обработки таких данных.

Варианты хранения массивов в базе данных


  1. Тип данных JSON: Начиная с версии MySQL 5.7 появился тип данных JSON, позволяющий хранить массивы и объекты в виде JSON-строки. Это наиболее удобное и современное решение.
  2. Сериялизация: Можно сериализовать массив с помощью PHP-функций serialize() или json_encode() и сохранить результат в виде строки в поле типа TEXT или BLOB.
  3. Нормализация: Нормализация данных подразумевает создание отдельной таблицы для хранения элементов массива. Это идеальный подход с точки зрения дизайна базы данных, но иногда неудобен в эксплуатации.

Пример использования JSON


Допустим, у тебя есть таблица users с полем settings типа JSON:
CREATE TABLE
...

Как предоставить сторонним сайтам доступ к вашим файлам для получения информации

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

Зачем предоставлять доступ сторонним сайтам?


  • Монетизация: Продажа доступа к уникальным данным или услугам.
  • Партнерство: Совместная работа с партнерами, предоставление информации о товарах или услугах.
  • Повышение лояльности: Доступ к актуальной информации укрепляет доверие клиентов и партнеров.

Как это сделать?


  1. Использование API: Создайте RESTful API, который предоставляет доступ к информации в формате JSON или XML. Сторонние сайты могут отправлять запросы и получать данные.
  2. Файлы для скачивания: Поставьте файлы в общедоступную директорию или создайте защищённый доступ с помощью авторизации.
  3. RSS-каналы: Предоставьте RSS-канал с актуальными данными, чтобы сторонние сайты могли автоматически получать обновления.
  4. CDN (
...