代码之家  ›  专栏  ›  技术社区  ›  Steve Perkins

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

  •  2
  • Steve Perkins  · 技术社区  · 15 年前

    当我从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
    

    然而,对于SourceForge的project web空间有一些有趣的警告,我想知道我是否被它绊倒了。通常,主web服务器文件系统对Apache是只读的。如果有需要在运行时可写的文件,应该将它们存储在其他地方的特殊“持久”目录中。。。并创建从web空间到该目录下实际文件的符号链接。

    我已经这样做了,并且对两个符号链接的权限都设置为777

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

    2 回复  |  直到 15 年前
        1
  •  1
  •   Steve Perkins    15 年前

    我认为这个问题的答案是做不到。对SQLite的进一步研究告诉我,驱动程序必须在执行任何写操作之前锁定数据库文件。当实际文件位于另一台交叉挂载其文件系统的计算机上时,无法获取此类型的锁。

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

    简而言之,如果你偶然发现这个问题是因为你有同样的问题。。。要么寻找不同的web空间托管,要么是时候重新运行你的应用程序,升级到MySQL或其他一些数据库(SourceForge给你免费的MySQL托管)。

        2
  •  0
  •   phyatt    8 年前

    另一个问题是,如果您对特定的db文件有权限,但您没有在目录中创建临时文件的权限。(混合权限,或限制性太强的权限)

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

    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 .
    

    使用 chmod setfacl -m 修复文件或文件夹,使您可以写入它们。

    df -k
    

    如果显示数据库文件所在的分区或试图将其文件写入的分区已满,也可能会出现此类问题。

    推荐文章