我有一个基于 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 是只读的。如果您有需要在运行时可写的文件,您应该将它们存储在其他地方的特殊“持久”目录中......并从您的网络空间创建符号链接(symbolic link)到该目录下的实际文件。
我已经这样做了,并且“持久性”位置下的符号链接(symbolic link)和实际 SQLite 文件的权限都设置为 777。我知道这种机制通常是有效的,因为我对缓存和日志文件做同样的事情,它在那里工作。
我想知道 SQLite 本身是否有什么奇怪的地方,就像它不想打开符号链接(symbolic link)(而不是原始文件)进行编写一样。
最佳答案
我相信这个问题的答案是做不到。对 SQLite 的进一步研究告诉我,驱动程序必须先锁定数据库文件,然后才能执行任何写入操作。当实际文件位于另一台机器上且其文件系统交叉挂载时,无法获得这种类型的锁。
我相信 SourceForge 项目网络空间托管就是这种情况。看起来(可写的)“持久”目录实际上位于与只读 Web 服务器文件系统完全不同的机器上。
简而言之,如果您因为遇到同样的问题而偶然发现这个问题......要么寻找不同的网络空间托管,要么是时候重新设计您的应用程序并升级到 MySQL 或其他一些数据库( SourceForge 无论如何都会为您提供免费的 MySQL 托管)。
关于sqlite - 如何在 SourceForge 项目的 Web 空间中写入 SQLite 数据库文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4035032/