Почему нельзя записать информацию в каталог / tmp вместо / var / www / html? - PullRequest
0 голосов
/ 10 декабря 2018

ЛАМПА установлена ​​на моем локальном компьютере, так как я знаю, что строку xxxx можно записать в /tmp/test с помощью функции PHP ниже.

file_put_contents("/tmp/test","test1 test2") 

cat ajax_get.php

<?php
    $str = "test1 test2";
    ini_set('display_errors', 1);
    error_reporting(E_ALL);
    $str = implode(" ",$_GET);
    file_put_contents("/tmp/test",$str);
    print($str);
?>

Почему команда file_put_contents("/tmp/test",$str); в ajax_get.php не может работать?

Бесполезно заменять file_put_contents на

$handle=fopen("/tmp/test","w");
fwrite($handle,$str);
fclose($handle);

Возможно, это проблема с разрешением каталога,если я изменил приведенный ниже оператор в ajax_get.php

    file_put_contents("/tmp/test",$str);

На

    file_put_contents("test",$str);

И запустил предыдущий процесс, ajax_get.php создайте файл в /var/www/html/test

cat /var/www/html/test
test1 test2

Показать разрешение для каталога /tmp.

ls -al /tmp
total 76
drwxrwxrwt 16 root    root    12288 Dec 10 18:39 .
drwxr-xr-x 23 root    root     4096 Dec  1 08:03 ..

. - текущий каталог /tmp, его разрешение 777 (rwxrwxrwx), почему не удается записать файл в каталог /tmp с помощью PHP?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Вы не делитесь с нами возвратом file_put_contents("/tmp/test",$str);, но я собираюсь предположить, что вы на самом деле пишете соответствующие байты.

В таком случае и с учетом разрешений выглядят нормально, и вы не говорите, что получаете сообщение об ошибке, наиболее вероятный сценарий - это проблема с настройкой systemd.

Ваш apache/ PHP-процесс правильно записывает данные в это местоположение, но systemd имеет параметр конфигурации, который позволяет каждому процессу иметь свой собственный каталог /tmp .

PrivateTmp=
    Takes a boolean argument. If true sets up a new file system
     namespace for the executed processes and mounts a 
     private /tmp directory inside it, that is not shared by     
     processes outside of the namespace. This is useful to secure 
     access to temporary files of the process, but makes sharing
     between processes via /tmp impossible. 

Defaults to false.

В этом случае tmp, который вы видите как обычный или root-пользователь, не совпадает с каталогом tmp, который видит apache / php.Подробнее об этом здесь, например .

Вы можете отключить настройку PrivateTmp для apache, но я думаю, что было бы проще выбрать другой путь для хранения ваших файлов, идать процессу apache / PHP разрешение на запись в него.

Могут быть и другие возможные объяснения невозможности записи в tmp, несмотря на разрешения каталога: например, этот каталог не был добавлен в директива open_basedir , или как-то атрибут неизменяемого каталога был установлен (очень маловероятно для /tmp).Но в любом из этих случаев вы получите сообщение об ошибке.

0 голосов
/ 14 декабря 2018

Возвращаемые значения метода file_get_contents объясняются на странице php manuel как Эта функция возвращает количество байтов, которые были записаны в файл, или FALSE при ошибке. Так что file_get_contents это должно быть возвращение.Во-первых, вы должны проверить, что это возвращает.

Во-вторых, вы хотите создать файл в папке, которая имеет разрешение только для пользователя root.У пользователя Apache нет прав root, поэтому вы не можете писать.Пожалуйста, проверьте этот url для разрешений, и я предлагаю вам быть осторожным при изменении разрешений папок.

...