tmpfile () PHP возвращает false, хотя upload_tmp_dir доступен для записи - PullRequest
2 голосов
/ 20 июня 2011

Я пытаюсь использовать tmpfile(), но возвращает false для меня.

Я не могу использовать sys_get_temp_dir(), поскольку я нахожусь на PHP5.1.6, так как постеры по аналогичным вопросам предложили, но если я проверю свой upload_tmp_dir (это то же значение, что и sys_get_temp_dir()?)is_writable() возвращает истину.

Очевидно, согласно ответам, каталог tmp может отличаться от файла upload_tmp_dir.Проблема не в том, что ни один из методов определения работы каталога tmp: $_ENV['tmp'], $_ENV['temp'] и $_ENV['tmpdir'] пустые.Также следующий код не будет работать при сбое tempnam(), вероятно, по той же причине, что и tmpfile().

$temp=tempnam(__FILE__,'');
if (file_exists($temp)) {
    unlink($temp);
    return dirname($temp);
}

У кого-нибудь есть еще предложения?
Может ли это быть проблемой конфигурации сервера?Спасибо

Ответы [ 3 ]

3 голосов
/ 20 июня 2011

tmpfile() не загружает файлы, он создает временные файлы в вашей системной папке tmp.

Без sys_get_temp_dir() вы можете попробовать получить tmp dir с одним из следующих способов:

getenv('TMP');
getenv('TEMP');
getenv('TMPDIR');

Есть несколько примеров того, как использовать их там , и как только вы найдете его, посмотрите, доступен ли он для записи.

Единственная причина, по которой tmpfile() возвращает false, - если он не можетсоздать файл.Подобная проблема здесь .

0 голосов
/ 20 июня 2011

Может быть, это open_basedir проблема:

Помните, что open_basedir влияет эта функция. Вы получите ошибку:

Предупреждение: tmpfile () [function.tmpfile]: действует ограничение open_basedir. Файл (/ var / tmp) находится вне разрешенный путь (пути): .... blablabla =)

источник: http://www.php.net/manual/en/function.tmpfile.php#74623

Кроме того, sys_get_temp_dir НЕ совпадает с upload_tmp_dir.

Чтобы эмулировать sys_get_temp_dir в старых версиях PHP, попробуйте следующее:

<?php
if ( !function_exists('sys_get_temp_dir')) {
  function sys_get_temp_dir() {
    if (!empty($_ENV['TMP'])) { return realpath($_ENV['TMP']); }
    if (!empty($_ENV['TMPDIR'])) { return realpath( $_ENV['TMPDIR']); }
    if (!empty($_ENV['TEMP'])) { return realpath( $_ENV['TEMP']); }
    $tempfile=tempnam(uniqid(rand(),TRUE),'');
    if (file_exists($tempfile)) {
    unlink($tempfile);
    return realpath(dirname($tempfile));
    }
  }
}
?>

источник: http://www.php.net/manual/en/function.sys-get-temp-dir.php#85261

0 голосов
/ 20 июня 2011

Возможно open_basedir опция включена на вашем сервере.

Вы не должны выдавать ошибки или проверять свой error.log, там должно быть предупреждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...