PHP Не удается найти каталог tmp

У меня возникают проблемы с функциями, которые создают файлы в каталоге tmp, такие как tmpfile() и tempnam() . Кажется, что все они не могут писать в tmp и возвращать false. upload_tmp_dir установлен в php ini, а upload_tmp_dir файлов работает нормально.

При отладке этой ошибки я обнаружил, что sys_get_temp_dir() получает местоположение каталога tmp, к сожалению, он не поддерживается в моей версии PHP (5.1.6). Я также видел, что использование следующего метода заменяет функциональность sys_get_temp_dir() :

 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(__FILE__,''); if (file_exists($tempfile)) { unlink($tempfile); return realpath(dirname($tempfile)); } return null; } } 

Но нет ссылки на каталог tmp в массиве $ _ENV, а tempnam() терпит неудачу, как я упоминал ранее.

Также open_basedir не установлен, который, как я слышал, может вызвать подобные проблемы

Как узнать, где находится каталог tmp или даже он установлен?
Является ли это проблемой конфигурации сервера Apache или PHP?

Спасибо за вашу помощь

    TMP, TEMP (и, возможно, TMPDIR) действительны только для Windows и обычно указывают на C:\Windows\TEMP . В Linux по умолчанию используется временное местоположение /tmp . Чтобы обойти это (работает с tempnam() ), вы можете создать временную папку где-нибудь на своем веб-сайте, указать соответствующие разрешения доступа и передать это как первый параметр указанной функции.

    Не отличное решение, но лучше, чем ничего.

    вы можете установить параметр temp upload temp в php.ini – что-то вроде этого должно работать:

     upload_tmp_dir=/your-www/tmp/ 

    Кроме того, если вы не можете редактировать php.ini или не хотите делать это глобально, вы можете использовать это в начале вашего скрипта:

     ini_set('upload_tmp_dir','/your-home-www/tmp/'); 

    Наверное, не самый чистый, но это работает на моей старой версии 5.1.6:

     function get_temp_path() { static $path = null; if ($path !== null) return $path; $file = tmpfile(); $meta = stream_get_meta_data($file); fclose($file); $path = dirname($meta['uri']); return $path; } 

    У меня та же проблема, и решение заключается в изменении конфигурации apache, чтобы вывести переменную TEMP в PHP, см. Этот пост .

    Совет для новичков, таких как я: Я ХОЧУ, что PHP не мог перемещать вещи из моей временной папки, но я был просто сбит с толку из-за относительных положений папок. Это может относиться к кому-то еще, поэтому я объясню, хотя это очень касательно этого конкретного вопроса (потому что этот конкретный вопрос является вероятным результатом поиска для других людей, таких как я, которые являются новичками).

    Моя проблема заключается в том, что я возвращался к форме загрузки FROM из файла functions.php внутри / var / www / html / TO файла profile.php в / var / www / html / user /, который вызвал файл uploadphoto.php в / вар / WWW / HTML /. Загруженные файлы были в конечном итоге предназначены для приземления в / var / www / html / uploads. Это в конечном счете означало, что большинство моих ссылок на uploadphoto.php и uploads / in functions.php были написаны «../uploadphoto.php» или «../uploads/[etc.jpg» соответственно, чтобы сделать шаг назад в html / from html / user / (где эхо-код попал в html / user / profile.php). Это заставило меня интуитивно использовать следующую команду внутри uploadphoto.php, не задумываясь:

     move_uploaded_file($_FILES["file"]["tmp_name"][0], "../uploads/$filename") 

    См. Проблему? uploadphoto.php находится в том же каталоге, что и uploads /, поэтому мне здесь не нужен ../. В течение нескольких часов я был уверен, что снова перепутал права на мои папки, потому что я новичок в загрузке изображений. Я забыл проверить более простые мысли. Надеюсь, это поможет кому-то другому.