définir dynamiquement upload_tmp_dir dans apache2

Je suis en train de travailler sur cela pendant des heures et sa me rend fou!

donc je pense que c'est vraiment difficile d'où la question détaillée.

Le problème est:

  • J'ai un serveur qui accepte les fichier post le téléchargement par le script php.

  • Les données sont distribuées sur plusieurs disques.

  • Je veux enregistrer le fichier sur le disque droit pendant le téléchargement (fichier tmp).

Parce que:

  • Le fichier doit être déplacé plus tard, et je ne veux pas que ça à faire de longs (copie à partir des systèmes répertoire tmp de disque cible)

  • Le système de disque est un ssd qui ne sera pas très heureux lorsque les données sont écrites et effacées sur elle.

Ce serveur de fichier de configuration pour modifier la valeur initiale. lors d'un chargement un peut voir le fichier temp et de voir comment sa taille augmente:

Alias /thundercloud /home/thundercloud
<Directory /home/thundercloud>
    php_admin_value upload_tmp_dir /home/thundercloud/locations/42/tmp
</Directory>

Mon sripts sont en /home/nuage orageux et il y a plusieurs liens symboliques dans /home/nuage orageux/emplacements (nommé numériquement 1-n), la fonction des points de montage.

Maintenant ce que j'ai besoin est d'obtenir le numéro 42 (qui est un disque pas. 42 - pas il y a seulement 14 disques dans le serveur, dis sa juste pour le test) pour être dynamique.

J'ai beaucoup de contrôle sur la demande, donc en gros, je ne se soucient pas de savoir si ses déterminé par le nom d'hôte, de prendre des variables, sous-répertoire etc.

Donc ma première tentative a été ceci:

RewriteLock /var/lock/apache2/rewrite.lock
Alias /thundercloud /home/thundercloud
RewriteMap getuplaodlocation prg:/home/thundercloud/uploadloc.php
RewriteEngine On
<Directory /home/thundercloud>
    AllowOverride All
    php_admin_value upload_tmp_dir ${getuplaodlocation:%{THE_REQUEST}}
</Directory>

le correspondant de la carte de réécriture a été:

#!/usr/bin/php
<?
set_time_limit(0); # forever program!
$keyboard = fopen("php://stdin","r");
while (1) {
    $line = trim(fgets($keyboard)); //dont care for now
    echo '/home/thundercloud/locations/42/tmp'.PHP_EOL;
}

Je jut codé en dur 42. si cela a fonctionné, je voudrais avoir analysé le bon falue de THE_REQUEST . Il n'a pas de travail. le script a été chmod 777 et tout et tout.

Ma prochaine tentative:

Alias /thundercloud /home/thundercloud
<Directory /home/thundercloud>
    SetEnvIfNoCase Host lionel\.2x\.to upload=/home/thundercloud/locations/42/tmp
    php_admin_value upload_tmp_dir upload
</Directory>

pas de chance.

ma dernière tentative a été:

Alias /thundercloud /home/thundercloud
<Directory /home/thundercloud>
    php_admin_value upload_tmp_dir /home/thundercloud/locations/%{REMOTE_HOST}/tmp
</Directory>

pas de chance non plus. j'ai imprimé ini_get_all() et a obtenu les résultats suivants:

