Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为Apache/PHP中的特定脚本设置更高的内存限制、post\u max\u大小?_Php_Apache_Memory - Fatal编程技术网

如何为Apache/PHP中的特定脚本设置更高的内存限制、post\u max\u大小?

如何为Apache/PHP中的特定脚本设置更高的内存限制、post\u max\u大小?,php,apache,memory,Php,Apache,Memory,我有一个web应用程序,它将所有到虚拟主机的请求重定向到控制器,然后控制器根据URL决定要包含和运行哪些文件。有一个web服务通过POST接受大型XML文件。我需要该应用程序的内存限制和post最大值为~32M,但接受XML的服务除外,它需要它们的限制接近1024Mini\u集('memory\u limit','1024M')在脚本中起作用,但不适用于post\u max\u大小 我似乎不知道怎么做。我试过类似的方法: <VirtualHost *:80> ServerName t

我有一个web应用程序,它将所有到虚拟主机的请求重定向到控制器,然后控制器根据URL决定要包含和运行哪些文件。有一个web服务通过POST接受大型XML文件。我需要该应用程序的内存限制和post最大值为~32M,但接受XML的服务除外,它需要它们的限制接近1024M
ini\u集('memory\u limit','1024M')
在脚本中起作用,但不适用于post\u max\u大小

我似乎不知道怎么做。我试过类似的方法:

<VirtualHost *:80>
ServerName test.com
DocumentRoot /var/www/test.com/html


php_admin_value include_path .:/var/www/test.com/includes:/var/www/test.com/includes/libs

php_value session.use_only_cookie 1
<Location />
    php_value memory_limit 32M
    php_value post_max_size 30M
    php_value upload_max_filesize 29M
</Location>
<Location /services/big-service>
    php_value memory_limit 1024M
    php_value post_max_size 128M
</Location>

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/(.*)$
RewriteCond %{REQUEST_URI} !^/(.*)(html|gif|jpg|png|ico|css|js|dtd|swf|flv|xml)$
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^/(.*)$ /Controller.php/$1 [PT]

</VirtualHost>

ServerName test.com
DocumentRoot/var/www/test.com/html
php_admin_值include_path.:/var/www/test.com/includes:/var/www/test.com/includes/libs
php\u值会话。仅使用\u\u cookie 1
php_值内存_限制32M
php_值后最大尺寸30M
php\u值上传\u最大\u文件大小29M
php_值内存_限制1024M
php_值post_最大尺寸128M
重新启动发动机
RewriteCond%{REQUEST_URI}^/(.*)请求$
重写cond%{REQUEST_URI}^/(*)(html | gif | jpg | png | ico | css | js | dtd | swf | flv | xml)$
重写cond%{SCRIPT_FILENAME}-D
重写cond%{SCRIPT_FILENAME}-F
重写规则^/(.*)$/Controller.php/$1[PT]
因此,在上面的配置中,如果Controller.php

<?php
echo '<pre>';
var_dump(ini_get('memory_limit'));
var_dump(ini_get('post_max_size'));
var_dump(ini_get('upload_max_filesize'));

由于您要在运行时决定客户端要查找哪个web服务,因此您只能做一些事情。您不能使用多个php.ini文件,因为一旦php执行脚本,您就会被实例使用的.ini文件卡住

在这种情况下,最好的办法是在php.ini中设置更大的限制,然后在脚本中使用ini_set()指令降低该限制。如果这是不可接受的,那么最好只将post_max_size设置为更大的限制,然后在脚本中分别设置其他限制


问题是,当PHP开始执行您的脚本时,它已经从PHP.ini读取了它的post_max_大小,并且数据已经发布到您的服务器,因此如果超过此限制,您的脚本甚至不会执行。

