2

我有一个基于 Perl 的小型 CGI 应用程序,我在为 SourceForge 项目提供的项目 Web 空间中运行它。此应用程序将数据存储在 SQLite (v. 3) 数据库文件中。

当我从 shell 运行测试脚本时,我可以读取和写入这个 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 服务器文件系统对 Apache 是只读的。如果您有需要在运行时可写的文件,您应该将它们存储在其他地方的特殊“持久”目录中......并从您的网络空间创建符号链接到该目录下的实际文件。

我已经这样做了,并且“持久性”位置下的符号链接实际 SQLite 文件的权限都设置为 777 。我知道这种机制通常是有效的,因为我对缓存和日志文件做同样的事情,它在那里工作。

我想知道 SQLite 本身是否有什么奇怪的地方,就像它不想打开符号链接(而不是原始文件)进行编写一样。

4

2 回答 2

1

我相信这个问题的答案是做不到。对 SQLite 的进一步研究告诉我,驱动程序必须先锁定数据库文件,然后才能执行任何写入操作。当实际文件位于另一台机器上且其文件系统交叉挂载时,无法获得这种类型的锁。

我相信 SourceForge 项目网络空间托管就是这种情况。看起来(可写的)“持久”目录实际上位于与只读 Web 服务器文件系统完全不同的机器上。

简而言之,如果您因为遇到同样的问题而偶然发现这个问题......要么寻找不同的网络空间托管,要么是时候重新设计您的应用程序并升级到 MySQL 或其他一些数据库( SourceForge 无论如何都会为您提供免费的 MySQL 托管)。

于 2010-10-28T11:15:12.310 回答
0

另一个问题是您是否拥有特定 db 文件的权限,但您无权在目录中创建临时文件。(混合权限,或过于严格的权限)

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

如果你不能写临时文件,那么你就不能对 sqlite 数据库文件进行任何写操作。如果您将其切换到 :memory: 数据库,您可以通过或使用@bob.faist 提到的编译指示PRAGMA 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 .

使用chmodsetfacl -m修复文件或文件夹以让您写入它们。

还要检查您的磁盘空间。

df -k

如果它显示您的数据库文件所在的分区或正在尝试写入其文件的分区已满,您也可能会遇到这类问题。

希望有帮助。

于 2018-05-31T19:49:08.150 回答