2

私は小さなPerlベースのCGIアプリケーションを持っており、SourceForgeプロジェクト用に提供されたプロジェクトWebスペースで実行しています。このアプリケーションは、SQLite(v。3)データベースファイルにデータを保存します。

シェルからテストスクリプトを実行すると、このSQLiteファイルの読み取りと書き込みができます。ただし、CGIコードがApacheによって実行される場合、読み取り専用アクセス権があります。書き込み操作により、ログファイルエラーが発生します。

error.log.web-2:[Wed Oct 27 14:40:22 2010] [error] [client 127.0.0.1] DBD::SQLite::db do failed: unable to open database file

テストの目的で、そのSQLiteファイルのアクセス許可を777まで上げました。違いはありません。

ただし、SourceForgeのプロジェクトWebスペースにはいくつかの面白い警告があり、私はそれにつまずいているのではないかと思います。通常、メインのWebサーバーファイルシステムはApacheに対して読み取り専用です。実行時に書き込み可能にする必要のあるファイルがある場合は、それらを別の場所にある特別な「永続的」ディレクトリに保存し、Webスペースからそのディレクトリの下の実際のファイルへのシンボリックリンクを作成する必要があります。

私はこれを行い、「persistence」の場所にあるシンボリックリンクと実際のSQLiteファイルの両方のアクセス許可を777に設定しました。キャッシュファイルとログファイルで同じことを行っており、そこで機能するため、このメカニズムは一般的に機能することを知っています。

書き込み用に(生のファイルではなく)シンボリックリンクを開きたくないという方針に沿って、SQLite自体に何かファンキーなものがあるのではないかと思います。

4

2 に答える 2

1

この質問に対する答えは、それができないということだと思います。SQLiteをさらに調査すると、ドライバーは書き込み操作を実行する前にデータベースファイルをロックする必要があることがわかりました。このタイプのロックは、実際のファイルがファイルシステムがクロスマウントされた別のマシンにある場合は取得できません。

これはSourceForgeプロジェクトのWebスペースホスティングの場合だと思います。(書き込み可能な)「永続的な」ディレクトリは、実際には読み取り専用のWebサーバーファイルシステムとは完全に別のマシン上にあるように見えます。

つまり、同じ問題が発生しているためにこの質問に遭遇した場合は、別のWebスペースホスティングを探すか、アプリを作り直してMySQLまたは他のDBにステップアップする時期かもしれません(とにかくSourceForgeは無料のMySQLホスティングを提供します)。

于 2010-10-28T11:15:12.310 に答える
0

もう1つの問題は、特定のdbファイルに対するアクセス許可はあるが、ディレクトリに一時ファイルを作成するためのアクセス許可がない場合です。(混合されたアクセス許可、または制限が厳しすぎるアクセス許可)

https://www.sqlite.org/tempfiles.html

一時ファイルを書き込めない場合は、sqliteデータベースファイルに書き込めません。:memory:データベースに切り替えると、@ bob.faistPRAGMA temp_store = MEMORYで言及されているプラ​​グマを使用するか、使用することができますが、実際には、可能であれば、パーミッションの問題を診断して修正する必要があります。

これらのコマンドを使用して、これらのファイルの場所に書き込む権限があるかどうかを確認してください。

ls -l app.db
getfacl app.db
ls -l -d .  # check the directory to see if you can write the temp files there
getfacl .

chmodまたはを使用setfacl -mしてファイルまたはフォルダーを修正し、それらに書き込むことができるようにします。

ディスクスペースも確認してください。

df -k

データベースファイルが配置されているパーティション、またはファイルを書き込もうとしているパーティションがいっぱいであることが示されている場合は、このような問題が発生する可能性もあります。

お役に立てば幸いです。

于 2018-05-31T19:49:08.150 に答える