2010-10-27 36 views
1

我有一個小的基於Perl的CGI應用程序,我在爲SourceForge項目提供的項目網站空間中運行該應用程序。此應用程序將數據存儲在SQLite(v。3)數據庫文件中。如何在SourceForge項目的網頁空間中寫入SQLite數據庫文件?

當我從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的本身,沿着它的線條不想打開一個符號鏈接(而不是原始文件)進行寫入。

+0

原始父目錄具有權限「drwxrws - x」。當我嘗試修改這個命令時,chmod命令顯示「操作不允許」。 – 2010-10-27 16:14:28

+0

您可以嘗試使用pragma將temp_store設置爲MEMORY。 「PRAGMA temp_store = MEMORY」。 http://www.sqlite.org/pragma.html#pragma_temp_store – 2010-10-27 19:40:55

+0

SourceForge支持說什麼? – 2010-10-28 03:36:14

回答

1

我相信這個問題的答案是它不能做到。對SQLite的進一步研究告訴我,驅動程序在執行任何寫入操作之前必須先鎖定數據庫文件。當實際文件位於其文件系統交叉安裝的不同計算機上時,無法獲得此類鎖。

我相信這是SourceForge項目網絡空間託管的情況。它看起來像(可寫)「永久」目錄實際上是在一個完全獨立的機器上,而不是隻讀的Web服務器文件系統。

總之,如果您在這個問題絆倒,因爲你有同樣的問題...無論是尋找不同的網絡空間託管,否則它可能是時候重新工作,你的應用程序,並加緊對MySQL或一些其他的數據庫(SourceForge無論如何都給你免費的MySQL託管)。

相關問題