Tempnam: примеры (PHP)
tempnam(string directory, string prefix): string|falseФункция tempnam в PHP
Функция tempnam создает файл с уникальным именем, гарантируя отсутствие конфликтов. Она используется для временного хранения данных, которые должны быть изолированы от других процессов.
Функция принимает два аргумента:
- directory (строка): Путь к каталогу, где будет создан временный файл. Если указан NULL, используется системный временный каталог.
- prefix (строка): Префикс имени файла. Функция генерирует уникальную последовательность символов, добавляя её после этого префикса.
Функция возвращает путь к созданному временному файлу или false в случае ошибки.
Простые примеры использования
$tempFile = tempnam(null, 'my_prefix_');
echo $tempFile;/tmp/my_prefix_4b3403665fea6
$dir = '/var/www/temp/';
$tempFile = tempnam($dir, 'data_');
if ($tempFile) {
echo "Файл создан: " . $tempFile;
}Файл создан: /var/www/temp/data_5a1b2c3d4e
$result = tempnam('/несуществующий/каталог', 'test');
var_dump($result);bool(false)
Похожие функции в PHP
- tmpfile(): Создает временный файл, который автоматически удаляется после закрытия или завершения скрипта. Возвращает файловый указатель.
- sys_get_temp_dir(): Возвращает путь к каталогу для временных файлов.
- uniqid(): Генерирует уникальный идентификатор, который может использоваться как часть имени файла.
Выбор функции зависит от задачи. tempnam подходит для создания временных файлов с контролем расположения. tmpfile удобна для временных данных, не требующих сохранения после работы скрипта.
Типичные ошибки
$tempFile = tempnam('/root', 'test');
if ($tempFile === false) {
echo "Не удалось создать файл из-за ограничений прав доступа.";
}Не удалось создать файл из-за ограничений прав доступа.
// Префикс обрезается до первых трёх символов в некоторых системах
$tempFile = tempnam(null, 'very_long_prefix_');
echo $tempFile;/tmp/ver4b3403665fea6
$tempFile = tempnam('/недоступный_каталог', 'test');
file_put_contents($tempFile, 'данные'); // Предупреждение или ошибкаWarning: file_put_contents(): Filename cannot be empty
Изменения в версиях PHP
- PHP 7.1.0: Функция стала возвращать false при неудаче, ранее могла генерироваться ошибка уровня E_WARNING.
- PHP 8.0.0: Поведение функции осталось стабильным, без существенных изменений.
В последних версиях PHP рекомендации по обработке ошибок стали строже, что требует более внимательной проверки возвращаемого значения.
Расширенные примеры
$tempFile = tempnam(sys_get_temp_dir(), 'json_');
if ($tempFile) {
$data = ['key' => 'value'];
file_put_contents($tempFile, json_encode($data));
$content = file_get_contents($tempFile);
echo $content;
unlink($tempFile); // Удаление файла
}{"key":"value"}$uploadedFile = $_FILES['file']['tmp_name'] ?? null;
if ($uploadedFile) {
$safeTempFile = tempnam(sys_get_temp_dir(), 'upload_');
move_uploaded_file($uploadedFile, $safeTempFile);
// Дальнейшая обработка безопасного временного файла
}$tempFile = tempnam(sys_get_temp_dir(), 'dir_');
if ($tempFile) {
unlink($tempFile); // Удаляем файл
mkdir($tempFile); // Создаём каталог с тем же именем
echo "Создан каталог: " . $tempFile;
}Создан каталог: /tmp/dir_5a1b2c3d4e
// tempnam гарантирует уникальность имени даже при параллельных вызовах
$files = [];
for ($i = 0; $i < 5; $i++) {
$files[] = tempnam(null, 'parallel_');
}
print_r($files);Array
(
[0] => /tmp/parallel_4b3403665fea6
[1] => /tmp/parallel_4b3403665fea7
[2] => /tmp/parallel_4b3403665fea8
[3] => /tmp/parallel_4b3403665fea9
[4] => /tmp/parallel_4b3403665feaa
)Аналоги в других языках
import tempfile
temp_file = tempfile.NamedTemporaryFile(delete=False)
print(temp_file.name)
temp_file.close()/tmp/tmp9z4q3q1v
const fs = require('fs');
const path = require('path');
const tempDir = require('os').tmpdir();
const tempPath = path.join(tempDir, 'prefix-' + Math.random().toString(36).slice(2));
fs.writeFileSync(tempPath, '');
console.log(tempPath);/tmp/prefix-abc123def
CREATE TEMPORARY TABLE temp_data (id INT, value VARCHAR(255));Основное отличие от PHP: в Python и Node.js часто используются высокоуровневые API, управляющие временными файлами более комплексно, включая автоматическое удаление.