2010-10-27 1 views
1

J'ai une petite application CGI basée sur Perl, que je cours dans l'espace web du projet fourni pour un projet SourceForge. Cette application stocke les données dans un fichier de base de données SQLite (v.Comment puis-je écrire dans un fichier de base de données SQLite dans l'espace Web d'un projet SourceForge?

Lorsque j'exécute des scripts de test à partir d'un shell, je peux lire et écrire dans ce fichier SQLite. Cependant, lorsque le code CGI est exécuté par Apache, il a un accès en lecture seule. opérations d'écriture entraînent une erreur de fichier journal:

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 

Pour des fins de test, j'ai coudés les autorisations pour ce fichier SQLite tout le chemin jusqu'à 777. Aucune différence.

Cependant, il y a des mises en garde amusantes sur l'espace web de projet de SourceForge, et je me demande si je suis perturbé par cela. Généralement, le système de fichiers du serveur Web principal est en lecture seule sur Apache. Si vous avez des fichiers qui doivent être accessibles en écriture au moment de l'exécution, vous devez les stocker dans un répertoire spécial "persistant" ailleurs ... et créer des liens symboliques à partir de votre espace web vers les fichiers sous ce répertoire.

Je l'ai fait, et les autorisations sont définies sur 777 pour le lien symbolique et le fichier SQLite réel sous l'emplacement "persistance". Je sais que ce mécanisme fonctionne en général, parce que je fais la même chose avec le cache et les fichiers journaux et ça marche. Je me demande s'il y a quelque chose de génial à propos de SQLite lui-même, dans le sens où il ne veut pas ouvrir un lien symbolique (plutôt qu'un fichier brut) pour l'écriture.

+0

Le répertoire parent brut dispose des droits d'accès "drwxrws-x". La commande chmod affiche "opération non autorisée" lorsque j'essaie de le modifier. –

+0

Pouvez-vous essayer le pragma pour définir temp_store sur MEMORY. "PRAGMA temp_store = MEMORY". http://www.sqlite.org/pragma.html#pragma_temp_store –

+0

Qu'a dit le support de SourceForge? –

Répondre

1

Je crois que la réponse à cette question est que cela ne peut être fait. Une recherche plus approfondie dans SQLite m'indique que le pilote doit obtenir un verrou sur le fichier de base de données avant de pouvoir effectuer des opérations d'écriture. Ce type de verrou ne peut pas être obtenu lorsque le fichier réel est sur une machine différente avec son système de fichiers croisé. Je crois que c'est le cas avec l'hébergement de l'espace web du projet SourceForge. Il semble que le répertoire "persistant" (accessible en écriture) se trouve réellement sur une machine totalement séparée du système de fichiers du serveur Web en lecture seule. En bref, si vous tombez sur cette question parce que vous rencontrez le même problème ... soit recherchez un hébergement d'espace Web différent, soit il est peut-être temps de retravailler votre application et de passer à MySQL ou un autre DB (SourceForge vous offre un hébergement MySQL gratuit de toute façon).

Questions connexes