Tempnam: примеры (PHP)

Работа с временными файлами через tempnam
Раздел: Работа с файловой системой
tempnam(string directory, string prefix): string|false

Функция tempnam в PHP

Функция tempnam создает файл с уникальным именем, гарантируя отсутствие конфликтов. Она используется для временного хранения данных, которые должны быть изолированы от других процессов.

Аргументы функции

Функция принимает два аргумента:

  • directory (строка): Путь к каталогу, где будет создан временный файл. Если указан NULL, используется системный временный каталог.
  • prefix (строка): Префикс имени файла. Функция генерирует уникальную последовательность символов, добавляя её после этого префикса.

Функция возвращает путь к созданному временному файлу или false в случае ошибки.

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

Пример 1: Создание файла в системном каталоге
$tempFile = tempnam(null, 'my_prefix_');
echo $tempFile;
/tmp/my_prefix_4b3403665fea6
Пример 2: Файл в указанной директории
$dir = '/var/www/temp/';
$tempFile = tempnam($dir, 'data_');
if ($tempFile) {
    echo "Файл создан: " . $tempFile;
}
Файл создан: /var/www/temp/data_5a1b2c3d4e
Пример 3: Обработка ошибки создания
$result = tempnam('/несуществующий/каталог', 'test');
var_dump($result);
bool(false)

Похожие функции в PHP

  • tmpfile(): Создает временный файл, который автоматически удаляется после закрытия или завершения скрипта. Возвращает файловый указатель.
  • sys_get_temp_dir(): Возвращает путь к каталогу для временных файлов.
  • uniqid(): Генерирует уникальный идентификатор, который может использоваться как часть имени файла.

Выбор функции зависит от задачи. tempnam подходит для создания временных файлов с контролем расположения. tmpfile удобна для временных данных, не требующих сохранения после работы скрипта.

Типичные ошибки

Ошибка 1: Неправильные права доступа к каталогу
$tempFile = tempnam('/root', 'test');
if ($tempFile === false) {
    echo "Не удалось создать файл из-за ограничений прав доступа.";
}
Не удалось создать файл из-за ограничений прав доступа.
Ошибка 2: Использование некорректного префикса
// Префикс обрезается до первых трёх символов в некоторых системах
$tempFile = tempnam(null, 'very_long_prefix_');
echo $tempFile;
/tmp/ver4b3403665fea6
Ошибка 3: Игнорирование возвращаемого значения
$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 рекомендации по обработке ошибок стали строже, что требует более внимательной проверки возвращаемого значения.

Расширенные примеры

Пример 1: Временный файл с конкретным содержимым
Пример 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"}
Пример 2: Безопасная обработка загружаемых файлов
Пример php
$uploadedFile = $_FILES['file']['tmp_name'] ?? null;
if ($uploadedFile) {
    $safeTempFile = tempnam(sys_get_temp_dir(), 'upload_');
    move_uploaded_file($uploadedFile, $safeTempFile);
    // Дальнейшая обработка безопасного временного файла
}
Пример 3: Создание временного каталога через tempnam
Пример php
$tempFile = tempnam(sys_get_temp_dir(), 'dir_');
if ($tempFile) {
    unlink($tempFile); // Удаляем файл
    mkdir($tempFile); // Создаём каталог с тем же именем
    echo "Создан каталог: " . $tempFile;
}
Создан каталог: /tmp/dir_5a1b2c3d4e
Пример 4: Многопоточная безопасность
Пример php
// 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
)

Аналоги в других языках

Python: модуль tempfile
import tempfile
temp_file = tempfile.NamedTemporaryFile(delete=False)
print(temp_file.name)
temp_file.close()
/tmp/tmp9z4q3q1v
JavaScript (Node.js): модуль fs
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
MySQL: Временные таблицы
CREATE TEMPORARY TABLE temp_data (id INT, value VARCHAR(255));

Основное отличие от PHP: в Python и Node.js часто используются высокоуровневые API, управляющие временными файлами более комплексно, включая автоматическое удаление.

PHP tempnam function comments

En
Tempnam Create file with unique file name