SQLiteはクライアント/サーバ型のDBMSではないため、
複数のWebサーバがあって、それぞれ同時にアクセスするような
データベースを使いたいときには困ってしまいます。
そして SQLiteはNFSサーバ上に置かれたDBファイルをサポート
していないため、使うことができません。
…というのが一般的な説明で、SQLiteのHPにもそのように書いて
あるんですが、実は環境によってきちんと使えます。
恐らく、Linuxのディストリビューションやカーネルのバージョンに
よって、NFSの実装が違うためと思います。要は、NFSできちんと
flock()関数が動作するようになっていれば良いわけで、その辺り
の実装は年々良くなってきています。
だから↓こんな書き込みをしながら
<?
$db = sqlite_open('/hoge/test.sq3db');
sqlite_query($db, 'create table test_table( test_col int )');
sqlite_query($db, 'create index table_idx1 on test( a )');
$result = sqlite_query($db, "begin transaction;");
for( $i=0; $i<1000000; $i++ ){
$result = sqlite_query($db, "insert into test_table values( $i )");
}
$result = sqlite_query($db, "commit;");
?>
↓こんな読み取りをしてみても、問題ありません。
<?
$db = sqlite_open('/hoge/test.sq3db');
for( $i=0; $i<10000; $i++ ){
$result = sqlite_query($db, 'SELECT count(*) FROM test_table;');
var_dump(sqlite_fetch_array($result));
}
?>
読み取り側ではきちんとロック待ちもされますし、ロックが取得できた
段階で処理も続行されます。書き込み時間が長ければロック取得
タイムアウトも出ます。