私は 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で実行されています。