告诉Apache使用通过phpbrew安装的特定PHP版本

24

我已经安装了用于开发的PHP、MySQL和Apache堆栈。该安装使用以下配置文件:

/etc/apache2/
/etc/php5/

后来我使用phpbrew安装了多个PHP版本。所有版本都可以从CLI访问并切换。但是Apache始终停留在默认版本上,该版本不是使用phpbrew安装的。

以下是我安装的PHP版本列表。

$ phpbrew list
Installed versions:
  php-5.4.13       (/home/admin1/.phpbrew/php/php-5.4.13)
                   +default -- --with-bz2=/usr
  php-5.5.5        (/home/admin1/.phpbrew/php/php-5.5.5)

  php-5.3.27       (/home/admin1/.phpbrew/php/php-5.3.27)

我尝试更改配置文件路径以便它们指向phpbrew的PHP版本,但是似乎没有起作用。

我该如何告诉Apache使用phpbrew的PHP版本?

5个回答

38
您需要使用apxs2构建PHP:

1) 确保已安装sudo apt-get install apache2-dev

2) 运行phpbrew install 5.4.22 +apxs2=/usr/bin/apxs2

然后您应该在Apache配置文件中看到已构建的模块文件。


嘿,它起作用了。非常感谢你。你救了我的一天。 :) - Vinay Aggarwal
1
它适用于 phpbrew install。但不能在 phpbrew use 或者 phpbrew switch 上运行。 - vee
6
要让apxs2工作,您需要执行sudo apt-get install apache2-dev安装apache2-dev。 - Vadorequest

26

这个脚本是我写的,因为它让我感到很烦。

默认情况下,phpbrew switch会更改CLI版本。要更新Apache,您需要告诉它使用新生成的.so文件。在Ubuntu上,该文件将被创建为/usr/lib/apache2/modules/libphp$VERSION.so

要生成此.so文件,您需要像这样安装PHP:

phpbrew install php-5.6.16 +default +apxs2

无论如何,这是我用来切换PHP版本的shell脚本。 如果找不到.so文件,则切换将失败,并且它将请求sudo特权以重新启动Apache。

/home/luker/bin/phpbrewswitch

#!/usr/bin/env bash
VERSION=$1

SOFILE=/usr/lib/apache2/modules/libphp$VERSION.so
CONFFILE5=/etc/apache2/mods-available/php5.load
CONFFILE7=/etc/apache2/mods-available/php7.load

source ~/.phpbrew/bashrc

if [ -f $SOFILE ]; then
    phpbrew switch $VERSION
    phpbrew list

    if [[ $VERSION == 7* ]]; then
        FILECONTENTS="LoadModule php7_module $SOFILE"
        CONFFILE=$CONFFILE7
        sudo a2enmod php7
        sudo a2dismod php5
    else
        FILECONTENTS="LoadModule php5_module $SOFILE"
        CONFFILE=$CONFFILE5
        sudo a2enmod php5
        sudo a2dismod php7
    fi;

    echo $FILECONTENTS > $CONFFILE
    echo "AddType application/x-httpd-php .php" >> $CONFFILE
    echo "Updated $CONFFILE"
    sudo service apache2 restart

else
    echo $VERSION "is not configured for apache"
    phpbrew list
fi

使用方法

尝试切换到不适用于Apache的PHP版本:

[21:02:55] luker [~]$ phpbrewswitch 5.4.45
5.4.45 is not configured for apache
  php-5.6.16
  php-5.6.10
* php-5.5.30
  php-5.4.45

成功切换到已存在 .so 文件的 PHP 版本:

[21:03:55] luker [~]$ phpbrewswitch 5.6.16
* php-5.6.16
  php-5.6.10
  php-5.5.30
  php-5.4.45
Updated /etc/apache2/mods-available/php5.load

5
这非常有用!我必须开始测试php7.0,但是某些Web应用程序还不支持它,因此我不得不经常在5.6和7.0之间切换,而这个工具连同phpbrew一起帮了我很多忙!感谢您的分享。 - Caperneoignis
1
这是唯一提到将“AddType application/x-httpd-php .php”添加到.conf文件中的地方。之后,PHP就可以立即与Apache一起使用了。 - TheKitMurkit

4

看起来会有效。谢谢,我会试一下的。 - Vinay Aggarwal

