gpt4 book ai didi

php - 发送 SIGTERM 时,子进程是否关闭 mysql 连接?

转载 作者:行者123 更新时间:2023-11-29 04:16:07 25 4
gpt4 key购买 nike

请想象一下,一些子进程是由pcntl_fork()生成的,它们分别使用PDO打开mysql连接。如果父进程向子进程发送带有 posix_kill() 的 SIGTERM 信号,子进程将立即被杀死。

所以,我有一个关于这个的问题。子进程终止时,是否也会自动关闭mysql连接?还是应该调用 exit() 函数?

我知道如果发送 SIGKILL,子进程会保持连接。但是,我不知道 SIGTERM 的大小写。

最佳答案

当一个进程完成时(无论是因为它退出还是使用信号终止)它保持打开的所有文件和连接都会被操作系统自动关闭。它不是通过使用 MySQL 协议(protocol)来关闭连接(假设有一个)关闭干净的。它在 TCP/IP 层很简单,另一端的服务器发现它正在与一扇关闭的门对话。这并不总是立即发生,有时需要一些时间,直到服务器注意到讨论伙伴已经消失。发生这种情况时,它会认为连接已断开并清理其端的东西。

不要在使用fork()之前在父进程中打开MySQL连接。 fork() 复制用于管理本地连接的数据结构,结果不可预测。更重要的是,当子进程完成时(无论如何),它会关闭连接(或操作系统丢弃它),MySQL 服务器也会关闭它的端,父进程发现它正在与任何人对话。

在使用 fork() 之前关闭父进程中的 MySQL 连接,然后根据需要在父进程和子进程中打开单独的连接。

此外,将任何 MySQL 与服务器的通信包装在父进程之间:

pcntl_sigprocmask(SIG_BLOCK, array(SIGCHLD));

pcntl_sigprocmask(SIG_UNBLOCK, array(SIGCHLD));

否则,当子进程完成时,父进程会收到 SIGCHLD 信号。接收到的信号使它从休眠中恢复(如果它在信号到达时恰好在 sleep() 调用中停止)。 MySQL 库使用 sleep() 作为与服务器通信的 MySQL 协议(protocol)的一部分。如果这样的 sleep() 强制返回早于它应该返回的时间(因为接收到信号),MySQL 库会变得困惑并最终报告奇怪的错误(比如“MySQL 服务器消失了”)实际上是不正确的。

看看this answer以获得详细的解释。

关于php - 发送 SIGTERM 时,子进程是否关闭 mysql 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45104663/

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