file_put_contents дозволу відмовлено


97

Я намагаюся написати запит у файл для налагодження. Файл знаходиться в database/execute.php. Файл, в який я хочу написати database/queries.php.

Я намагаюся використовувати file_put_contents('queries.txt', $query)

Але я отримую

file_put_contents (queries.txt) [function.file-put-content]: не вдалося відкрити потік: у дозволі відмовлено

У мене queries.txtфайл chmod'd до 777, що може бути проблемою?


Ви шукали через php.iniфайл щось, що може заборонити доступ до файлу?
Привіт71

2
також переконайтеся, що в каталозі правильно chmod'd
Crayon Violent

1
також спробуйте використовувати абсолютне ім'я файлу. Можливо, лише те, що ваша інтерпретація поточної папки відрізняється від PHP
laher

1
Чи можете ви двічі перевірити цей статус chmod?
Йона

1
Існує контрольний список для усунення несправностей такого роду проблеми: stackoverflow.com/questions/36577020 / ...
Вікі Seedoubleyew

Відповіді:


72

Спробуйте налаштувати дозволи для каталогу.

з терміналу, запустіть chmod 777 database(з каталогу, який містить папку бази даних)

apache і ніхто не матиме доступу до цього каталогу, якщо він chmodd'ed правильно.

Інше, що потрібно зробити - це відлуння "getcwd ()". Це покаже вам поточний каталог, і якщо це не '/something.../database/', вам потрібно буде змінити 'query.txt' на повний шлях для вашого сервера.


104
Чи не є 777 ризиком для безпеки?
hitautodestruct

12
Я сильно підозрюю, що не тільки цільовий каталог повинен бути записаний обліковим записом сервера, але кожен батьківський каталог цільового каталогу повинен дозволяти обліковому запису сервера переходити до нього; Я думаю, це буде + x дозволів.
Ерханніс

2
Я експериментував з теоріями Ерханніса на новому стеку LAMP, і теорія правильна.
thotheolh

4
@MajidFouladpour Я думаю chmod +x /parent/directory, для кожного батьківського каталогу цілі. chmod +x /parent/directory, chmod +x /parentі т. д.
Ерханніс

1
Існує в даний час контрольний список для усунення несправностей такого роду проблеми: stackoverflow.com/questions/36577020 / ...
Вікі Seedoubleyew

18

Інший варіант

це те, що ви можете зробити Apache (www-data), власник папки

sudo chown -R www-data:www-data /var/www

це має змусити file_put_contentsпрацювати зараз. Але для більшої безпеки вам також краще встановити дозволи, як показано нижче

find /var/www -type d -print0 | xargs -0 chmod 0755 # folder
find /var/www -type f -print0 | xargs -0 chmod 0644 # files
  • зміни /var/wwwв кореневу папку ваших PHP-файлів

7

Зрозумійте, це зараз досить давно, але немає потреби вручну писати запити у такий файл. У MySQL вбудована підтримка ведення журналів, вам просто потрібно включити її у вашому середовищі розробників.

Погляньте на документацію до "загального журналу запитів":

http://dev.mysql.com/doc/refman/5.1/uk/query-log.html


3

Хлопці, я мав цю проблему протягом 1 місяця і робив усе, але не міг її виправити, але тепер я знаю рішення.

Я використовую спільний Linux хостинг, коли мій адміністратор змінив php на 5.3, я отримав багато помилок для коду "file_put_contents". спробуйте перевірити мій план:

У своєму хості створіть такий файл, як mytest.php, і вставте цей код і збережіть:

<?php        mail('Your-EMail','Email-Title','Email-Message');        ?>

Відкрийте URL-адресу "www.your-domain.com/mytest.php" один раз та перевірте свою електронну пошту. у вас повинен бути електронний лист від вашого хоста з інформацією, яку ви ввели в mytest.php, перевірте ім'я відправника. якщо його від Nobody у вас є проблеми про «Відмовлено в доступі» , тому що що - то не визначене , і якщо ім'я відправника , як мій ід: iietj8qy@hostname5.netly.net ви не маєте вероят.

Мій адміністратор змінив сервер і встановив хост знову, я думаю, і проблема вирішилася, скажіть адміністрації хоста, що я вам сказав, і, можливо, вони знайдуть відповідь.

сподіваюся, що це допоможе вам!


Я повністю загублений !! Що ви намагаєтеся сказати? Якщо ви говорите про те, що користувач apache не зміг отримати ім'я хоста на сервері (спільному або будь-якому іншому), то саме час переглядати свій вибір хостингової послуги.
Fr0zenFyr

3

Я знаю, що це дуже старе питання, але я хотів додати гарне рішення з деякими глибинними поясненнями. Вам доведеться виконати два оператори на системах, подібних до Ubuntu, і тоді це працює як шарм.

Дозволи в Linux можуть бути представлені трьома цифрами. Перша цифра визначає дозвіл власника файлів. Друга цифра дозволів певної групи користувачів. Третя цифра визначає дозволи для всіх користувачів, які не є власником і не членом групи.

Передбачається, що веб-сервер виконує ідентифікатор, який є членом групи. Веб-сервер ніколи не повинен працювати з тим самим ідентифікатором, що і власник файлів та каталогів. В Ubuntu запускається апач під id www-data. Цей ідентифікатор повинен бути членом групи, для якої вказані дозволи.

