如何在SourceForge项目的Web空间中写入SQLite数据库文件?

时间:2010-10-27 15:41:01

标签: sqlite sourceforge

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

当我从shell运行测试脚本时,我可以读取和写入此SQLite文件。但是,当Apache执行CGI代码时,它具有只读访问权限。写操作导致日志文件错误:

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是​​只读的。如果你的文件需要在运行时可写,你应该将它们存储在别处的特殊“持久”目录中......并从你的web空间创建符号链接到该目录下的实际文件。

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

我想知道SQLite本身是否有任何奇怪的东西,而且不想打开符号链接(而不是原始文件)进行写作。

2 个答案:

答案 0 :(得分:1)

我相信这个问题的答案是无法做到的。对SQLite的进一步研究告诉我,驱动程序必须先锁定数据库文件才能执行任何写操作。当实际文件位于其文件系统交叉安装的其他计算机上时,无法获得此类型的锁定。

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

简而言之,如果你因为遇到同样的问题而偶然遇到这个问题......要么寻找不同的网络空间托管,要么可能是时候重新启动应用程序并升级到MySQL或者某些其他DB(SourceForge无论如何都为你提供免费的MySQL托管)。

答案 1 :(得分: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

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

希望有所帮助。