Почему PHP считает, что пишет в файл, но это не так? - PullRequest
5 голосов
/ 30 марта 2020

У меня есть форма HTML, в которой есть PHP pgm для записи результатов в файл. Я в основном скопировал его из Интернета. Это не ракетная операция. Он работает с PHP 7 на Raspberry Pi с самым последним Raspbian. ПГМ PHP сообщает, что файл доступен для записи, что он успешно выполнен и т. Д., Но файл остается пустым. Я изменил разрешения на 777 (для тестирования), и это не помогает. Я в тупике. Вот HTML:

<!DOCTYPE html>
<html>
<head>
<title>Update</title>
</head>
<body>
<FORM NAME ="form1" METHOD ="POST" action="filewrite.php">
<INPUT TYPE = "TEXT" VALUE ="memory" NAME="memory">
<INPUT TYPE = "TEXT" VALUE ="desc"   NAME="desc">
<INPUT TYPE = "TEXT" VALUE ="comm"   NAME="comm">
<INPUT TYPE = "TEXT" VALUE ="reset"  NAME="reset">
<INPUT TYPE = "Submit" Name = "Submit1" VALUE = "Create">
</FORM>
</body>
</html>

Вот PHP (в filewrite. php):

<?php
ini_set('display_errors', true);

if(isset($_POST['memory']) && isset($_POST['desc']) && isset($_POST['comm']) && isset($_POST['reset']))
{
#    $data = $_POST['memory'] . '\t' . $_POST['desc']  . '\t' . $_POST['comm']  . '\t' . $_POST['reset'] . "\n";
    $data = "testing";
    $file = "/tmp/data.txt";

var_dump($_POST);

    if (is_writable($file)) {
       echo nl2br("\n\nThe file is writable\n\n");
    } else {
       echo nl2br("The file is not writable\n\n");
    }

    touch($file);
    $ret = file_put_contents($file, $data, LOCK_EX);
    if($ret === false)
    {
        die('There was an error writing this file');
    }
    else
    {
        echo nl2br("$ret bytes written to file\n");
        echo nl2br("data = $data\n");
        echo nl2br("file = $file\n");
    }
}
else
{
   die('no post data to process');
}

?>

Вот что я получаю в качестве вывода:

array(5) { ["memory"]=> string(4) "fred" ["desc"]=> string(6) "barney" ["comm"]=> string(5) "wilma" ["reset"]=> string(5) "betty" ["Submit1"]=> string(6) "Create" }

The file is writable

7 bytes written to file
data = testing
file = /tmp/data.txt

и вот файл:

-rwxrwxrwx 1 pi pi 0 Mar 29 16:43 /tmp/data.txt

Я пробовал без существующего файла и с ним там. Сначала я пытался записать данные формы в файл, но затем переключился на то, чтобы просто написать «тестирование». Я пробовал другие каталоги для файла, но они (как и ожидалось) потерпели неудачу из-за разрешений.

Редактировать: Когда я попытался записать файл в / home / pi (который я ожидал потерпеть неудачу, поскольку веб-сервер www-data), я получил эту ошибку в / var / log / apache2 / error.log:

[Sun Mar 29 17:04:24.648150 2020] [php7:warn] [pid 12075] [client fe80::cceb:ba3c:da1d:6b2a:53052] PHP Warning:  file_put_contents(/home/pi/data.txt): failed to open stream: Permission denied in /var/www/html/filewrite.php on line 19, referer: http://devberry-pi.local/rwupdate.html

Установка его обратно в /tmp/data.txt очистила эту ошибку (и другие ошибки не генерируются.)

Редактировать 2: Я скопировал файл 6k в / tmp, чтобы убедиться, что места достаточно, и это сработало нормально. На данный момент я пишу только 7 байтов («тестирование») и действительно хочу записать <80b, как только я получу его работу. Кроме того, это новая установка, на которой есть только несколько небольших страниц (которые я написал). </p>

Редактировать 3: Совершенно новая карта, новая установка, те же результаты. 8 ^ (Я думаю, что мой следующий шаг - это другой Raspberry Pi, хотя я не уверен, каким может быть проблема с оборудованием. Примечание: я могу создавать файлы в / tmp из командной строки.

Ооо, новая разработка - я создал новую папку, / home / www, установил ее права доступа 777 и он успешно создал файл там . Разрешения для / tmp: drwxrwxrwt и он принадлежит пользователю root / root. Пользователь веб-сервера / php www-data. Я могу использовать это в качестве обходного пути, но в моей книге это не идеально. Есть ли лучшее место, чем / tmp, чтобы поместить материал, который Разные пользователи / программы должны иметь доступ?

Есть мысли? На что мне смотреть?

...