2
如果phpbrew成功安装了带有+apxs2扩展的php版本,您应该可以在apache2的模块库(/usr/lib/apache2/modules,在/etc/apache2/mods-available/php*.load中看到)中找到一个新的".so"文件。
在那些php*.load文件中列出的.so文件是被加载的版本。要在php5和php7版本之间切换,请使用a2enmod/a2dismod php5 php7。
更改配置后,您需要重新加载apache2:systemctl restart apache2。如果php文件以纯文本形式呈现,则需要将以下内容添加到php*.load文件中:
AddType application/x-httpd-php .php

为了避免每次安装新版本都需要编辑PHP加载文件,您可以在Apache2配置文件中全局设置此项:
<FilesMatch \.php?>
    SetHandler application/x-httpd-php
</FilesMatch>

这些指令适用于开发服务器。以下是我的个人脚本:

#!/bin/bash
i=1
c=1
options=()
while [ $c -gt 0 ]
do
    v=$(phpbrew list | sed -n "${i}p")
    if [ -z "$v" ]; then
        c=0
    elif [ -n "$v" ]; then
        options+=("$v")
    fi
    i=$[$i+1]
done

count=0
printf "\n"
echo 'Available versions:'
for i in "${options[@]}"
do
 echo "$i $[$count+1]"
 count=$[$count+1]
done

printf "\n"
echo 'Which version should be enabled?'
read selected

chosen="${options[$selected - 1]}"
chosen="$(echo -e "${chosen}" | tr -d '[:space:]')"
chosen="$(echo -e "${chosen}" | sed 's/\*//g')"
chosen="$(echo -e "${chosen}" | sed 's/php-//g')"
echo -e "php-${chosen} to be enabled."

source $HOME/.phpbrew/bashrc
phpbrew switch php-${chosen}

if [[ $chosen =~ ^5 ]]; then
    sudo a2dismod php7
    sudo a2enmod php5
    sudo service apache2 reload
elif [[ $chosen =~ ^7 ]]; then
    sudo a2dismod php5
    sudo a2enmod php7
    sudo service apache2 reload
else echo 'This script only works on php 5 and 7';
fi

该脚本会代表您运行 phpbrew list 命令,并让您使用数字键选择版本。然后它会运行 phpbrew switch 命令,同时切换 apache2 模块的开启或关闭状态并重新启动服务器。

优秀的答案。 - T.Todua

2
我发现管理Apache服务器上多个PHP版本的解决方案是使用PHP-FPM和FastCGI而不是mod_php。这样,我可以运行多个版本的PHP,并选择在我的开发机器上要运行哪个版本的PHP来运行哪些站点。
您需要使用+ fpm phpbrew标志重新编译PHP版本,而不是+ apxs2,使用phpbrew fpm start命令启动它们,安装Apache libapache2-mod-fastcgi软件包,并可能禁用apache mod_php - 但一旦它起作用,它就非常出色。我可以通过配置指向相同代码但具有不同PHP-FPM套接字的不同虚拟主机来测试多个版本的PHP相同的站点。
以下是通过phpbrew安装的2个PHP版本的Apache 2.4 /etc/apache2/mods-enables/fastcgi.conf配置文件示例:
<IfModule mod_fastcgi.c>
  AddHandler fastcgi-script .fcgi
  FastCgiIpcDir /var/lib/apache2/fastcgi

  AddType application/x-httpd-fastphp5 .php
  Action application/x-httpd-fastphp5 /php5-fcgi

  # This is for php 5.6.28
  FastCgiExternalServer /usr/lib/cgi-bin/php56-cgi -socket /home/{USERNAME}/.phpbrew/php/php-5.6.28/var/run/php-fpm.sock -pass-header Authorization

  # This is for php 7.0.13
  FastCgiExternalServer /usr/lib/cgi-bin/php70-cgi -socket /home/{USERNAME}/.phpbrew/php/php-7.0.13/var/run/php-fpm.sock -pass-header Authorization

  # this seems to be required by Apache 2.4.10
  <Directory /usr/lib/cgi-bin>
    Require all granted
  </Directory>
</IfModule>

在您的apache“站点”虚拟主机配置中,您可以通过以下方式指定要运行的PHP版本:

别名:

<VirtualHost *:80>
  # ServerName, ServerAdmin, etc
  DocumentRoot /var/www/my-site-code
  # Then point the php5-fcgi handler to a specific version of PHP
  # Here is PHP7, as defined in the fastcgi.conf file
  Alias /php5-fcgi /usr/lib/cgi-bin/php70-cgi
</VirtualHost>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接