AFAIK PHP.ini是每个PHP实例(php5_模块)一个,您可以解决您的问题 通过运行其中几个

  • 由于php5_模块是每个apache一个,所以一个解决方案是运行 另一个Apache实例。问题是它不能在同一端口80中运行

  • 设置FCGI以解析php和php5_模块。 通过这种方式,您可以为每个应用程序提供不同的启动参数。你需要 将脚本重命名为.php以外的名称,以便fcgi进行解析(.fcgi-maybe)

  • 样品

    RewriteEngine On
    RewriteCond %{REQUEST_URI} ^/services/(.*)$
    RewriteCond %{REQUEST_URI} !^/(.*)(html|gif|jpg|png|ico|css|js|dtd|swf|flv|xml)$
    RewriteCond %{SCRIPT_FILENAME} !-d
    RewriteCond %{SCRIPT_FILENAME} !-f
    RewriteRule ^/(.*)$ /ControllerBig.php/services/$1 [PT]
    
    LoadModule fcgid_module modules/mod_fcgid.so
    LoadModule php5_模块c:/apps/php/php5apache2_2.dll
    AddHandler应用程序/x-httpd-php.php
    PHPIniDir“C:/apps/php/ini”
    AddHandler fcgid script.fcgi
    fcgidenv PHPRC“c:/apps/php/ini2”
    FcgidWrapper“c:/apps/php/php cgi.exe”。fcgi
    AddType应用程序/x-httpd-fcgi.fcgi
    

    不确定此设置的防崩溃性如何,但是,您可以设置一个新的基于名称的virtualhost(因此使用另一个DNS)来处理相同的配置,并对内存限制进行一些更改

    这意味着您的/services/big服务的应用程序url应始终使用此不同的DNS(并且您的应用程序应检查这些服务是否始终取自正确的url)

    php_值设置可以由VirtualHost设置,因此它应该可以工作。如果您检查,您将看到内存限制不在PERDIR范围内,因此您不能仅为目录设置它,只能为完整的VirtualHost设置它。使用PERDIR范围,a
    可能能够捕获该内容,而不是
    (但无论如何,您可能需要对主index.php文件进行mod_重写,因此它始终位于同一目录中)

    使用2 DNS解决方案,您仍然存在一个大问题,您的一些apache进程可能会消耗1024M的RAM,稍后它们将用于更简单的请求,但仍然使用此RAM。因此,您必须经常清理apache子进程(例如,MaxRequestPercild到100)


    即使使用Fcgid的php fpm解决方案,如果没有mod_php,您的php脚本也会消耗大量RAM,这并不是最好的做法(您应该测试当10%/30%/50%的客户端请求使用这些服务时,RAM会发生什么变化,以及您的php RAM使用情况如何清理-或者不清理)。您应该检查该组件,它应该可以作为带有Zend_缓存元素的库组件使用,它将为您管理“将内存交换到缓存”,避免在您的大型服务中使用过多的RAM。

    问题是mod_rewrite导致它始终转到/Controller.php,因此服务的位置块从未使用过。我们正在删除附加的mod_重写规则

    <?php
    require_once('Controller.php');
    
    然后让ControllerBig成为控制器的克隆

    <VirtualHost *:80>
    ServerName test.com
    DocumentRoot /var/www/test.com/html
    
    php_admin_value include_path .:/var/www/test.com/includes:/var/www/test.com/includes/libs
    
    php_value session.use_only_cookie 1
    <Location />
        php_value memory_limit 32M
        php_value post_max_size 30M
        php_value upload_max_filesize 29M
    </Location>
    <Location /services/big-service>
        php_value memory_limit 1024M
        php_value post_max_size 128M
    </Location>
    
    RewriteEngine On
    
    RewriteCond %{REQUEST_URI} ^/services/(.*)$
    RewriteCond %{REQUEST_URI} !^/(.*)(html|gif|jpg|png|ico|css|js|dtd|swf|flv|xml)$
    RewriteCond %{SCRIPT_FILENAME} !-d
    RewriteCond %{SCRIPT_FILENAME} !-f
    RewriteRule ^/(.*)$ /ControllerBig.php/services/$1 [PT]
    
    RewriteCond %{REQUEST_URI} ^/(.*)$
    RewriteCond %{REQUEST_URI} !^/(.*)(html|gif|jpg|png|ico|css|js|dtd|swf|flv|xml)$
    RewriteCond %{SCRIPT_FILENAME} !-d
    RewriteCond %{SCRIPT_FILENAME} !-f
    RewriteRule ^/(.*)$ /Controller.php/$1 [PT]
    
    </VirtualHost>
    

    我怀疑这是否行得通。因为重定向总是转到Controller.php,我认为Apache不支持基于位置的各种php.ini值


    如果/services/big service是一个目录,那么接受PHP的值是有意义的,我建议您使用一个通用的PHP.ini值,或者创建一个目录并编写一个.htaccess来拥有自己的PHP设置。

    是的,post\u max\u大小大于内存限制是一个问题,因为这将导致致命的内存耗尽当一根大柱子经过时。
    <VirtualHost *:80>
    ServerName test.com
    DocumentRoot /var/www/test.com/html
    
    php_admin_value include_path .:/var/www/test.com/includes:/var/www/test.com/includes/libs
    
    php_value session.use_only_cookie 1
    <Location />
        php_value memory_limit 32M
        php_value post_max_size 30M
        php_value upload_max_filesize 29M
    </Location>
    <Location /services/big-service>
        php_value memory_limit 1024M
        php_value post_max_size 128M
    </Location>
    
    RewriteEngine On
    
    RewriteCond %{REQUEST_URI} ^/services/(.*)$
    RewriteCond %{REQUEST_URI} !^/(.*)(html|gif|jpg|png|ico|css|js|dtd|swf|flv|xml)$
    RewriteCond %{SCRIPT_FILENAME} !-d
    RewriteCond %{SCRIPT_FILENAME} !-f
    RewriteRule ^/(.*)$ /ControllerBig.php/services/$1 [PT]
    
    RewriteCond %{REQUEST_URI} ^/(.*)$
    RewriteCond %{REQUEST_URI} !^/(.*)(html|gif|jpg|png|ico|css|js|dtd|swf|flv|xml)$
    RewriteCond %{SCRIPT_FILENAME} !-d
    RewriteCond %{SCRIPT_FILENAME} !-f
    RewriteRule ^/(.*)$ /Controller.php/$1 [PT]
    
    </VirtualHost>