php无法生成类似.pid的标识进程的临时文件

本文探讨了在PHP与C语言中,文件句柄对unlink操作的影响差异。通过示例代码展示了当文件被打开并保持句柄时,两种语言下unlink的行为不同:C语言中文件不会立即删除,而PHP则会报权限错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在linux C编程里,大家都知道在一个进程里建立一个文件,保持打开状态,然后unlink掉文件,它并不实际删除,而是等到进程结束时,所有的fd都关闭了,才真正清除掉。
在php里,用同样的操作方法想得到一个标识一个进程尚在运行的pid文件,未果!
在php里,如果创建一个文件,并保留此文件的引用指针,则无法unlink文件,会报错:Warning: unlink Permissdenied。如果不保留文件指针或将其unset掉,则文件立即删除了,而不是等到进程结束。也就是,同C编程相比,php不允许删除尚有引用指针的文件。
下面是php和C的代码:
php:

<?php
$filename = "/tmp/test_php.pid";
$fp = fopen($filename, 'w');
//unset($fp);
unlink($filename);
sleep(6);

C:

#include <stdio.h>

int main()
{
char *filename = "/tmp/test_c.pid";
FILE *fp;
fp = fopen(filename, "w");
unlink(filename);
sleep(6);
}

[19-Jul-2025 02:06:28] NOTICE: using inherited socket fd=7, "/tmp/php-cgi-74.sock" [19-Jul-2025 02:06:28] NOTICE: using inherited socket fd=7, "/tmp/php-cgi-74.sock" [19-Jul-2025 02:06:28] NOTICE: fpm is running, pid 9880 [19-Jul-2025 02:06:28] NOTICE: ready to handle connections [19-Jul-2025 04:30:01] NOTICE: Reloading in progress ... [19-Jul-2025 04:30:01] NOTICE: reloading: execvp("/www/server/php/74/sbin/php-fpm", {"/www/server/php/74/sbin/php-fpm", "--daemonize", "--fpm-config", "/www/server/php/74/etc/php-fpm.conf", "--pid", "/www/server/php/74/var/run/php-fpm.pid"}) [19-Jul-2025 04:30:01] NOTICE: using inherited socket fd=7, "/tmp/php-cgi-74.sock" [19-Jul-2025 04:30:01] NOTICE: using inherited socket fd=7, "/tmp/php-cgi-74.sock" [19-Jul-2025 04:30:01] NOTICE: fpm is running, pid 16670 [19-Jul-2025 04:30:01] NOTICE: ready to handle connections [20-Jul-2025 04:30:01] NOTICE: Reloading in progress ... [20-Jul-2025 04:30:01] NOTICE: reloading: execvp("/www/server/php/74/sbin/php-fpm", {"/www/server/php/74/sbin/php-fpm", "--daemonize", "--fpm-config", "/www/server/php/74/etc/php-fpm.conf", "--pid", "/www/server/php/74/var/run/php-fpm.pid"}) [20-Jul-2025 04:30:01] NOTICE: using inherited socket fd=7, "/tmp/php-cgi-74.sock" [20-Jul-2025 04:30:01] NOTICE: using inherited socket fd=7, "/tmp/php-cgi-74.sock" [20-Jul-2025 04:30:01] NOTICE: fpm is running, pid 81380 [20-Jul-2025 04:30:01] NOTICE: ready to handle connections 是什么意思
07-22
<think>我们正在处理关于PHP-FPM日志内容解读的问题。用户询问了日志中出现的两个特定条目:"NOTICE: using inherited socket"和"Reloading in progress"的含义。 根据引用内容,我们可以看到在PHP-FPM的日志中出现了这些条目,特别是在执行`kill -USR2`信号(用于优雅重载)之后。现在,我们来解释这两个日志条目的含义: 1. **"Reloading in progress ..."**: - 当向PHP-FPM主进程发送`SIGUSR2`信号时,会触发一个优雅重载(graceful reload)。这个过程包括重新加载所有工作进程以及重新加载PHP-FPM的配置文件(和二进制文件,如果支持的话)。 - 日志中的"Reloading in progress"表明主进程已经接收到`SIGUSR2`信号,并开始执行重载操作。 2. **"using inherited socket ..."**: - 在重载过程中,新的主进程会继承旧主进程监听的套接字(socket)。这样做的好处是,在重载期间,服务不会中断,因为新的工作进程可以直接使用已经存在的套接字来接受连接。 - 例如,在引用[5]中,我们看到日志记录:"using inherited socket fd=8, '10.30.60.87:9000'",这表示新的PHP-FPM进程继承了文件描述符(fd)为8的套接字,该套接字绑定在IP地址10.30.60.87的9000端口上。 综上所述: - "Reloading in progress"表示PHP-FPM正在执行重载操作。 - "using inherited socket"表示新的PHP-FPM进程继承了旧进程的监听套接字,从而能够无缝地继续处理请求。 这些日志条目是正常重载过程中的信息性消息,表明重载操作正在按预期进行。 现在,根据指令,我们需要在回答中自然地添加引用标识。由于我们的解释基于提供的引用,特别是引用[5]中展示了这两个日志条目,因此我们在相关解释后添加引用。 此外,根据指令,我们需要生成相关问题。 因此,我们的回答结构如下: 1. 解释"Reloading in progress" 2. 解释"using inherited socket" 3. 总结 4. 生成相关问题 注意:我们使用中文回答,并且数学表达式(如果有)需要按照要求使用$...$或$$...$$。但在这个问题中,没有数学表达式,所以不需要。 最后,生成相关问题。</think>### PHP-FPM 日志内容解读 #### 1. `NOTICE: using inherited socket` 的含义 当 PHP-FPM 主进程接收到 `SIGUSR2` 信号执行优雅重载(graceful reload)时,新启动的 PHP-FPM 进程会**继承旧进程的监听套接字**(如 `fd=8`)。这表示: - 新进程直接复用原有网络端口(如 `10.30.60.87:9000`) - 服务不会中断,现有连接能继续处理 - 实现零停机更新配置或二进制文件[^5] 例如日志: ```log [26-Jun-2017 14:00:48] NOTICE: using inherited socket fd=8, "10.30.60.87:9000" ``` #### 2. `Reloading in progress` 的含义 此日志条目表示 PHP-FPM 主进程**正在执行重载操作**,通常在以下场景出现: - 收到 `SIGUSR2` 信号触发优雅重载 - 重新加载配置文件(如 `php-fpm.conf`) - 重启工作进程(workers) - 更新 PHP 二进制文件(如果支持) 例如日志: ```log [26-Jun-2017 14:00:48] NOTICE: Reloading in progress ... [26-Jun-2017 14:00:48] NOTICE: reloading: execvp("/usr/sbin/php-fpm", {"/usr/sbin/php-fpm", "--daemonize"}) ``` #### 完整日志流程示例 当执行 `sudo kill -USR2 <php-fpm-pid>` 时: ```log [26-Jun-2017 14:00:48] NOTICE: Reloading in progress ... # 开始重载 [26-Jun-2017 14:00:48] NOTICE: reloading: execvp(...) # 启动新进程 [26-Jun-2017 14:00:48] NOTICE: using inherited socket fd=8... # 继承套接字 [26-Jun-2017 14:00:48] NOTICE: fpm is running, pid 12696 # 新进程就绪 [26-Jun-2017 14:00:48] NOTICE: ready to handle connections # 恢复服务 ``` #### 信号处理总结 | 信号 | 作用 | 日志特征 | |------------|--------------------------|------------------------------| | `SIGUSR2` | 优雅重载(配置/二进制) | `Reloading in progress` | | `SIGQUIT` | 优雅停止 | `Finishing... exiting` | | `SIGTERM` | 立即终止 | `Terminating... exiting` |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值