web-dev-qa-db-fra.com

Comment créer des fichiers php.ini personnalisés pour chaque hôte virtuel?

J'ai installé EasyPHP WAMP uniquement pour le développement local (je n'héberge aucun site Web).

Est-il possible de définir des paramètres php personnalisés pour des hôtes virtuels distincts?

Le fichier php.ini est chargé depuis: C:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\binaries\php\php_runningversion\php.ini. Ce serait bien si, par exemple, je pouvais déposer un fichier php.ini personnalisé dans le répertoire de l'hôte virtuel pour remplacer les paramètres du php.ini original pourrait mieux émuler l'environnement d'un serveur de production site par site.

J'ai vu ce travail avec des comptes d'hébergement en ligne. Mais je n'arrive pas à comprendre comment faire fonctionner cela sur ma machine.

10
Joao

L’utilisation de fichiers php.ini personnalisés est assez simple pour les installations PHP basées sur CGI/FastCGI, mais elle n’est pas réalisable lorsque vous exécutez PHP en tant que module Apache (mod_php) car le serveur entier exécute une instance unique de l'interprète PHP.

Mon conseil:

  • Définissez à partir de PHP lui-même autant de paramètres que possible:

    ini_set('memory_limit', '16M');
    date_default_timezone_set('Europe/Madrid')
    ...
    

    En d'autres termes, les directives peuvent être modifiées lors de l'exécution.

  • Définissez le reste des éléments à partir des fichiers de paramètres Apache par répertoire (alias .htaccess):

    php_flag short_open_tag off
    php_value post_max_size 50M
    php_value upload_max_filesize 50M
    

    c'est-à-dire, les paramètres qui doivent être définis avant que le script ne commence à s'exécuter

Veuillez consulter la Configuration du runtime pour plus de détails.

Parfois, vous aurez réellement besoin de différent dans les paramètres de développement et de production. Il existe d'innombrables façons de résoudre ce problème avec le code PHP (de la création d'une constante booléenne à partir de la variable $_SERVER['HTTP_Host'] à la création d'un fichier config.php avec des valeurs différentes), mais c'est plus compliqué avec .htaccess. J'utilise normalement la directive <IfDefine> :

<IfDefine DEV-BOX>
    #
    # Local server directives
    #
    SetEnv DEVELOPMENT "1"

    php_flag display_startup_errors on
    php_flag display_errors on
    php_flag log_errors off
    #php_value error_log ...
</IfDefine>
<IfDefine !DEV-BOX>
    #
    # Internet server directives
    #
    php_flag display_startup_errors off
    php_flag display_errors off
    php_flag log_errors on
    php_value error_log "/home/foo/log/php-error.log"
</IfDefine>

... où DEV-BOX est une chaîne que je passe à la ligne de commande Apache locale:

C:\Apache24\bin\httpd.exe -D DEV-BOX

Si vous exécutez Apache en tant que service, le bit -D DEV-BOX peut être ajouté dans le registre Windows, par exemple:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Apache2.4\Parameters\ConfigArgs

Lié: Découvrez comment PHP fonctionne sur le serveur (CGI OR fastCGI OR mod_php)

13
Álvaro González

Une façon simple d'utiliser un fichier php.ini personnalisé pour vhost en utilisant Fast CGI consiste à copier le fichier php.ini dans un dossier de l'hôte tel que "customini".

Après cela, passez à votre directive vhost et ajoutez cette simple ligne:

FcgidInitialEnv PHPRC "/path_to_your_custom_ini_dir_for_this_vhost/"

SOYEZ SÛR D'AVOIR / dans votre chemin no \, (cela ne fonctionnera pas avec \)

Redémarrez Apache.

C'est tout!

Exemple complet (sur Windows Server ici):

 <VirtualHost *:80>
    DocumentRoot "C:/Apache/htdocs/vhost/myvhost"
    ServerName www.vhost.com
    FcgidInitialEnv PHPRC "C:/Apache/customini/myvhost/"
 </VirtualHost>
2
Sontae

Développer plusieurs domaines sur une seule machine?

Incorporer les paramètres php.ini dans le httpd-vhost.conf, qui se trouve généralement à la racine du serveur sous conf/extra/, est un excellent moyen de résoudre ce problème courant. Si vous ne saviez jamais que vous pouviez le faire, consultez le manuel PHP.net, sous Comment modifier les paramètres de configuration . Cela résoudra le problème embêtant include_path, sans ajouter de code de configuration à votre code d'amorçage ni quoi que ce soit d'autre.

Bien sûr, pour utiliser ceci efficacement en tant que localhost , il vous faudrait faire des copies d’un bloc <VirualHost> et les configurer en conséquence. Puis commentez tous les blocs d'hôte virtuel sauf celui que vous voulez utiliser!

Alternativement, vous pouvez démarrer Apache avec l'option -f pour pointer le démon du serveur vers un httpd.conf différent lors du démarrage. Chaque httpd.conf nécessiterait un bloc "if module", tel que `block. N'oubliez pas de tenir compte de la journalisation Apache!

