- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在基于 CentOS7 的 Docker 容器中运行 php-fpm 应用。
因为我使用的是 Docker,所以我必须将所有进程的日志输出写入 PID 1 的输出。这样 Docker 引擎就可以获取日志以供以后处理(因此它们显示在 docker logs
中)。
我可以通过将所有日志写入 /proc/1/fd/2
来实现这一点,在任何应用程序中都不会出现问题。我可以用 nginx 做到这一点,只需执行 echo "test">/proc/1/fd/2
就可以很好地显示 docker logs
。
但是使用 php 软件我想做同样的事情,写入 /proc/1/fd/2
但是无论我做什么,我似乎都无法获取文件流它。
PHP-FPM 产生许多子进程。因此,我必须显式写入 PID 1 的标准输出!
所以我正在做这样的事情:
$handle = fopen("/proc/1/fd/2", "w");
fwrite($handle, $msg);
fclose($handle);
我刚得到 Warning: fopen(/proc/1/fd/2): failed to open stream: No such file or directory
NOTE: I have also tried this with https://www.php.net/manual/en/function.file-put-contents.php and the same result happens. It's essentially a wrapper for fopen, fwrite, fclose.
我试着把它扔到一个符号链接(symbolic link)上:
bash-4.2$ ls -l /tmp/stdout
lrwxrwxrwx. 1 nginx nginx 12 Apr 10 11:19 /tmp/stdout -> /proc/1/fd/2
然后将方法指向它,如 fopen("/tmp/stdout", "w");
我得到完全相同的错误Warning: fopen(/tmp/stdout): failed to open stream: No such file or directory
这是我需要写入的输出:
bash-4.2$ ls -l /proc/1/fd/2
l-wx------. 1 nginx nginx 64 Apr 10 11:21 /proc/1/fd/2 -> pipe:[3523867]
我可以使用我尝试过的任何其他应用程序(包括 nginx 和 bash)毫无问题地(直接或通过符号链接(symbolic link))写入它。
PHP 进程以拥有输出流的同一用户身份运行
bash-4.2$ ps -ef
UID PID PPID C STIME TTY TIME CMD
nginx 1 0 0 11:21 ? 00:00:00 php-fpm: master process (/etc/php-fpm.conf)
nginx 7 1 0 11:21 ? 00:00:00 php-fpm: pool www
nginx 8 1 0 11:21 ? 00:00:00 php-fpm: pool www
nginx 9 1 0 11:21 ? 00:00:00 php-fpm: pool www
nginx 10 1 0 11:21 ? 00:00:00 php-fpm: pool www
nginx 11 1 0 11:21 ? 00:00:00 php-fpm: pool www
nginx 12 1 0 11:21 ? 00:00:00 php-fpm: pool www
bash-4.2$ ls -l /proc/1/fd/2
l-wx------. 1 nginx nginx 64 Apr 10 11:21 /proc/1/fd/2 -> pipe:[3523867]
我试着给它一些疯狂的权限,他们不接受:
bash-4.2$ chmod 777 /proc/1/fd/2
bash-4.2$ ls -l /proc/1/fd/2
l-wx------. 1 nginx nginx 64 Apr 10 11:21 /proc/1/fd/2 -> pipe:[3523867]
这是 /dev/
目录,我不能使用它们,因为它们指向 proc/self
而不是 /proc/1
:
lrwxrwxrwx. 1 root root 11 Apr 10 11:21 core -> /proc/kcore
lrwxrwxrwx. 1 root root 13 Apr 10 11:21 fd -> /proc/self/fd
crw-rw-rw-. 1 root root 1, 7 Apr 10 11:21 full
drwxrwxrwt. 2 root root 40 Apr 10 11:21 mqueue
crw-rw-rw-. 1 root root 1, 3 Apr 10 11:21 null
lrwxrwxrwx. 1 root root 8 Apr 10 11:21 ptmx -> pts/ptmx
drwxr-xr-x. 2 root root 0 Apr 10 11:21 pts
crw-rw-rw-. 1 root root 1, 8 Apr 10 11:21 random
drwxrwxrwt. 2 root root 40 Apr 10 11:21 shm
lrwxrwxrwx. 1 root root 15 Apr 10 11:21 stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Apr 10 11:21 stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Apr 10 11:21 stdout -> /proc/self/fd/1
I tried changing
/dev/fd
symlink to point to/proc/1/fd/2
and then trying to write tophp://fd/2
and it also didn't work, same error.
最佳答案
php-fpm 在 nginx
用户下运行,我打赌 nginx 用户没有访问 /proc/1/fd/2
要查看 nginx 用户可以走多远,运行:
sudo -u nginx /bin/sh -c 'namei -l /proc/1/fd/2'
我敢打赌它不会达到 2,namei 会告诉您错误发生的位置,修复您的权限。
记录一下,当我在 Debian Linux 系统上运行它时,我得到:
root@x2ratma:~# sudo -u www-data /bin/sh -c 'namei -l /proc/1/fd/2'
f: /proc/1/fd/2
drwxr-xr-x root root /
dr-xr-xr-x root root proc
dr-xr-xr-x root root 1
dr-x------ root root fd
2 - Permission denied
告诉我 www-data
用户没有对/proc/1/fd 文件夹的读取权限。 (一个肮脏的快速修复是:sudo chmod a+rx/proc/1/fd
这意味着 给每个人读取/proc/1/fd 的权限
)
关于Docker 中的 PHP - fopen() 或 file_put_contents() 无法写入/proc/1/fd/2 以进行标准输出写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55619229/
我想在我的 cpp 函数中调用 fopen,但是,Rcpp 总是提示“没有匹配的函数来调用‘fopen’”。所以完全复制了 https://github.com/hadley/xml2/blob/93
我想在我的 cpp 函数中调用 fopen,但是,Rcpp 总是提示“没有匹配的函数来调用‘fopen’”。所以完全复制了 https://github.com/hadley/xml2/blob/93
我正在使用本教程 http://papermashup.com/caching-dynamic-php-pages-easily/用于缓存页面 /* Heres where you put your
我在 Wordpress 上工作,我对 PHP 几乎一无所知。我正在尝试让带有帖子摘录的滚动条正常工作,但它使用了 fopen() 但它在我客户的主机上已关闭。 $f = fopen( $url, '
我有一个基本程序,旨在复制 bash 的 cp 命令的功能。我正在为 UNIX 和 Windows 开发一个副本。我的 UNIX 版本运行良好,但是,我发现 Windows 不支持 fopen() 的
在我的网站上,用户填写表格进行注册,然后该信息会添加到数据库中。我也试图将信息写入 CSV 文件。到目前为止我的代码给了我这个错误: 警告:fopen() [function.fopen]:第 122
我正在尝试学习 C。函数 Foo 的目标是接受一个字符串,更改其中的一些字符,然后查看是否存在具有该名称的文件。如果存在这样的文件,则在 STDOUT 上打印它的内容。 听起来很简单而且应该很简单,但
我目前有一些未压缩的代码读取文件,它使用以下方法在C++中读取文件 FILE* id = fopen("myfile.dat", "r"); 获得id后,代码的不同部分使用fread、fseek等访问
My last question作为背景。我试图环绕“fopen()”,但 gcc 给了我这个错误,而“remove()”没有问题。 错误:“fopen”的类型冲突fopen(const char *
好的,所以我正在学习 Docker,并且我正在尝试部署一个带有指向我的服务器的子域(其域是从另一个提供商处购买的)的测试应用程序。服务器已经具有非 dockerized Nginx 设置,可以完美地服
我需要在我的系统 verilog 代码中打开一个文件,我需要知道它对我的相对路径才能使用 $fopen。所以首先,我需要知道我的立场。有没有办法知道我当前的目录路径? (通过使用 $display 或
我的网站被一个脚本小子攻击得非常成功。在自动的基础上,一个隐藏的脚本在我的服务器上被访问,导致我所有的 index.php 文件被修改,并在它们的顶部添加一个 iframe(base 64 编码)。
我尝试通过fopen("serial port path", "+w")打开串口 并通过fileno()获取文件描述符。 之后,我调用了 tcsetattr() 但它生成了一个错误,显示 Inappr
在下面的声明中: $handle = fopen('./readme.txt'); $handle 是什么变量?是 bool 值还是什么? 在运行这两个不同的语句后我有疑问: if($handle)
我是一名 PHP 学习者,我正在处理文件,但我无法在自己的服务器中打开文件,因为出现“权限被拒绝”错误。我正在使用 fopen()功能:fopen('file.txt', 'r+'); 我在 Cent
我需要打开一个文件,替换一些内容(12345 为 77348)并保存。据我所知 $cookie_file_path=$path."/cookies/shipping-cookie".$unique;
我有一个巨大的二进制文件,有 2148181087 字节 (> 2gb) 我正在尝试执行 fopen (file, "r") 但失败了 Can not open: xyz file (Value to
我的桌面上有一个名为 fun 的文本文件,但是当我通过时: FILE* fp; if((fp = fopen("/Users//Desktop/fun", "r")) == NULL) { p
我有一个名为 denem.txt 的文件并且有内容 123456789 123456789 123456789 当我们以“a+b”模式打开文件时,PHP 应该将指针指向文件末尾,这意味着当我尝试使用
我想知道是否有人可以通过 Matlab fopen 命令阐明以下问题: >> [stat myjob] = unix('echo $PBS_NODEFILE'); % gets PBS file na
我是一名优秀的程序员,十分优秀!