Настройка PHP tmp dir - загрузка PHP не работает

я работаю над загрузкой файлов через веб-страницу с индикатором выполнения, используяЗагрузчик файлов Valums, Почти все работает нормально, но яя не могу изменить каталог tmp по умолчанию, где хранится файлв течение загрузка.

Файлы должны храниться в/upload каталог, а не в системе по умолчанию/tmp каталог, потому что/tmp смонтирован на RAM-диске, размер которого ограничен 4МБ и пользователь будет загружать файлы около 10MB.I»

Я искал много веб-страниц, но ни одно из решений не помогло. Я'установить временный каталог в: I 'php.ini

upload_tmp_dir =/upload

установить права доступа к/upload dir, а apache - владелец файла, поэтому каталог безусловно доступен для записи PHP.I '

установить целевой путь в загрузчике файла на/uploadпотому что я хочу, чтобы файлы были сохранены после загрузки также в этом каталоге. Окончательный результат - небольшие файлы загружаются успешно, но файлы больше 4MB не удается загрузить - единственная причина такого поведения, которая приходит мне в голову, заключается в том, что файлы хранятся в/tmp во время загрузки. Конечно, яя проверил это сsys_get_temp_dir() и результат был/tmp-Так что PHP игнорирует мою директиву php.ini или есть какой-то другой способ указать, где файлы хранятся во время загрузки.

Ох, и последняя информация:open_basedir ISN»t, поэтому доступ PHP к диску ограничен только правами доступа к файлам.

 soju21 сент. 2012 г., 15:22
Вы перезапустили свой сервер (извините за этот глупый вопрос)?
 Wookie8821 сент. 2012 г., 15:23
Там нет глупых вопросов, просто глупые ответы :). Да я'мы делали это много раз, пытаясь решить проблему и пытаясь найти разные решения.
 soju21 сент. 2012 г., 15:31
Вы можете проверить это с помощью phpinfo или в Apache Conf.
 soju21 сент. 2012 г., 15:37
 Wookie8821 сент. 2012 г., 15:46
я написал вопрос, что яустановить права доступа к/upload Дир, так что апач является его владельцем. Если я установил разрешения, я, очевидно, создал каталог раньше :).
 Khôi21 сент. 2012 г., 15:41
Это'не CGI, а модуль Apache PHP5. И если upload_tmp_dir = / upload /, то он выиграл 'Это не работает, так как upload_tmp_dir требует абсолютного и записываемого пути, в противном случае PHP вернется к стандартному / tmp / dir.I '
 Wookie8821 сент. 2012 г., 15:37
upload_tmp_dir вphpinfo() является/upload/, чтобы'хорошо PHP, вероятно, модуль CGI, потому что янашел вapache.conf следующая строка:LoadModule php5_module lib/httpd/modules/libphp5.so, Я прав?
 soju21 сент. 2012 г., 15:26
Вы проверяли, что php не установлен как мод cgi? (Из документа:Если указанный здесь каталог недоступен для записи, PHP возвращается к системному временному каталогу по умолчанию)
 Wookie8818 апр. 2013 г., 21:35
ОК, спасибо, что напомнили мне об этом :)
 Wookie8821 сент. 2012 г., 15:30
Хорошо, теперь моя очередь за глупый вопрос: как я должен проверить, установлен ли php как мод cgi?
 Luis Siquot17 апр. 2013 г., 23:32
вы говорите в чате, чтоit's embedded linux modem / TMP находится в оперативной памяти, где находится / загрузки? ты уже решил это? опубликуйте свое решение здесь, пожалуйста, как ответчик и примите его
 soju21 сент. 2012 г., 15:28
Можете ли вы проверить такжеupload_tmp_dir в ?phpinfo()

Ответы на вопрос(4)

Решение Вопроса

Описанная здесь проблема была решена мной довольно давно, но я нена самом деле не помню, что было основной причиной, по которой загрузка не былат работает. Было несколько вещей, которые нужно исправить, чтобы загрузка могла работать. Я создал контрольный список, который может помочь другим людям, имеющим схожие проблемы, и я отредактирую его, чтобы сделать его максимально полезным. Как я уже говорил в чате, я работал над встроенной системой, поэтому некоторые моменты могут быть пропущены на не встроенных системах.

Проверьтеupload_tmp_dir в php.ini. Это каталог, в котором PHP хранит временные файлы при загрузке.

Проверьтеopen_basedir в php.ini. Если он определен, он ограничивает права чтения / записи PHP указанным путем и его подкаталогами. Убедиться, чтоupload_tmp_dir находится внутри этого пути.

Проверьтеpost_max_size в php.ini. Если вы хотите загрузить файлы размером 20 Мбайт, попробуйте что-нибудь немного больше, например,post_max_size = 21M, Это определяет наибольший размер сообщения POST, которое вы, вероятно, используете во время загрузки.

