gpt4 book ai didi

php - 为什么 PHP 7.2 fopen(/tmp, a) 不写入文件?

转载 作者:可可西里 更新时间:2023-11-01 00:28:30 24 4
gpt4 key购买 nike

我有一个旧的“PHPDBG”函数,可以让我“printf”到一个文本文件。

我一直拥有 PHPDBG.inc(至少从 PHP 4.x 开始),但它在我当前的配置(ubuntu18、Apache 2.4)中似乎不起作用.29 和 PHP 7.2)。

具体来说:

  • 我无法打开文件($fp 为空)...
  • /tmp/PHPDBG.txt 永远不会被创建(因为 fopen 失败)
  • /tmp 应该是世界可写的...和...
  • 我似乎无法在 Apache error.log 中获取 PHP 错误,也无法从 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

补充说明:

  1. Ibu 指出了我发布的代码的原始版本中的一个愚蠢的拼写错误。哎呀!它在最后一刻悄悄出现,错别字不是问题。我仍然无法在/tmp 中“fopen()”一个文件并从 PHP 7.2 写入它。我曾经能够在早期(更早!)版本的 PHP 中执行此操作。

  2. 我只是仔细检查了一下:如果文件恰好位于本地目录中,我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 .

最佳答案

我找到了好像没有创建的文件:

  1. PHP 代码:$fp = fopen ("/tmp/PHPDBG.txt", "a");

  2. 预期位置:/tmp/PHPDBG.txt

  3. 实际位置:/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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com