1

我是 PHP 新手,我的任务是编写一个由 Sqlite3 DB 支持的简单脚本。该脚本已完成且正在运行,但我正在尝试弄清楚如何处理进程同步。

由于 Sqlite3 不是典型的服务器 DB 模型,因此每个访问 DB 的进程都会打开文件。因此,如果同时请求进入我的 PHP 脚本,每个请求都会尝试打开数据库文件。因此,我假设我在这里需要某种同步。

我最初的想法是信号量。但是,以下代码在 sem_acquire 上总是失败:

if($semaphone = sem_get(112233))
{
    if(sem_acquire($semaphore))
    {
        if($db = new SQLite3("mydb.sqlite"))
        {
            ...
            $db->close();
        }

        flock($lock, LOCK_UN);
    }
}

由于我是 PHP 新手,我不知道如何找出 sem_acquire 失败的原因。我怀疑我的 PHP 可能没有用系统 V 资源编译。

接下来我决定尝试羊群。我尝试了以下代码,但它不起作用。当我尝试访问我的 PHP 脚本时,我什么也得不到(就好像我的脚本没有运行,或者它崩溃了):

if($lock = fopen("abc123", "w+"))
{
    if(flock($lock, LOCK_EX))
    {
        if($db = new SQLite3("mydb.sqlite"))
        {
            ...
            $db->close();
        }

        flock($lock, LOCK_UN);
    }
}

拜托,谁能告诉我如何同步这个,或者是否需要同步?

顺便说一句,我正在运行这一切都在 Ubuntu 12.04 w/nginx 和 php5-fpm 上运行。

4

1 回答 1

1

不要打扰,SQLite 客户端和驱动程序原生处理并发

于 2013-10-25T22:01:37.953 回答