gpt4 book ai didi

php pcntl_fork() : Use of parent's sqlite3 object in childs?

转载 作者:行者123 更新时间:2023-12-03 17:48:57 27 4
gpt4 key购买 nike

我在这里读到,文件描述符和数据库连接在由 fork() 创建的父级和子级之间共享,这可能会导致问题。

哪些是有问题的条件?

我想 fork() 多个 child 并在每个 child 中使用相同的 SQLITE3 数据库。

使用在 fork() 之前创建的一个 SQLITE3 对象是否可以保存?
这个对象被复制给了 child ,但这意味着什么?

所有 child 都可以使用他们的父对象副本同时访问同一个数据库(读取和写入)吗?

<?
$db = new SQLite3("file.sqlite");

for( $i=0; $i<10; $i++ ) {

$p = fork();

// As a child:
if( !$p ) {

// do some reads/writes
$db->query("SELECT a,b, FROM T..");

$db->query("INSERT INTO T SELECT ...");
$db->query("UPDATE T SET a=5 WHERE ...");

exit(0);
}
}
?>

还是每个 child 都需要创建自己的对象(并分别连接到数据库)?我可以/我是否必须关闭每个 child 与 parent 的联系?
<?
$db = new SQLite3("file.sqlite");

for( $i=0; $i<10; $i++ ) {

$p = fork()

// As a child:
if( !$p ) {

// Is this necessary?
$db->close();
$mydb = new SQLite3("file.sqlite");

// do some reads/writes
$mydb->query("SELECT a,b, FROM T..");

$mydb->query("INSERT INTO T SELECT ...");
$mydb->query("UPDATE T SET a=5 WHERE ...");

exit(0);
}
}
?>

最佳答案

当 fork 必须访问相同的 SQLite 文件时,不要在 fork 代码中使用 SQLite(或任何其他基于文件的数据库系统)。

如果您写入 SQLite 数据库,则 SQLite 库必须锁定整个文件。当写操作完成时,锁被释放。其他进程必须等到这个锁被释放才能写入这个数据库。

在您的示例中,SQLite 序列化了所有 fork 。所有这些都必须等到最后一个 fork 完成写入数据库。

您应该使用一些“真正的”数据库系统,如 MySQL 或 PostgreSQL,而不是 SQLite。

关于php pcntl_fork() : Use of parent's sqlite3 object in childs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20425511/

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