Openssl pkey free: примеры (PHP)
openssl_pkey_free(OpenSSLAsymmetricKey $key): voidФункция openssl_pkey_free
Функция openssl_pkey_free() освобождает память, занимаемую ресурсом закрытого ключа. Её применение актуально для PHP версий ниже 8.0.
Основная задача функции — явное освобождение ресурсов, связанных с приватным ключом, сгенерированным функциями вроде openssl_pkey_new(). Это помогает управлять памятью в длительных скриптах, где создается много ключей.
Функция принимает один обязательный параметр:
openssl_pkey_free(resource $key): void
- $key — ресурс приватного ключа, который требуется освободить.
Примеры использования
Базовый пример создания и освобождения ключа.
$config = array(
"digest_alg" => "sha256",
"private_key_bits" => 2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);
// Генерация нового ключа
$res = openssl_pkey_new($config);
// Проверка успешности создания
if ($res !== false) {
echo "Ключ создан успешно.\n";
// Освобождение ресурса ключа
openssl_pkey_free($res);
echo "Ресурс ключа освобожден.\n";
} else {
echo "Ошибка при создании ключа.\n";
}
Ключ создан успешно.
Ресурс ключа освобожден.Похожие функции в PHP
В современных версиях PHP (8.0 и выше) явный вызов openssl_pkey_free() не требуется. Система сборки мусора автоматически освобождает ресурсы, когда на них не остаётся ссылок.
Для освобождения памяти можно использовать функцию unset(), которая удаляет переменную, содержащую ресурс. Это приводит к автоматическому освобождению ресурса, если на него больше нет ссылок.
$res = openssl_pkey_new(['private_key_bits' => 2048]);
// Работа с ключом
unset($res); // Ресурс будет освобожденТипичные ошибки
Передача в функцию значения, которое не является ресурсом, приводит к ошибке типа.
$not_a_resource = 'some string';
// Это вызовет ошибку в PHP < 8.0
openssl_pkey_free($not_a_resource);
Warning: openssl_pkey_free() expects parameter 1 to be resource, string given
Попытка использовать ресурс после его освобождения приводит к неопределенному поведению.
$res = openssl_pkey_new(['private_key_bits' => 2048]);
openssl_pkey_free($res);
// Попытка экспортировать ключ после освобождения
openssl_pkey_export($res, $key);
Предупреждение или ошибка в зависимости от версии PHPИзменения в версиях PHP
Функция openssl_pkey_free() была объявлена устаревшей. Её вызов вызывает предупреждение E_DEPRECATED. Причина — переход от ресурсов к объектам для представления ключей. Объекты управляются сборщиком мусора автоматически.
Функция полностью удалена из ядра PHP. Любая попытка её вызова приведёт к фатальной ошибке.
Расширенные примеры
Пример управления памятью при массовой генерации ключей в старых версиях PHP.
for ($i = 0; $i < 1000; $i++) {
$key = openssl_pkey_new([
"private_key_bits" => 2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
]);
if ($key === false) {
continue;
}
// Выполнение операций с ключом
openssl_pkey_export($key, $pem);
// Явное освобождение ресурса в каждой итерации
openssl_pkey_free($key);
unset($pem);
}
Освобождение ресурсов для ключей разных алгоритмов, таких как RSA и EC.
// Генерация RSA ключа
$rsaKey = openssl_pkey_new([
"private_key_type" => OPENSSL_KEYTYPE_RSA,
"private_key_bits" => 4096,
]);
// Генерация EC ключа (требует поддержки в системе)
$ecConfig = [
"private_key_type" => OPENSSL_KEYTYPE_EC,
"curve_name" => "prime256v1",
];
$ecKey = openssl_pkey_new($ecConfig);
if ($rsaKey !== false) {
openssl_pkey_free($rsaKey);
echo "RSA ключ освобожден.\n";
}
if ($ecKey !== false) {
openssl_pkey_free($ecKey);
echo "EC ключ освобожден.\n";
}Альтернативы в других языках
Openssl pkey free в Python
В Python используется автоматическое управление памятью. Объекты ключей из библиотеки cryptography уничтожаются сборщиком мусора.
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
# Генерация ключа
private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
# ... использование ключа
# Явного освобождения не требуется, объект удалится при выходе из области видимости
del private_key
В Node.js объекты ключей также управляются сборщиком мусора. Явного освобождения не предусмотрено.
const crypto = require('crypto');
// Генерация ключевой пары
const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', {
modulusLength: 2048,
});
// ... использование ключа
// При присвоении null или выходе из области видимости память освобождается
delete privateKey;