Ubuntu上同时有多个php版本


16

我希望能够在运行Ubuntu 12.04的开发箱上运行多个php版本。我要实现的是,当我使用本地主机作为域时,使用默认值(假设php 5.3.17)。当我使用547.localhost作为域php 5.4.7时。我看过一些使用fastcgi使其工作的教程,但是直到现在我还无法使其工作。我看了这些教程:

  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/

据我所知,我已经完成了所有必要的工作。问题是php根本无法运行。当我转到http://localhost/somephpfile.php它时,仅输出php文件的源。这同样适用http://547.localhost/somephpfile.php

我将细分我采取的步骤,希望有人能够发现我错过的内容。

  1. 首先,我使用安装了默认的灯架sudo apt-get install lamp-server^ phpmyadmin。在此之后,我有了一个运行中的开发服务器,该服务器运行php的存储库版本。
  2. 然后,我使用phpfarm创建了两个php安装,一个用于5.3.17,一个用于5.4.7。phpfarm的位置为 /etc/php/phpfarm,因此可执行文件位于/etc/php/phpfarm/inst/php-{version}/bin
  3. 然后我为apache和disabe mod_php启用suaxec和fastcgi sudo a2enmod fastcgi actions suexec && sudo a2dismod php5
  4. 接下来,我编辑/etc/apache2/mods-enabled/fastcgi.conf为:

    <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. 然后,在其中/var/www/创建了一个文件夹cgi-bin并在此文件夹中创建了两个文件,分别用于以下两个php版本(我只为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. 最后一步是创建虚拟主机。最后,我在以下三个文件中/etc/apache2/sites-enabled:000-default,php5.3.17和php5.4.7,内容如下:

    默认:

    <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. 最后,我将/ etc / hosts更改为

    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
    

现在,我希望事情能够奏效,但可悲的是,事实并非如此。取而代之的是,一个php文件通过php运行,它只输出原始文件。

这里一定有我想念的东西,但是我已经经历了很多次了,所以我不知道哪里出了问题。


我遇到的一件事是,如果像您那样命名cgi文件,那将无法正常工作。尝试重命名/var/www/cgi-bin/php-cgi-5.4.7/var/www/cgi-bin/php54.fcgi例如或只/var/www/cgi-bin/php.fcgi。您可以检查是否有帮助?仅用于5.4.7版本。

我已经检查过,很遗憾,这没有帮助。我也更改了虚拟主机以反映此更改,因此操作行显示为Action php-cgi /php-fcgi/php547.fcgi

我已经更新了帖子以反映这些更改,因为无论如何我还是觉得这样很不错

嗯,那我再检查其他可能性。:)

我在想,也许我不需要suexec东西,因为我不需要每个php版本的不同用户吗?

Answers:


2

在您的虚拟主机中,您添加了一个处理程序,但是您没有设置该处理程序,这就是为什么不对其进行处理的原因。加:

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

之前,</Directory>在每个虚拟主机文件。


0

我喜欢SeeDoubleYou的这份简短的分步概述,并想亲自尝试。缺少的是

  • sudo chmod +x /var/www/cgi-bin/*
    • 由于未执行此操作,因此apache无法执行cgi脚本
    • 这对于文件中的行是必需Action php-cgi /php-fcgi/php<version>.fcgivhost.conf
  • sudo apt-get install apache2-suexec-pristine libapache2-mod-fastcgi
    • suexec可执行文件和fastcgi模块丢失,必须先安装它们
    • 需要suexec的可执行行FastCgiWrapper /usr/lib/apache2/suexecfastcgi.conf的文件
  • 我也不得不删除线 FastCgiIpcDir /var/lib/apache2/fastcgi
    • 否则我收到错误消息 FastCgiIpcDir /var/lib/apache2/fastcgi: already defined as "/var/lib/apache2/fastcgi"

对于尝试通过.htaccess或vhosts文件设置php_admin_value和php_value的任何人:FCGI无法实现。相反,您可以使用.user.ini文件来设置目录特定的php.ini配置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.