【发布时间】:2020-07-10 08:19:33
【问题描述】:
我有一个带有 PHP pgm 的 HTML 表单,用于将结果写入文件。我基本上是从网上复制的。这不是火箭手术。它在具有最新 Raspbian 的 Raspberry Pi 上运行 PHP 7。 PHP pgm 报告该文件是可写的,它成功了,等等,但该文件仍然是空的。我已将权限更改为 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 个字节(“测试”),并且真的只想写
编辑 3: 全新的卡,全新的安装,同样的结果。 8^( 我认为我的下一步是使用不同的 Raspberry Pi,尽管我不确定硬件可能是什么问题。注意:我可以从命令行在 /tmp 中创建文件。
哦,新开发 -- 我创建了一个新文件夹 /home/www,将其权限设置为 777,它确实成功地在其中创建了文件。 /tmp 的权限是 drwxrwxrwt,它由 root/root 拥有。 webserver/php 用户是 www-data。我可以将其用作解决方法,但在我的书中并不理想。有没有比 /tmp 更好的地方来放置不同用户/pgms 需要访问的东西?
有什么想法吗?我应该看什么?
【问题讨论】:
-
您好:您的 PHP 错误日志中有什么内容?
-
/var/log/apache2/error.log 中没有任何内容(除了我之前尝试各种疯狂的事情时)。是否还有其他日志文件要检查?
-
/tmp FS 已满?尝试手动将文件写入/tmp/file.txt,
cat > /tmp/file.txt... -
我检查了 /tmp 目录 -- 我将一个 6k 文件复制到 /tmp 并且很好...我只是(当前)尝试写入 7 个字节(“测试”)。
-
检查您的 Pi 的 SD 卡。我有一个表现出类似行为的人,结果发现卡文件系统已损坏。具体来说,似乎所有写入都在工作,但在重新启动后,根本没有写入任何更改。
标签: php raspberry-pi file-handling