Plusieurs versions de php simultanément sur Ubuntu

16

Je veux pouvoir exécuter plusieurs versions de php sur ma boîte de développement exécutant Ubuntu 12.04. Ce que je veux accomplir, c'est que lorsque j'utilise localhost comme domaine, un défaut est utilisé (disons php 5.3.17). Lorsque j'utilise 547.localhost comme domaine php 5.4.7 est utilisé. J'ai vu quelques tutoriels pour faire fonctionner cela en utilisant fastcgi mais jusqu'à présent, je n'ai pas pu le faire fonctionner. J'ai regardé ces tutoriels:

  1. http://dbforch.wordpress.com/2010/05/21/apache2-fastcgi-multiple-php-versions-ubuntulucid-10-04/
  2. http://www.metod.si/multiple-php-versions-with-apache-2-fastcgi-phpfarm-on-ubuntu/

Pour autant que je puisse voir, j'ai fait tout ce qui était nécessaire. Le problème est que php ne fonctionne tout simplement pas. Quand j'y vais, http://localhost/somephpfile.phpil suffit de sortir la source du fichier php. Pareil pour http://547.localhost/somephpfile.php.

Je décompose les étapes que j'ai franchies dans l'espoir que quelqu'un puisse repérer ce que j'ai manqué.

  1. J'ai d'abord installé une pile de lampes par défaut à l'aide de sudo apt-get install lamp-server^ phpmyadmin. Après cela, j'avais un serveur de développement fonctionnel exécutant la version référentielle de php.
  2. Ensuite, j'ai utilisé phpfarm pour créer deux installations php, une pour 5.3.17 et une pour 5.4.7. La localisation de phpfarm est /etc/php/phpfarm, donc les exécutables sont en/etc/php/phpfarm/inst/php-{version}/bin
  3. Ensuite, j'active suaxec et fastcgi pour apache et disabe mod_php avec sudo a2enmod fastcgi actions suexec && sudo a2dismod php5
  4. Ensuite, j'ai édité /etc/apache2/mods-enabled/fastcgi.confpour lire:

    <IfModule mod_fastcgi.c>   
        FastCgiIpcDir /var/lib/apache2/fastcgi  
        FastCgiWrapper /usr/lib/apache2/suexec   FastCgiConfig -idle-timeout
        110 -killInterval 120 -pass-header HTTP_AUTHORIZATION -autoUpdate  
        ScriptAlias /php-fcgi/ /var/www/cgi-bin/ 
    </IfModule>
    
  5. Ensuite, /var/www/j'ai créé un dossier cgi-bin et dans ce dossier deux fichiers, pour chacune des deux versions php comme suit (je ne montre que celui du 5.3.17 /var/www/php5317.fcgi):

    #!/bin/sh
    # you can change the PHP version here.
    version="5.3.17"
    # php.ini file location, */php-5.2.13/lib equals */php-5.2.13/lib/php.ini.
    PHPRC=/etc/php/phpfarm/inst/php-${version}/lib/php.ini
    export PHPRC
    
    PHP_FCGI_CHILDREN=3
    export PHP_FCGI_CHILDREN
    
    PHP_FCGI_MAX_REQUESTS=5000
    export PHP_FCGI_MAX_REQUESTS
    
    # which php-cgi binary to execute
    exec /etc/php/phpfarm/inst/php-${version}/bin/php-cgi
    
  6. La dernière étape consistait à créer des hôtes virtuels. Au final, j'ai trois fichiers /etc/apache2/sites-enabled: 000-default, php5.3.17 et php5.4.7 Avec le contenu suivant:

    défaut:

    <VirtualHost *:80>
      ServerName localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php5317.fcgi
      </Directory>
    </VirtualHost>
    

    php5.3.17:

    <VirtualHost *:80>
      ServerName 5317.localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php5317.fcgi
      </Directory>
    </VirtualHost>
    

    php5.4.7:

    <VirtualHost *:80>
      ServerName 547.localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php547.fcgi
      </Directory>
    </VirtualHost>
    
  7. Enfin j'ai changé / etc / hosts pour lire

    127.0.0.1   localhost
    127.0.0.1   547.localhost
    127.0.0.1   5317.localhost
    
    # The following lines are desirable for IPv6 capable hosts
    ::1     ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    

Maintenant, je m'attendrais à ce que les choses fonctionnent, mais malheureusement ce n'est pas le cas. Au lieu de cela, un fichier php passe par php, il sort simplement le fichier brut.

Il doit y avoir quelque chose que j'ai manqué ici, mais j'ai traversé le processus plusieurs fois et je n'arrive pas à comprendre où ça va mal.

SeeDoubleYou
la source
Une chose que j'ai rencontrée, c'est que si je nommais les fichiers cgi comme vous, cela ne fonctionnait pas. Renommez /var/www/cgi-bin/php-cgi-5.4.7à /var/www/cgi-bin/php54.fcgipar exemple ou tout simplement /var/www/cgi-bin/php.fcgi. Pouvez-vous vérifier si cela aide? Juste pour la version 5.4.7.
J'ai vérifié et malheureusement cela n'aide pas. J'ai changé l'hôte virtuel pour refléter ce changement aussi, donc la ligne d'action se litAction php-cgi /php-fcgi/php547.fcgi
J'ai mis à jour le post pour refléter ces changements car je pense que c'est bien de l'avoir comme ça de toute façon
Hmm, je vérifierai alors d'autres possibilités. :)
Je me demandais, probablement je n'ai pas besoin des trucs suexec car je n'ai pas besoin d'utilisateurs différents pour chaque version de php n'est-ce pas?

Réponses:

2

Dans vos hôtes virtuels, vous avez ajouté un gestionnaire, mais vous ne l'avez pas défini, c'est pourquoi il n'est pas traité. Ajouter:

<FilesMatch "\.php$">
    SetHandler php-cgi
</FilesMatch>

avant </Directory>dans chaque fichier d'hôtes virtuels.

user138869
la source
0

J'ai aimé ce bref aperçu étape par étape de SeeDoubleYou et je voulais l'essayer moi-même. Ce qui manquait était

  • sudo chmod +x /var/www/cgi-bin/*
    • Comme cela n'a pas été exécuté, apache n'a pas pu exécuter les scripts cgi
    • Cela est nécessaire pour la ligne Action php-cgi /php-fcgi/php<version>.fcgi du vhost.conffichier
  • sudo apt-get install apache2-suexec-pristine libapache2-mod-fastcgi
    • l'exécutable suexec et le module fastcgi manquaient, ils devaient d'abord être installés
    • L'exécutable suexec est nécessaire pour la ligne FastCgiWrapper /usr/lib/apache2/suexecdu fastcgi.conffichier
  • J'ai aussi dû retirer la ligne FastCgiIpcDir /var/lib/apache2/fastcgi
    • sinon j'ai le message d'erreur FastCgiIpcDir /var/lib/apache2/fastcgi: already defined as "/var/lib/apache2/fastcgi"

Pour toute personne essayant de définir php_admin_value et php_value via des fichiers .htaccess ou vhosts: ce n'est pas possible avec FCGI. À la place, vous pouvez utiliser des fichiers .user.ini pour définir des configurations php.ini spécifiques au répertoire.

Elektropepi
la source