Проверьтеupload_max_filesize в php.ini. Это определяет самый большой файл, который может быть загружен.

Проверьтеmemory_limit в php.ini. Тот's максимальный объем памяти, который может потреблять скрипт. Это'Совершенно очевидно, что это можетне будет больше, чем размер загрузки (если честно, яя не совсем уверен в этом - PHP, вероятно, буферизует при копировании временных файлов).

Убедитесь, что выПроверьте правильность файла php.ini, который используется PHP на вашем веб-сервере. Лучшее решение - выполнить скрипт с директивой, описанной здесь.http://php.net/manual/en/function.php-ini-loaded-file.php (php_ini_loaded_file функция)

Проверьте, как работает пользователь php (смотрите здесь, как это сделать:Как проверить, какой пользователь php работает? ). Я работал на разных дистрибутивах и серверах. Иногда этоapache, но иногда это может бытьroot, В любом случае, убедитесь, что у этого пользователя есть права на чтение и запись во временный каталог и каталог, который выповторная загрузка в. Проверьте все каталоги в пути, если вы 'повторная загрузка в подкаталог (например,/dir1/dir2/-проверьте обаdir1 а также .dir2

На встроенных платформах иногда требуется ограничить запись в корневую файловую систему, поскольку она хранится на флэш-карте, и это помогает продлить срок службы этой карты. Если вы используете сценарии для включения / отключения записи в файл, убедитесь, что вы включили запись перед загрузкой.

У меня были серьезные проблемы с PHP>5.4 загрузка мониторинга на основе сессий (как описано здесьhttp://phpmaster.com/tracking-upload-progress-with-php-and-javascript/ ) на некоторых платформах. Попробуйте сначала что-нибудь простое (как здесь:http://www.dzone.com/snippets/very-simple-php-file-upload ). Если это работает, вы можете попробовать более сложные механизмы.

Если вы сделаете какие-либо изменения в php.ini, не забудьте перезапустить сервер, чтобы перезагрузить конфигурацию.

 Olaf02 дек. 2015 г., 12:58
Хороший контрольный список - спасибо!
 Olle Kelderman10 июн. 2016 г., 07:51
хороший список: D, но есть ли какая-то конкретная причина, по которой ссылка php-ini -loaded-file указывает на польский php.net? ;)
 Protector one10 нояб. 2016 г., 23:59
Замечания:open_basedir может быть установлен с помощью.ini_set
 PiTheNumber02 февр. 2016 г., 12:25
memory_limit не является проблемой для загрузки. Увидетьstackoverflow.com/a/5828654/956397
 Wookie8810 июн. 2016 г., 09:36
Lol, польская версия не была переведена, поэтому она была идентична английской версии на момент написания этого поста. Исправлено сейчас.
 Wookie8802 февр. 2016 г., 16:14
Если вы не планируете читать весь файл в PHP, вы 'верно. Тем не менее, это 'Хорошо сохранить этот пункт в контрольном списке, чтобы сделать его более универсальным.

чтобы изменить файл php.ini в папке, содержащей скрипт php. Это было важно, так как изменение php.ini в корне не решило проблему (у меня есть php.ini в каждой папке для детального контроля). Соответствующие записи в моем php.ini выглядели так ... (выходной_буфферинг вряд ли нужен для этой проблемы)

output_buffering = On 
upload_max_filesize = 20M 
post_max_size = 21M

создать php-файл с:

<!--?php
    print shell_exec( 'whoami' );
?-->

или же

<!--?php echo exec('whoami'); ?-->

попробуйте вывод в вашем веб-браузере.если вывод не ваш пользовательский пример: www-data затем перейдите к следующему шагу

открыть как корень:

/ И т.д. / apache2 / envvars

ищите эти строки:

экспорт APACHE_RUN_USER = имя пользователя

экспорт APACHE_RUN_GROUP = имя группы

пример:

экспорт APACHE_RUN_USER = www-данные

экспорт APACHE_RUN_GROUP = www-данные

где:

username = ваше имя пользователя, у которого есть доступ к папке, которую вы используете group = group you 'дали права на чтение + запись + выполнение

измените это на:

экспорт APACHE_RUN_USER = "имя пользователя»

экспорт APACHE_RUN_GROUP = "группа»

если у вашего пользователя еще нет доступа:

sudo chmod 775 -R "каталог папки, к которой вы хотите предоставить доступ r / w / x "

 Jerome Jr. Formentera12 нояб. 2018 г., 18:38
@ Wookie88 на самом деле дал почти все решения проблемы.

В моем случае это был open_basedir, который был определен. Я закомментировал это (по умолчанию), и моя проблема была решена. Теперь я могу установить каталог загрузки в любом месте.

Ваш ответ на вопрос