- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个旧的“PHPDBG”函数,可以让我“printf”到一个文本文件。
我一直拥有 PHPDBG.inc(至少从 PHP 4.x 开始),但它在我当前的配置(ubuntu18、Apache 2.4)中似乎不起作用.29 和 PHP 7.2)。
具体来说:
error_get_last()
或 $php_errormsg
获取任何有意义的信息。 测试代码如下:
测试.php:
<?php
function PHPDBG ($s) {
$fp = fopen ("/tmp/PHPDBG.txt", "a");
if ($fp) {
// Successful open ... but nothing written!
fputs($fp, $s . "\n");
fclose($fp);
} else {
echo "<h3>FILE OPEN ERROR</h3>\n";
echo "<p>" . print_r(error_get_last()) . "</p>\n";
echo "<p>" . $php_errormsg . "</p>\n";
}
}
PHPDBG('>>Hello');
phpinfo();
PHPDBG('<<Goodbye');
?>
问题:
Q1:知道 $fp = fopen ("/tmp/PHPDBG.txt", "a");
有什么问题吗?
问题 2:如果“fopen()”失败,我该怎么做才能得到有意义的错误消息?
附加信息:假设 error_get_last()
返回“1: EPERM 1/* Operation not permitted */”,然后我手动创建了/tmp/PHPDBG.txt,chmod +rw,并尝试再次“test.php”。不行:我得到了完全相同的结果:$fp 为空,没有有意义的错误消息,并且/tmp/PHPDBG.txt 没有改变:
root@ubuntu18:/tmp# umask 0
root@ubuntu18:/tmp# touch PHPDBG.txt
root@ubuntu18:/tmp# ls -l PHPDBG.txt
-rw-rw-rw- 1 root root 0 Mar 5 18:13 PHPDBG.txt
<= Re-ran test here... failed exactly like before...
root@ubuntu18:/tmp# ls -l PHPDBG.txt
-rw-rw-rw- 1 root root 0 Mar 5 18:13 PHPDBG.txt
补充说明:
Ibu 指出了我发布的代码的原始版本中的一个愚蠢的拼写错误。哎呀!它在最后一刻悄悄出现,错别字不是问题。我仍然无法在/tmp 中“fopen()”一个文件并从 PHP 7.2 写入它。我曾经能够在早期(更早!)版本的 PHP 中执行此操作。
我只是仔细检查了一下:如果文件恰好位于本地目录中,我AM 能够写入该文件:
// $fp = fopen ("/tmp/PHPDBG.txt", "a"); // Opens, but fails to write anything
$fp = fopen ("PHPDBG.txt", "a"); // Works OK
更新
“它曾经有效”的原因是 systemd 被引入(较新版本的)Linux,并带来了“PrivateTmp”。
我的解决方法是禁用 Apache/PHP 的这个“特性”。我编辑了 /etc/systemd/system/multi-user.target.wants/apache2.service
如下:
[Service]
...
PrivateTmp=true <-- Changed this to "false"
附加说明是 here .
最佳答案
我找到了好像没有创建的文件:
PHP 代码:$fp = fopen ("/tmp/PHPDBG.txt", "a");
预期位置:/tmp/PHPDBG.txt
。
实际位置:/tmp/systemd-private-c6f7629309e647818680f8a6ee1105d6-apache2.service-lGKGc6/tmp/PHPDBG.txt
相关链接:
所以这听起来像是某种 systemd“功能”(Grrr!!!!)。这解释了为什么它“曾经有效”(在以前版本的 Apache、PHP 和 Linux 中)。
解决方法
我编辑了/etc/systemd/system/multi-user.target.wants/apache2.service
:
[Service]
...
PrivateTmp=true <-- Changed this to "false"
关于php - 为什么 PHP 7.2 fopen(/tmp, a) 不写入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55014399/
我是一名优秀的程序员,十分优秀!