gpt4 book ai didi

php - 在 pcntl_fork 之后如何在父进程中保持我的 mysql 连接?

转载 作者:IT王子 更新时间:2023-10-29 00:37:07 26 4
gpt4 key购买 nike

众所周知,当您 fork 时, child 会获得所有内容的副本,包括文件和网络描述符 - man fork

在 PHP 中,当您使用 pcntl_fork 时,您使用 mysql_connect 创建的所有连接都会被复制,这有点问题 - php docsSO question .这种情况下的常识是关闭父连接,创建新连接并让子连接使用旧连接。但是,如果所说的 parent 需要在几秒钟内创建许多 child 怎么办?在这种情况下,您最终会创建负载 的新连接 - 每一组 fork 一个。

这在代码中意味着什么:

while (42) {

$db = mysql_connect($host, $user, $pass);

// do some stuff with $db
// ...

foreach ($jobs as $job) {
if (($pid = pcntl_fork()) == -1) {
continue;
} else if ($pid) {
continue;
}
fork_for_job($job);
}

mysql_close($db);
wait_children();
sleep(5);
}

function fork_for_job($job) {

// do something.
// does not use the global $db
// ...

exit(0);
}

好吧,我不想那样做 - 那就是与数据库的连接太多了。理想情况下,我希望能够实现类似于此的行为:

$db = mysql_connect($host, $user, $pass);

while (42) {

// do some stuff with $db
// ...

foreach ($jobs as $job) {
if (($pid = pcntl_fork()) == -1) {
continue;
} else if ($pid) {
continue;
}
fork_for_job($job);
}

wait_children();
sleep(5);
}

function fork_for_job($job) {

// do something
// does not use the global $db
// ...

exit(0);
}

你觉得可能吗?

一些其他的东西:

  • 这是 php-cli 脚本
  • 我已经尝试在第一个示例中使用 mysql_pconnect,但据我所知没有区别 - mysql 服务器接收尽可能多的新连接。也许那是因为它是 cli,而 pconnect 不像在 mod_php 中那样工作。 正如 Marc 所注意到的 - php-cli 中的 pconnect 没有意义。

最佳答案

您唯一可以尝试的就是让您的 child 等到其他 child 完成其工作。这样您就可以使用相同的数据库连接(前提是没有任何同步问题)。但是当然你会有很多进程,这也不是很好(根据我的经验,PHP 有相当大的内存使用)。如果让多个进程访问同一个数据库连接不是问题,您可以尝试创建共享连接的进程“组”。所以你不必等到每个工作完成(你可以在整个组完成时清理)并且你也没有很多连接..

您应该问问自己,您的工作进程是否真的需要数据库连接。为什么不让父级获取数据并将结果写入文件?

如果您确实需要联系,您应该考虑使用另一种语言来完成这项工作。 PHPs cli 本身不是一个“典型”用例(它是在 4.3 中添加的)并且多处理更像是一种 hack 而不是受支持的功能。

关于php - 在 pcntl_fork 之后如何在父进程中保持我的 mysql 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5733236/

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