Щоб надати директорії, в якій потрібно змінити вміст файлів, належних прав, виконайте оператор:

find %DIR% -type d -exec chmod 770 {} \;

. Це означає, що у запитанні про ОП слід мати відповідні зміни дозволів для каталогу% ROOT% / бази даних. Для цього важливо не мати файлів у цьому каталозі, які ніколи не слід змінювати чи видаляти. Для цього є найкращою практикою створити окремий каталог для файлів, вміст яких потрібно змінити.

Дозвіл на читання (4) для каталогу означає можливість збирати всі файли та каталоги з їх метаданими в каталозі. Дозвіл на запис (2) дає дозвіл на зміну вмісту каталогу. Передбачення додавання та видалення файлів, зміна дозволів тощо. Дозвіл на виконання (1) означає, що ви маєте право зайти в цей каталог. Без останнього неможливо заглибитись у каталог. Веб-сервер повинен читати, записувати та виконувати дозволи, коли зміст файлу має бути змінено. Для цього групі потрібна цифра 7.

Друге твердження - у питанні про ОП:

find %DOCUMENT_ROOT%/database -type f -exec chmod 760 {} \;

Вміти читати та писати документ потрібно, але виконувати файл не потрібно. 7 надається власнику файлів, 6 - групі. Веб-серверу не потрібно мати дозвіл на виконання файлу, щоб змінити його вміст. Ці дозволи на запис мають бути надані лише файлам у цьому каталозі.

Усі інші користувачі не повинні отримувати жодного дозволу.

Для каталогів, які не потребують зміни його файлів, достатньо групових прав на 5. Документація про дозволи та деякі приклади:

https://wiki.debian.org/Персидії

https://www.linux.com/learn/tutorials/309527-understanding-linux-file-permissions

http://www.linux.org/threads/file-permissions-chmod.4094/


3

Збір інформації за цим посиланням збереження зображення stackoverflow не працює з chmod 777 та користувачами azerafati та Loek Bergman

якщо ви заглянете у файл / etc / apache / envvars, ви побачите щось на кшталт:

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

Apache працює під ім'ям "www-data"

"0755" означає, що власник файлу може читати / записувати / виконувати, але група та інші користувачі не можуть писати. так що в ур-терміналі, CD в папку, що містить папку "images". потім введіть:

find images -type d -exec chmod 0755 {} \;
find images -type f -exec chmod 0755 {} \;
sudo chown -R www-data:www-data images

спочатку ви повинні змінити документи, перш ніж змінити власника. введіть свій пароль, коли буде запропоновано. це зробить "www-data" власником папки зображень.

зараз ваше завантаження має працювати.


1

Для всіх, хто використовує Ubuntu та отримує цю помилку під час завантаження сторінки локально, але не на сервісі веб-хостингу,

Я просто виправив це, відкривши nautilus ( sudo nautilus) і клацнувши правою кнопкою миші на файл, який ви намагаєтесь відкрити, натисніть властивості> Налаштування> і дайте прочитати написати "всім іншим"


0

була така ж проблема; моя проблема була selinux була налаштована на виконання.

Я продовжував отримувати помилку "не вдалося відкрити потік: Дозвіл відхилено" навіть після того, як chmoding до 777 і переконався, що всі батьківські папки виконували дозволи для користувача apache. Виявляється, моя проблема полягала в тому, що selinux був налаштований на примусове виконання (я перебуваю на centos7), це devbox, тому я його вимкнув.


0

Це можна вирішити за допомогою наступних кроків:

1. $ php artisan cache:clear

2. $ sudo chmod -R 777 storage

3. $ composer dump-autoload

Сподіваюся, це допомагає


0

Якщо ви перетягуєте з git з локального на сервер, вам доведеться іноді очищати кеш із-за файлів перегляду, які він завантажується разом з ним / або з інших кешованих файлів.

php artisan cache:clear

Іноді це може призвести до хитрості, якщо ваша програма працювала ще до того, як витягнути git



-2

Існує 2 способи вирішення цієї проблеми
1. використання chmod 777 path-to-your-directory.
якщо це не працює, то
2. просто вкажіть повний шлях вашого файлу query.txt.


2
Це жахливо небезпечно і надзвичайно погана практика. Також важко виявити та виправити під час розробки спеціальних програм, і їх можна легко не помітити. Будь ласка, з’ясуйте правильні дозволи.
ftrotter

-3

Тут рішення. Щоб скопіювати img з URL-адреси. ця URL-адреса:http://url/img.jpg

$image_Url=file_get_contents('http://url/img.jpg');

створити потрібний шлях закінчити ім'я .jpg

$file_destino_path="imagenes/my_image.jpg";

file_put_contents($file_destino_path, $image_Url)

-11

Крім того, як сказано file_put_contents man pageв статті php.net, остерігайтеся іменування питань.

file_put_contents($dir."/file.txt", "hello");

може не працювати (навіть якщо це правильно в синтаксисі), але

file_put_contents("$dir/file.txt", "hello");

працює. Я відчував це на різних серверах, встановлених php.


17
Це неправильно. $dir."/file.txt"функціонально рівнозначний "$dir/file.txt"у всіх випадках, якщо вважати, що $dirце рядок. Крім того, така поведінка не зафіксована на php.net, як стверджує Ківанц.
mattbasta
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.