Comment faire pour augmenter la memory_limit, post_max_size, et pour un script d'Apache/PHP?
J'ai une application web qui redirige toutes les requêtes de l'hôte virtuel à un contrôleur, qui décide ensuite les fichiers à inclure et à exécuter en fonction de l'URL. Il y a un web service qui accepte les gros fichiers XML par le biais de la POSTE. J'ai besoin de la memory_limit et post_max_ ~32M pour l'application, sauf pour un service qui accepte le XML, qui aura besoin de leurs limites afin de les rapprocher de 1024M. ini_set('memory_limit','1024M')
travaille dans le script, mais ne fonctionnera pas pour le post_max_size.
Je n'arrive pas à comprendre comment le faire. J'ai essayé quelque chose de similaire à ceci:
<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>
Donc, avec la config ci-dessus, si Controller.php ressemble
<?php
echo '<pre>';
var_dump(ini_get('memory_limit'));
var_dump(ini_get('post_max_size'));
var_dump(ini_get('upload_max_filesize'));
Je vais recevoir
string(3) "32M"
string(3) "30 M"
string(3) "29M"
si je visite http://test.com, et http://test.com/services/big-service, mais j'aimerais voir plus de limites pour la plus tard Url.
N'quelqu'un a des solutions à ce qui n'ont pas recours à l'aide et de l'accès au service de script directement dans l'URL?
OriginalL'auteur tandoan | 2011-05-23
Vous devez vous connecter pour publier un commentaire.
Le problème est mod_rewrite est à l'origine de toujours aller à l' /Controller.php, de sorte que l'Emplacement du bloc avec les services n'est jamais utilisé. En utilisant des règles de mod_rewrite
Et puis d'avoir ControllerBig être un clone de Contrôleur de
fonctionne.
Edit: Plein VirtualHost bloc:
OriginalL'auteur tandoan
Puisque vous êtes de décider au moment de l'exécution qui service web, le client est à la recherche d', vous êtes limité à ce que vous pouvez faire. Vous ne pouvez pas utiliser plusieurs php.les fichiers ini, car une fois que PHP est de l'exécution de votre script, vous êtes coincé avec le .fichier ini que l'exemple utilisé.
Le meilleur choix dans ce cas est de définir les limites dans php.ini, puis utiliser la fonction ini_set() directives dans vos scripts qui limite vers le bas. Si c'est inacceptable, alors le mieux que vous pourriez faire est de définir uniquement post_max_size à la grande limite, puis de définir chacun de vos autres limites individuellement à l'intérieur de votre script.
Le problème est que par le temps PHP commence l'exécution de votre script, il a déjà lu son post_max_size à partir de php.ini, et les données ont déjà été Postés sur votre serveur, donc si cette limite a été dépassée, votre script ne même pas être exécutée.
OriginalL'auteur gnxtech3
Autant que je sache, php.ini est un par php instance (php5_module), vous pouvez travailler autour de votre problème
en exécutant plusieurs d'entre eux.
comme php5_module est un par apache, l'une des solutions consisterait à exécuter
une autre instance d'Apache. Le problème est qu'il ne peut pas s'exécuter en même port 80
installation FCGI pour analyser php avec php5_module.
de cette façon, vous pouvez donner différents démarrage params pour chaque. vous auriez besoin
pour renommer vos scripts à quelque chose d'autre que .php pour fcgi à analyser(.fcgi peut-être)
échantillon
Pas sûr de savoir comment des accidents de la preuve, cette configuration est cependant, heh
OriginalL'auteur blindbg
Vous pourriez mettre en place un nouveau Nom de base de virtualhost (donc avec un autre DNS) de la manipulation de la même configuration, avec quelques modifications sur la limite de la mémoire.
Cela signifie que votre application url pour /services/big-service doivent toujours utiliser ce DNS différents (et votre application doit vérifier ces services sont toujours prises à partir de la droite de l'url.
La php_value les paramètres peuvent être définis par VirtualHost, donc, il faut travailler. Si vous cochez ce tableau vous verrez que memory_limit est pas dans PERDIR champ d'application, de sorte que vous ne peut pas lui seulement pour un Répertoire, seul le complet VirtualHost. Avec un PERDIR la portée de
<Directory>
peut avoir été en mesure de prendre la chose au lieu de<Location>
(mais de toute façon vous pouvez avoir un mod_rewrite pour les principaux index.php fichier, donc c'est toujours le même Répertoire).Avec les 2 DNS solution vous avez encore un gros problème, vous pouvez obtenir certains de vos processus apache consommer 1024M de RAM, et ils seront utilisés par la suite pour de plus simple, les demandes, mais encore profiter de cette RAM. Donc vous aurez à nettoyer souvent à vos enfants d'apache (MaxRequestPerChild à 100 par exemple).
Même avec le Fcgid de php-fpm solution, donc sans mod_php, vous allez faire votre script PHP consomment beaucoup de mémoire et ce n'est pas la plus belle des choses à faire (vous devriez tester ce qu'il se passe à votre RAM lorsque 10%/30%/50% des demandes des clients à l'aide de ces services, et la façon dont votre php l'utilisation de la RAM est de nettoyage en place - ou pas). Vous devriez vérifier le Zend_Memory composant, il doit être utilisable en tant que composant de la bibliothèque avec Zend_Cache éléments, il faudra gérer une 'swapp de la mémoire pour le cache" pour vous, en évitant trop de l'utilisation de la RAM à votre service.
OriginalL'auteur regilero
Je doute que cela fonctionne. Depuis, la redirection va toujours Controller.php et je ne pense pas que Apache support pour php.ini valeur sur la base de l'Emplacement.
Si /services/big-service est un répertoire, il un sens pour accepter les valeurs pour le PHP, je vous suggère d'avoir une commune de php.ini valeur ou créer un répertoire et d'écrire une .htaccess pour avoir ses propres paramètres de php.
OriginalL'auteur Rakesh Sankar