Работя върху това с часове и това ме побърква!
така че мисля, че е наистина трудно, следователно подробният въпрос.
Проблемът е че:
Имам сървър, който приема качване на публикации на файлове чрез php скрипт.
Данните ще бъдат разпределени на няколко диска.
Искам да запазя файла на правилния диск по време на качване (tmp файл).
защото:
Файлът трябва да бъде преместен по-късно и не искам да отнема много време (копирайте от системната tmp директория на целевия диск)
Системното устройство е ssd, което няма да е много щастливо, когато на него се записват и изтриват толкова много данни.
Тази конфигурация на сървъра променя първоначалната стойност. по време на качване можете да видите временния файл и да видите как неговият файлов размер се увеличава:
Alias /thundercloud /home/thundercloud
<Directory /home/thundercloud>
php_admin_value upload_tmp_dir /home/thundercloud/locations/42/tmp
</Directory>
Моите скриптове са в /home/thundercloud и има няколко символни връзки в /home/thundercloud/locations (наименувани цифрово 1-n), които всички сочат към съответните точки на монтиране.
Сега това, от което се нуждая, е да накарам числото 42 (което е диск номер 42 - не, има само 14 диска в сървъра, това е само за тест), за да бъде динамично.
Имам голям контрол върху заявката, така че по принцип не ме интересува дали се определя от име на хост, променлива за получаване, поддиректория и т.н.
Така че първият ми опит беше следният:
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>
съответната карта за пренаписване беше:
#!/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;
}
Изпъкнах твърдо 42. Ако работеше, щях да анализирам правилната стойност от THE_REQUEST
. Не проработи. скриптът беше chmod 777 и всичко.
Следващият ми опит беше:
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>
без късмет.
така че последният ми опит беше:
Alias /thundercloud /home/thundercloud
<Directory /home/thundercloud>
php_admin_value upload_tmp_dir /home/thundercloud/locations/%{REMOTE_HOST}/tmp
</Directory>
също няма късмет. отпечатах ini_get_all() и получих следния резултат:
["upload_tmp_dir"]=>
array(3) {
["global_value"]=>
string(47) "/home/thundercloud/locations/%{REMOTE_HOST}/tmp"
така че очевидно тази "константа" не е налична по този начин в този обхват
сега ми свършиха идеите
трябва да администрирам моите подходи са наистина проба-грешка.
някой може ли да ме насочи в правилната посока или да ми каже, че не е възможно и да го обоснове?
ps: очевидно не работи по време на изпълнение на php;)
редактиране:
Добре, след още няколко часа и полезен коментар от Marc B, измислих това „решение“:
<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>
Просто груба сила на собствен VirtualHost контейнер за всеки диск... грозно е и се надявах да избегна тази стъпка и да имам обща конфигурация на уеб сървъра, но изглежда като единствения начин - поне работи.
Все още се чудя дали има по-добър начин и мисля, че е много интересно да навляза толкова дълбоко в конфигурациите на уеб сървъра. Apache е невероятно гъвкав и става наистина интересен, когато го избутате до границите (така поне мисля).
Ето защо ще оставя този въпрос отворен и ще му дам награда.
редактиране:
След още малко проучване мисля, че може да има решение за прилагане на техниките тук: http://httpd.apache.org/docs/2.0/vhosts/mass.html
нещо като:
<VirtualHost *>
Use CanonicalName off
VirtualDocumentRoot /home/thundercloud/locations/%0/tmp/
php_admin_value open_basedir VIRTUAL_DOCUMENT_ROOT
<VirtualHost>
Това е само идея, все още не е тествана. все още се опитвам да го разбера. В този случай пътищата не са правилни, но може да има заобиколно решение със символни връзки. Ще бъде хубаво, ако някой може да ме насочи в правилната посока.