Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在与systemd请求的位置不同的位置创建的临时文件_Php_Fopen_Systemd_Temp - Fatal编程技术网

Php 在与systemd请求的位置不同的位置创建的临时文件

Php 在与systemd请求的位置不同的位置创建的临时文件,php,fopen,systemd,temp,Php,Fopen,Systemd,Temp,我尝试使用fopen(“name”,“a”)创建跟踪文件并写入该文件,但尽管fopen成功并返回句柄,并且所有的fwrite调用都成功,但我无法在fopen的file name参数指定的位置找到该文件 $trace = fopen("/var/tmp/billing.log", "a"); if ($trace) echo "opened /var/tmp/billing.log<br>\n"; else echo "unable to open /var/

我尝试使用fopen(“name”,“a”)创建跟踪文件并写入该文件,但尽管fopen成功并返回句柄,并且所有的fwrite调用都成功,但我无法在fopen的file name参数指定的位置找到该文件

$trace      = fopen("/var/tmp/billing.log", "a");
if ($trace)
    echo "opened /var/tmp/billing.log<br>\n";
else
    echo "unable to open /var/tmp/billing.log<br>\n";
...
fwrite($trace, __FILE__ . ': ' . __LINE__ . "ce(" .
    "\$aid=$aid, " .
    "\$level=$level, " .
    "\$id=$id, " .
    "\$mode=$mode, " .
    "\$nocache=$nocache)\n");
echo __FILE__ . ': ' . __LINE__ . "ce(" .
    "\$aid=$aid, " .
    "\$level=$level, " .
    "\$id=$id, " .
    "\$mode=$mode, " .
    "\$nocache=$nocache)<br>\n";
因此,允许写入目录。我通过以下方式手动创建文件对此进行了测试:

cat > /var/tmp/test
在使用systemd的系统上,这似乎是PHP的一个缺乏文档记录或解释的特性。而不是在我指定的PHP中创建文件,而是在private目录中再创建一层

$ cd /var/tmp
$ sudo find -name *.log
[sudo] password for jcobban: 
./systemd-private-DGOkBT/tmp/recur-billing.log
./systemd-private-DGOkBT/tmp/process-registration.log
./systemd-private-uEF6lO/tmp/recur-billing.log
./systemd-private-uEF6lO/tmp/billing.log
./systemd-private-uEF6lO/tmp/process-registration.log
$ ls systemd-private-uEF6lO/
ls: cannot open directory systemd-private-uEF6lO/: Permission denied
注意,我必须使用sudo来查看文件,因为我没有使用PHP进程的userid运行。这是PHP决定使用systemd的私有临时目录服务的结果。PHP文档中似乎没有描述此操作。如果调用函数sys\u get\u temp\u dir,它甚至会谎报临时文件的位置。请注意,使用私有临时目录的决定不会影响PHP脚本本身,因为临时文件名始终是映射的。从脚本的角度来看,文件位于程序指定的位置。即fopen(“/var/tmp/billing.log”,“r”);将读取该文件。问题只在于临时文件的外部可见性。我还没有检查,但我怀疑在Windows上,PHP会将/tmp和/var/tmp映射到Windows临时目录C:\Windows\Temp\以便于移植

这是一种痛苦,因为为了使这些跟踪文件对外部分析可见,我现在必须定义并管理我自己的目录以将跟踪文件放入其中,这一操作很复杂,因为在我的站点上“DOCUMENT_ROOT”不是有效路径,所以我必须找出文档根的实际路径

$document_root  = substr(__FILE__, 0, -strlen($_SERVER['PHP_SELF']));
$trace      = fopen($document_root . "/log/billing.log", "a");
实际上,这是一个systemd安全功能:

您可以为特定的httpd服务禁用它。在Arch Linux上:

juergen@samson:/tmp → grep PrivateTmp /usr/lib/systemd/system/httpd.service 
PrivateTmp=true
juergen@samson:/tmp → grep PrivateTmp /usr/lib/systemd/system/httpd.service 
PrivateTmp=true