["upload_tmp_dir"]=>
  array(3) {
    ["global_value"]=>
    string(47) "/home/thundercloud/locations/%{REMOTE_HOST}/tmp"

alors, évidemment, cette "constante" n'est pas disponible, comme dans cette portée

maintenant, j'ai manqué d'idées

je dois avouer mon apporaches sont vraiment d'essai et d'erreur.

anyony peut me pointer dans la bonne direction ou me dire ce n'est pas possible et justifier?

ps: il est évident qu'elle ne fonctionne pas lors de l'exécution de php 😉

edit:

Ok après quelques heures de plus et un utile commentaire de Marc B, je suis venu avec cette "solution":

<VirtualHost *:80>
    ServerName 42.thundercloud.lionel.2x.to
    DocumentRoot /home/thundercloud
    php_admin_value upload_tmp_dir /home/thundercloud/locations/42/tmp
</VirtualHost>
<VirtualHost *:80>
    ServerName 43.thundercloud.lionel.2x.to
    DocumentRoot /home/thundercloud
    php_admin_value upload_tmp_dir /home/thundercloud/locations/43/tmp
</VirtualHost>

La force brutale juste un conteneur VirtualHost pour chaque disque... c'est moche et j'espère éviter cette étape et ont un générique du serveur web de config, mais il semble que la seule façon d'aller - au moins il fonctionne.

Je me demande encore si theres une jolie manière et je pense que c'est très intéressant d'aller si profond dans les configurations de serveur. Apache est incroyablement flexible et sa devient vraiment intéressant quand vous pousser à la limite (c'est au moins ce que je pense).

C'est pourquoi je vais laisser cette question ouverte et de mettre un bounty sur elle.

edit:

Après un peu plus de recherche, je pense qu'il y a peut être une solution en appliquant les techniques ici:
http://httpd.apache.org/docs/2.0/vhosts/mass.html

quelque chose comme:

<VirtualHost *> 
Use CanonicalName off
VirtualDocumentRoot /home/thundercloud/locations/%0/tmp/
php_admin_value open_basedir VIRTUAL_DOCUMENT_ROOT
<VirtualHost>

C'est juste une idée, pas encore testé. toujours essayer de le comprendre. Les chemins ne sont pas correctes dans ce cas, mais il y a peut être une solution de contournement avec des liens symboliques. Ce serait bien si some1 pouvait me diriger dans la bonne direction.

  • Une raison quelconque vous souhaitez téléchargement différentes dirs? PHP cède d'ores et déjà un nom aléatoire pour les fichiers temporaires, de sorte que deux ou plusieurs mises à jour sont peu susceptibles de piétiner les uns les autres. Comme pour Apache variables, celles qui s'appliquent uniquement à certains domaines en particulier pour les attendre. php_value/php_admin_value n'est pas l'un d'eux.
  • dans ce cas, différents répertoires sont différents disques durs physiques. j'ai indiqué les raisons de la question (pas redondant de la copie de fichiers). en fait, les téléchargements ne sont pas rare mais impossible de collied par leur nom (en supposant que vous n'avez pas un réseau partagé, le montage de répertoire temp pour plusieurs serveurs, ou quelque chose).
  • Gotcha. Seule chose que je peux penser est la configuration d'un serveur virtuel pour chaque disque et utiliser une règle de réécriture de re-router les uploads comme ils viennent dans. Ensuite, vous pouvez coder en dur le tmp chemin d'accès dans chaque serveur virtuel sans avoir recours à des variables. Sauf si vous êtes ajout de disques à un taux furieux ou leurs noms changent fréquemment, il est peut-être juste assez pour travailler.
  • oui je pense que trop. le problème est de ma conception actuelle, les emplacements ne sont pas 1-n sur chaque serveur, mais chaque disque dans le nuage entier a son propre id, donc ils peuvent se développer assez grand et j'aimerais configurer le serveur virtuel pour chaque serveur et il aurait besoin de beaucoup d'entretien. j'espérais avoir un générique config pour tous les serveurs, mais le appraoch de sens, dois penser qu'à travers un peu plus. maby je peux modifier ma base de données mise à dientify disques différemment.
  • pourquoi cela a été voté pour les supprimer? je vois apache/php questinos tout le temps ici et je pense qu'ils appartiennent ici. je certainement ne pense pas que cela devrait être migrés pour les webmasters. si certains endroit, puis serverfault, mais je pense qu'il appartient plus ici que sur le serveur faute, parce que c'est vraiment aproblem au niveau de l'application.
  • Le vote (pas le mien) est pour une simple "hors sujet" la fermeture, pas de migration.
  • si vous cliquez sur le bouton "voter lien de la rubrique" vous voyez qu'il a été coulé "appartient à webmasters.stackexchange.com Q&A pour les webmasters pro"
  • Pour la masse virtualHosting, jetez un oeil à mod_macro vous serez en mesure d'écrire tous vos VH avec des commandes simples comme "l'Utilisation MyVHOSt 42.somwhere.com dir42"
  • merci, je dois vérifier que les +1 @regilero
  • J'ai fait quelques tests, combinant mod_macro et LocationMatch ou d'un Emplacement spécifique directives, mais pas de chance pour l'instant, il y a beaucoup de solutions pour les variables de configuration, mais pas beaucoup pour les différentes configurations...

InformationsquelleAutor The Surrican | 2011-04-18