PHP:Установить разрешения, чтобы я мог записать файл?

StackOverflow https://stackoverflow.com/questions/941879

  •  06-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь создать файл с помощью 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, чтобы получить привилегии.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top