5 Stimmen

Wie kann man ein höheres memory_limit, post_max_size und für ein bestimmtes Skript in Apache/PHP einstellen?

Ich habe eine Webanwendung, die alle Anforderungen an den virtuellen Host an einen Controller umleitet, der dann entscheidet, welche Dateien auf der Grundlage der URL einzuschließen und auszuführen sind. Es gibt einen Webdienst, der große XML-Dateien per POST annimmt. Ich brauche die memory_limit und post_max_ zu ~32M für die app, außer für den Dienst, der die XML akzeptiert, die ihre Grenzen näher an 1024M sein müssen. ini_set('memory_limit','1024M') funktioniert innerhalb des Skripts, aber nicht für die post_max_size.

Ich kann nicht herausfinden, wie man das macht. Ich habe etwas Ähnliches wie das hier versucht:

<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>

Wenn also die Controller.php mit der obigen Konfiguration wie folgt aussieht

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

I Zeichenfolge(3) "32M" Zeichenfolge(3) "30M" Zeichenfolge(3) "29M"

wenn ich besuche http://test.com y http://test.com/services/big-service aber ich würde gerne die höheren Grenzwerte für die späteren URLs sehen.

Hat jemand eine Lösung für dieses Problem, die nicht auf die Verwendung und den Zugriff auf das Service-Skript direkt über die URL zurückgreifen?

1voto

tandoan Punkte 170

Das Problem ist, dass mod_rewrite dazu führt, dass es immer zu /Controller.php geht, so dass der Location-Block mit den Diensten nie verwendet wird. Verwendung zusätzlicher mod_rewrite-Regeln

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]

Und dann wird ControllerBig zu einem Klon von Controller

<?php
require_once('Controller.php');

wird funktionieren.

Bearbeiten: Vollständiger VirtualHost-Block:

<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>

0voto

gnxtech3 Punkte 782

Da Sie zur Laufzeit entscheiden, nach welchem Webdienst der Client sucht, sind Sie in Ihren Möglichkeiten eingeschränkt. Sie können nicht mehrere php.ini-Dateien verwenden, denn sobald PHP Ihr Skript ausführt, sind Sie an die von der Instanz verwendete .ini-Datei gebunden.

In diesem Fall ist es am besten, wenn Sie in der Datei php.ini die größeren Limits festlegen und dann ini_set()-Direktiven in Ihren Skripten verwenden, um das Limit zu senken. Wenn das inakzeptabel ist, können Sie bestenfalls nur post_max_size auf das größere Limit setzen und dann jedes Ihrer anderen Limits einzeln in Ihrem Skript einstellen.

Das Problem ist, dass PHP zu dem Zeitpunkt, an dem es mit der Ausführung Ihres Skripts beginnt, bereits seine post_max_size aus der php.ini ausgelesen hat und die Daten bereits an Ihren Server gepostet wurden, so dass Ihr Skript bei Überschreitung dieser Grenze gar nicht erst ausgeführt wird.

0voto

blindbg Punkte 1

AFAIK ist php.ini eine pro php-Instanz (php5_module), Sie können Ihr Problem umgehen indem Sie mehrere von ihnen ausführen.

  1. da php5_module ein Modul pro Apache ist, wäre eine Lösung, folgendes auszuführen eine andere Apache-Instanz. Das Problem ist, dass es nicht auf demselben Port 80 laufen kann.

  2. FCGI zum Parsen von php zusammen mit php5_module einrichten. Auf diese Weise können Sie verschiedene Startparameter für jedes Modul angeben. Sie müssen Ihre Skripte in etwas anderes als .php umbenennen, damit fcgi sie parsen kann(.fcgi vielleicht)

Muster

LoadModule fcgid_module modules/mod_fcgid.so  

LoadModule php5_module c:/apps/php/php5apache2_2.dll
AddHandler application/x-httpd-php .php
PHPIniDir "C:/apps/php/ini1"

<IfModule mod_fcgid.c>
AddHandler fcgid-script .fcgi 
FcgidInitialEnv PHPRC "c:/apps/php/ini2"
FcgidWrapper "c:/apps/php/php-cgi.exe" .fcgi
AddType    application/x-httpd-fcgi .fcgi
</IfModule>

Ich bin mir allerdings nicht sicher, wie absturzsicher dieses System ist.

0voto

regilero Punkte 28781

Sie könnten einen neuen namensbasierten virtuellen Host einrichten (also mit einem anderen DNS ), die die gleiche Konfiguration mit einigen Änderungen bezüglich der Speicherbegrenzung behandeln.

Das bedeutet, dass die URLs Ihrer Anwendung für /services/big-service immer diesen anderen DNS verwenden sollten (und Ihre Anwendung sollte überprüfen, dass diese Dienste immer von der richtigen URL abgerufen werden).

Die php_value-Einstellungen können von VirtualHost gesetzt werden, also sollte es funktionieren. Wenn Sie die diese Tabelle werden Sie sehen, dass memory_limit nicht im PERDIR-Bereich liegt, so dass Sie es nicht nur für ein Verzeichnis, sondern nur für den gesamten VirtualHost festlegen können. Mit einem PERDIR-Bereich kann ein <Directory> hätte das Ding vielleicht fangen können, anstatt <Location> (aber Sie können trotzdem einen mod_rewrite auf die Hauptdatei index.php anwenden, so dass es immer das gleiche Verzeichnis ist).

Mit der 2 DNS-Lösung haben Sie immer noch ein großes Problem, Sie können einige Ihrer Apache-Prozesse bekommen, die 1024M RAM verbrauchen, und sie werden später für einfachere Anfragen verwendet, aber immer noch diesen RAM benötigen. Sie müssten also häufig Ihre Apache-Kinder aufräumen (z. B. MaxRequestPerChild auf 100 setzen).

Selbst mit der Fcgid-Lösung von php-fpm, also ohne mod_php, wird Ihr PHP-Skript eine Menge RAM verbrauchen, und das ist nicht gerade angenehm (Sie sollten testen, was mit Ihrem RAM passiert, wenn 10%/30%/50% der Client-Anfragen diese Dienste nutzen, und wie Ihr PHP-RAM-Verbrauch sich bereinigt - oder auch nicht). Sie sollten die Zend_Speicher Komponente, sollte sie auch als Bibliothekskomponente mit Zend_Cache Elementen verwendbar sein, sie wird eine Speicher in den Cache auslagern'. für Sie, um eine übermäßige Nutzung des Arbeitsspeichers in Ihrem Big-Service zu vermeiden.

0voto

Rakesh Sankar Punkte 9177

Ich bezweifle, dass dies funktionieren wird. Denn die Umleitung geht immer zu Controller.php und ich glaube nicht, dass Apache verschiedene php.ini Werte basierend auf dem Standort unterstützt.

Wenn /services/big-service ein Verzeichnis ist, dann macht es Sinn, die Werte für PHP zu übernehmen. Ich würde vorschlagen, dass Sie einen gemeinsamen php.ini-Wert haben oder ein Verzeichnis erstellen und eine .htaccess schreiben, um eigene php-Einstellungen zu haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X