在apache2中动态设置upload_tmp_dir

| 我为此工作了几个小时,这让我发疯了! 所以我认为这是一个非常艰巨的任务,因此提出了详细的问题。 问题是: 我有一台服务器,可以通过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。如果可以,我会从ѭ3解析正确的伪造。那没起效。脚本是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容器...这很丑陋,我希望避免这一步,并拥有通用的Web服务器配置,但这似乎是唯一的方法-至少可以正常工作。 我仍然想知道是否有更好的方法,我认为深入研究Web服务器配置非常有趣。 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>
这只是一个想法,尚未测试。仍在设法弄清楚。在这种情况下,路径不正确,但是可能存在符号链接的解决方法。如果some1可以指出正确的方向,那将会很好。
已邀请:
php_admin_value
设置中无法使用变量替换。这仅仅是因为apache模块只能解析它们自己的config指令。 mod_rewrite支持使用环境变量,因为这样做是内置在mod_rewrite本身中的。 因为您不能使用变量,所以必须使用ѭ10来设置所有可能的值。例如:
RewriteEngine on
RewriteRule /upload(\\d+)$       /upload.php

php_admin_value upload_tmp_dir /tmp

<Location /upload1>
    php_admin_value upload_tmp_dir /tmp/1
</Location>
<Location /upload2>
    php_admin_value upload_tmp_dir /tmp/2
</Location>
....
<Location /upload100>
    php_admin_value upload_tmp_dir /tmp/100
</Location>
然后,您只需张贴到
/upload{$id}
。显然,它不如可能进行替换时动态地好。有两种明显的方法可以使其更整洁: 1)有一个单独的生成脚本,该脚本会生成一个文件并放入
/etc/httpd/conf.d
,并为每个服务器添加相关行 2)创建一个通用配置文件,例如100个位置规则。然后,在每台服务器上,您只需要设置所需的符号链接,并让生成表格的PHP决定将上载指向哪个卷-您将得到一堆
/uploadX
网址,不能在每台服务器上工作,但是无论如何都不会在那发布任何内容。 替代方法是使用mod_macro,该方法基本上可以使您执行与上述相同的操作,但配置文件较小,可以自动生成扩展的配置,但实际上仍然只是生成带有大量虚拟主机/位置块的大型配置文件。要像您最初要求的那样完美地执行此操作,您需要修改mod_php。
如果我正确理解了问题,则可以随时使用ini_set
ini_set (\"upload_tmp_dir\", \"/home/thundercloud/locations/42/tmp\"); 

要回复问题请先登录注册