1

私は PHP が初めてで、Sqlite3 DB に裏打ちされた単純なスクリプトを作成する任務を負っています。スクリプトは完成し、機能していますが、プロセスの同期を処理する方法を見つけようとしています。

Sqlite3 は一般的なサーバー DB モデルではないため、DB にアクセスする各プロセスがファイルを開きます。そのため、PHP スクリプトに同時に要求が来ると、それぞれが DB ファイルを開こうとします。したがって、ここで何らかの同期が必要であると想定しています。

私の最初の考えはセマフォでした。ただし、次のコードは常に 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);
    }
}

これを同期する方法、または同期が必要な場合は誰か教えてください。

ところで、これはすべてnginxとphp5-fpmを使用してUbuntu 12.04で実行されています。

4

1 に答える 1

1

気にしないでください。SQLite クライアントとドライバーは同時実行をネイティブに処理します

于 2013-10-25T22:01:37.953 に答える