PHP:Установить разрешения, чтобы я мог записать файл?
Вопрос
Я пытаюсь создать файл с помощью PHP, вот мой код:
$file_to_send = 'ftp_test_from_created_file.txt';
chmod($file_to_send, 0777);
$fh = fopen($file_to_send,'w');
$tsv_line = 'Hey\tThese\tAre\tTab\tSeperated\tValues';
fwrite($fh, $tsv_line);
fwrite($fh, '\n');
$tsv_line = 'Hey\tThese\tAre\tToo';
fwrite($fh, $tsv_line);
fclose($fh);
Это явно выдает мне ошибку, поскольку я пытаюсь установить разрешения для файла, который еще не существует.Хотя, если я пропущу вызов chmod, я получу еще одну ошибку, сообщающую, что у меня не установлены разрешения.Итак, либо я нахожусь в цикле «больная курица против яйца», либо мне нужно установить разрешения для содержащего каталога... но как?он попробовал все следующее:
chmod('../containingfolder/', 0777);
chmod('../', 0777);
chmod('', 0777);
Ничего из этого не работает...Что я должен делать?Да, и кстати, когда я закончу, мне нужно будет снова изменить разрешения?
Спасибо!
ОБНОВЛЯТЬ Я пытался chmod('.', 0777) и это ошибка, которую я получил:
Warning: chmod(): Operation not permitted
Единственная причина, по которой я пытаюсь создать этот файл, заключается в том, что я могу передать его по FTP в другое место, а затем я планировал отсоединить его().Так есть ли лучший способ?Например, сохранение файла в памяти для его отправки (не знаю, возможно ли это)?Также я использую PHP4.Спасибо!
Решение
Создайте каталог вне корня вашего документа, который мы назовем $tmpFolder
убедитесь, что пользователь, под которым работает веб-сервер, имеет права на чтение/запись.Затем следующее:
$file_to_send = $tmpFolder . '/ftp_test_from_created_file.txt';
chmod($file_to_send, 0777);
$fh = fopen($file_to_send,'w');
$tsv_line = 'Hey\tThese\tAre\tTab\tSeperated\tValues';
fwrite($fh, $tsv_line);
fwrite($fh, '\n');
$tsv_line = 'Hey\tThese\tAre\tToo';
fwrite($fh, $tsv_line);
fclose($fh);
Другие советы
Также может случиться так, что работающий сервер Apache (если это Apache) не имеет доступа для изменения разрешений для этого каталога.Он может иметь root/root в качестве пользователя/группы, а apache может работать в группе apache, wwwuser или что-то еще.
Сделайте ls -l
в родительском каталоге и посмотрите, какой пользователь и группа имеет доступ к этой папке.
Чтобы изменить разрешение текущего каталога, используйте
chmod('.', PERMISSION);
Действительно ли вам нужен 0777, т.е.мир доступен для чтения и записи?Мне кажется очень небрежно!
Редактировать:Ваше предложение chmod('../tainfolder/', 0777);тоже должно было сработать.Можете ли вы более подробно рассказать о получаемых ошибках?
Вы не можете установить разрешения для записи, если пользователь, использующий PHP, не может ее изменить.Посмотрите конфигурацию Apache, найдите пользователя, под которым он работает (по умолчанию это www-data).Чтобы избежать этого в будущем, установите себя в ту же группу, что и группу по умолчанию, и укажите корень документа chmod -R g+a.
Если текущий пользователь может писать в каталог, вы сможете упростить все это с помощью file_put_contents()
.
<?php
$file = 'file_to_write.txt';
$data = "Tab\tseparated\tvalues\nMore\tseparated\tvalues";
file_put_contents($file);
Если у вас нет прав на запись в текущий каталог (или любой другой каталог), вы не сможете создать файл, не говоря уже о chmod
это.
Если бы вы могли опубликовать ошибки, которые вы получаете от своего chmod()
команды, это поможет.
chmod('.',0777);
должно сработать.
Если вы хотите сохранить тюрьму chroot, но при этом вам нужны привилегии для изменения текущего каталога, вам придется выяснить, как использовать sudo с опцией -S и передать пароль root в STDIN, чтобы получить привилегии.