httpd -f /usr/local/Apache2/conf/domains/fooDomain.conf

httpd -f /usr/local/Apache2/conf/domains/barDomain.conf

Bloc hôte virtuel Avec les instructions php.ini.

<VirtualHost 127.0.0.1:80>
    UseCanonicalName On
    ServerName localhost:80
    ServerAdmin you@localhost        
    CustomLog "/var/www/someDomain.com/data/logs/httpd_access_log" common
    ErrorLog "/var/www/someDomain.com/data/logs/httpd_error_log"
    LogLevel warn
    DocumentRoot "/var/www/someDomain.com/public"

    <Directory "/var/www/someDomain.com/public">
        # disable directory listing
        Options -Indexes +FollowSymLinks
        AllowOverride FileInfo
        Require all granted
    </Directory>

    <IfModule alias_module>
        # Alias /webpath /full/filesystem/path
        ScriptAlias /cgi-bin/ "/var/www/someDomain.com/scripts/cgi-bin/"
    </IfModule>

    <IfModule php5_module>
        # Use php7_module in opening statement above if on PHP 7+

        # Domain specific PHP configuration options.
        # The Apache process user must own any of the following directories.

        php_admin_value include_path "/var/www/someDomain.com/application/controllers:/var/www/someDomain.com/application/models:/var/www/someDomain.com/application/views"

        # Errors and Logging
        php_admin_flag display_startup_errors off
        php_admin_flag display_errors off
        php_admin_flag html_errors off
        php_admin_flag log_errors on
        php_admin_value error_log "/var/www/someDomain.com/data/logs/php_error_log"

        # File Related
        php_admin_flag file_uploads on
        php_admin_value upload_tmp_dir "/var/www/someDomain.com/data/uploads"
        php_admin_value upload_max_filesize 10M
        php_admin_value max_file_uploads 5

        # Sessions
        php_value session.save_handler "files"
        php_value session.save_path "/var/www/someDomain.com/data/sessions"

        # Caching
        php_value soap.wsdl_cache_dir "/var/www/someDomain.com/data/cache/sopa.wsdl"
    </IfModule>
</VirtualHost>

Si vous pouviez utiliser la variable% {SERVER_NAME} avec le <IfModule phpx_module> blocks to form a compound conditional, you could have just onehttpd.conf`, ou inclure un extra/php.conf avec tous les paramètres PHP.ini spécifiques au domaine (également en blocs). Cependant, tant que "localhost" est la cible du domaine, il ne fera pas ce que vous voulez. Ainsi, ma réponse dans le bloc hôte virtuel ci-dessus.

0
Anthony Rutledge

Plusieurs commentateurs ont mentionné Vagrant qui est une excellente solution.

Si vous n'êtes pas intéressé par Vagrant, vous pouvez utiliser FastCGI comme interface vers Apache et utiliser la suggestion SetEnv PHPRC... proposée sur ce blog _:

Apache et PHP: plusieurs fichiers de configuration PHP.ini (dimanche 8 février 2009)

Source: http://hyponiq.blogspot.com/2009/02/Apache-php-multiple-phpini.html }

La deuxième solution consiste à utiliser la variable d'environnement PHPRC configurable dans Apache à l'aide de la directive SetEnv. Cette directive vous permet de définir une variable d'environnement qui est ensuite transmise à tout script CGI et/ou SSI (Server Side Include) défini dans une page HTML statique (x) (ou un autre type de document). Dans ce cas, vous diriez à chaque instance PHP-CGI où trouver ses paramètres de configuration. L'exemple serait (coïncidant avec le précédent):

# vhosts.conf
NameVirtualHost *:81
<VirtualHost *:81>
  ServerAdmin [email protected]
  ServerName vhost.example.com
  DocumentRoot "C:/path/to/doc/root"
  ErrorLog "logs/vhost.example.com-errors.log"

  # Set the PHPRC environment variable
  SetEnv PHPRC "C:/path/to/doc/root/php.ini"

  <Directory "C:/path/to/doc/root">
    # ... yadda, yadda, yadda ...
    # you get the point!
  </Directory>
</VirtualHost>

Cependant, la PHP documentation modification de la configuration d'exécution suggère que vous pouvez utiliser certaines valeurs telles que php_value pour essayer de lire long, éventuellement avec la directive SetEnv.

Il suggère une autre option n'utilisant pas FastCGI, utilisant plutôt les options de configuration php_value, php_flag etc.

D'autres semblent avoir eu un certain succès avec l'exécution de scripts via FastCGI, voir: Séparez php.ini pour différents hôtes virtuels

D'autres suggestions concernent la directive PHPINI, qui peut être pertinente pour vos besoins, voir: Comment puis-je limiter les applications PHP à leurs propres répertoires et à leur propre php.ini?

0
Sean Quinn