PHPからSQLite3のDBファイル処理時に「SQLSTATE[HY000]: General error: 8 attempt to write a readonly database, referer:〜」というエラーが発生したので、その時の調査内容を簡単にまとめています。
※ 本ページはプロモーションが含まれています。
Webサーバ(Apache + PHPという構成)でPHPからSQLite3のファイルDBを使っていたのですが、ある時SQLite3のファイルを変更したらエラーが発生して正常に動作しなくなってしまったので、その時調査した事と解決方法について書いています。
◾️動作環境とバージョン情報です
OS:CentOS7
Apache:2.4
PHP:7.4
訳あってSQLite3のDBファイルを変更したら、PHPからSQLite3へのDB処理時にエラーが発生するようになりました。(サーバのターミナル上でsqlite3コマンドでSQLite3のファイルDBに接続して、DBのデータを見たり(select)書き込んだり(insert)はできる。)
具体的にはPHPからSQLite3にデータを書き込む処理、つまりInsert SQLが実行された時にエラーが発生しているようで、PHPでSQLite3処理時に例外が発生したらログファイルにエラーログを残すようにしていました。
その時の簡略化したPHPのコードです。
try {
//SQLite3接続処理コードは省略
〜
//insertクエリの実行
$stmt = $pdo->prepare("insert into hogetable(〜) values (〜)");
$stmt->execute([〜]);
〜
} catch (Exception $e) {
//エラーログファイル(/var/log/httpd/error_log)へ出力
error_log("[insert hogetable error!] ". $e->getMessage(), 0);
}
私の環境ではログファイルの/var/log/httpd/error_logに出力するようになっていて、このログファイルの中を見たらそれっぽいエラーメッセージを発見。
〜
[insert hogetable error!] SQLSTATE[HY000]: General error: 8 attempt to write a readonly database, referer:
〜
ん?なんか"readonly database"と書いてあるね。どうやらSQlite3のDBファイルが読み込み専用になってるみたいです。
SQLite3のDBファイルのパーミッション(アクセス権)を確認してみたら、確かにその他ユーザーの権限が読み込みだけになっていました。
$ ls -lht
-rw-r--r-- 1 hogeuser hogeuser 16K 5月 24 16:21 hogedb.sqlite3
という事で、chmondコマンドでその他ユーザグループに書き込み権限も追加します。
$ chmod 646 hogedb.sqlite3
再度パーミッションの確認。
$ ls -lht
-rw-r--rw- 1 hogeuser hogeuser 16K 5月 24 16:26 hogedb.sqlite3
これでPHPからの動作確認をしたら、正常に動作するようになりました!