Это вопрос о моей конфигурации системы и о том, как это может повлиять на apache / php. Код, который работал на моем dev-сервере, не работал, когда я перешел на производство, и вот проблема, с которой я сварил ошибку. Я хочу использовать file_put_contents в php, чтобы просто создать файл в моей системе. Вот самый простой код, который я использую:
print file_put_contents("testfile.txt","this is my test")?"made file":"failed";
Ошибок не возникает, но он всегда печатает «сбой». Когда я запускаю его в обычном каталоге, файл не создается, но когда я переношу его в каталог с разрешением 777, он будет делать файл, но все равно печатать «сбой» и ничего не сохранять в нем . Если я изменю сам файл php, чтобы иметь разрешение 777, ничего не меняется. Если я изменю целевой файл (testtext.txt), чтобы иметь разрешение 777, ничего не меняется.
Когда я изменяю владельца файла php таким же, как созданный файл testfile.txt, ничего не меняется. Когда я пробую относительные против абсолютных путей, ничего не меняется. По какой-то причине я могу создать файл php, но он всегда пуст, и с помощью file_put_contents я ничего не могу написать.
Созданный файл принадлежит владельцу и группе «www-data», в то время как я действую как root, если это помогает. Что я могу сделать, чтобы это работало? Я думаю, что моя версия php использует расширение suhosin, если это может иметь к этому какое-либо отношение (или если вы считаете, что есть способ исправить это в файлах php или suhosin ini, я тоже могу это сделать).
В последние несколько дней я охотился на это.
EDIT: обновления, основанные на комментариях ниже. Когда я запускаю его в режиме CLI, он работает, но поскольку мне нужно запустить его через apache, как я могу использовать этот факт? Означает ли это что-то о том, где и что останавливает запись файла? Также вызов file_put_contents фактически возвращает «false», а не ноль.
Вы должны установить разрешения как 777 для пользователя apache. Apache также должен иметь возможность создавать новые файлы. Я уверен, что если вы попытаетесь написать файл с 777 правами, которые будут работать.
Функция возвращает количество байтов, которые были записаны в файл, или FALSE при сбое.
Убедитесь, что mydir
доступен для записи (пользователем apache – apache2 или www-data). Чтобы проверить, был ли контент записан в файл, используйте оператор ===:
$file = "mydir/testfile.txt"; $result = file_put_contents($file,"this is my test"); if ($result === false) { echo "failed to write to $file"; } else { echo "successfully written $result bytes to $file"; }
Для отладки я рекомендую определить это в верхней части вашего php-файла:
error_reporting(-1); ini_set('display_errors', true);