php работает file_put_contents не создает файл txt




php дописать в файл (4)

В настоящее время у меня есть php-скрипт, который запускается, когда браузер браузера просматривает веб-страницу. То, что я пытаюсь сделать, это написать текстовый файл при запуске скрипта, в котором хранится переменная. Владелец папки - apache, но каждый читает запись, строго для целей тестирования. (Я думал, что это может быть проблема с разрешениями) SELINUX включен на сервере, и когда я запускаю скрипт с консоли, он создает текстовый файл просто отлично и находится в правильном каталоге.

file_put_contents("My working file location", $myString);

Я использую эту строку, чтобы попытаться написать и создать текстовый файл, я знаю, что мое местоположение файла работает, потому что я могу запустить его и создать в автономном режиме, IE запускает его через консоль. Проблема в том, что переменная, которую я пытаюсь написать, заполняется через HTTP Post, и когда я запускаю скрипт через браузер или когда apache запускает скрипт, он не пишет и не создает файл. Что мне нужно сделать, чтобы разрешить доступ к написанию / изменению синтаксиса, чтобы этот скрипт написал этот текстовый файл?


Вероятно, ваша проблема связана с тем, что apache не имеет прав на запись в указанное вами местоположение файла. Перейдите в этот каталог и проверьте разрешения и групповое владение с помощью команды ls :

cd "My working file location"
ls -l .

На выходе есть три столбца, которые показывают разрешения, владельца и группу для каталога. Скорее всего, они принадлежат root и не имеют разрешений для apache для записи в каталог.

Если это так, вы увидите, что в вашем Apache-журнале появляется ошибка, когда он пытается создать файл. Попробуйте закрыть свои журналы при запуске скрипта в вашем браузере:

tail -f /var/log/apache2/error.log

Вы пробовали chmodding в каталоге до 777 ?

Попробуй это:

if(file_put_contents('file.txt', 'text')){
    die('yes');
} else {
    die('no');
}

Возможно, что-то написано неправильно. ^


Я уверен, что если мое решение действительно ясно, но это сработало:

cd /mydir/
setsebool -P allow_httpd_anon_write true 

С наилучшими пожеланиями


У меня была такая же проблема и наткнулся на этот вопрос. К сожалению, choppyfireballs OP сказал в комментарии, что нашел свое собственное решение и просто принял ответ, который не помог никому из нас ... Затем, после того, как поиск и успех заставили file_put_contents работать снова, я решил поделиться своим решением.

Разрешения моих файлов и каталогов были в порядке, чтобы принять любую запись (убедитесь, что ваши каталоги являются chmod 757 это даст корневому файлу, а другим - грант для записи файлов в местоположении). Если он по-прежнему не работает, как это было не для меня, это потому, что ваша система, вероятно, является системой SELinux (Security Enhanced Linux).

Если вы хотите убедиться, что write setenforce 0 это превратит selinux в разрешающий режим, снова запустите свой скрипт, если он будет работать, значит, проблема хорошо описана.

В этом случае поверните selinux на back setenforce 1 и попробуйте ls -Zl в каталоге, где находится каталог вашего проекта. это даст вам строку вроде

drwx---r-x.  9  root   root  system_u:object_r:httpd_sys_content_t:s0  4096  Dec  8  00:25  project

или что-то другое, но httpd_sys_content_t если вы использовали chcon для передачи контекста из одного каталога в этот. но если у вас нет httpd_sys_content_t это нормально, потому что нам нужно в любом случае изменить контекст этого каталога.

сначала вам нужно принять любые public_content_rw_t контексты для записи файла. Тип

setsebool -P httpd_anon_write on

Это установит (P) ermanently SELinux boolean httpd_anon_write на true, и любой контекст, называемый public_content_rw_t будет иметь права на запись любых файлов в их собственное местоположение.

Теперь вы должны сказать SELinux, что ваш каталог проекта public_content_rw_t или вы все равно не сможете писать файлы. Тип :

semanage fcontext --add --type public_content_rw_t "/project(/.*)?"

и restorecon -RvF /project чтобы сказать selinux применить вышеуказанные спецификации.

Теперь ваш каталог public_content_rw_t, и вы должны иметь возможность записывать файлы.





selinux