24

我为开发安装了 PHP、MySQL 和 Apache 堆栈。该安装使用来自以下位置的配置文件:

/etc/apache2/
/etc/php5/

后来我使用phpbrew. 所有版本都可以从 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 版本?

4

5 回答 5

38

您需要使用以下命令构建 PHP apxs2

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

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

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

于 2013-12-20T14:53:43.363 回答
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
于 2016-01-08T21:06:48.510 回答
4

请查看服务器故障帖子如何告诉 Apache 使用哪个 PHP?.

您需要在 Apache 中指定 PHP 版本。

于 2013-12-16T05:32:58.643 回答
2

我发现使用 Apache 服务器管理多个 PHP 版本的解决方案是运行 PHP-FPM 和 FastCGI 而不是mod_php. 通过这种方式,我可以运行多个版本的 PHP,并在我的开发机器上选择要运行哪个版本的 PHP。

您将需要使用+fpmphpbrew 标志而不是重新编译您的 PHP 版本,+apxs2使用命令启动它们phpbrew fpm start,安装 Apachelibapache2-mod-fastcgi包,并可能禁用 apache mod_php- 但一旦它工作,它就非常漂亮。只需配置指向相同代码但不同 PHP-FPM 套接字的不同虚拟主机,我就可以使用多个版本的 PHP 测试同一个站点。

下面是一个 Apache 2.4/etc/apache2/mods-enables/fastcgi.conf配置文件的示例,其中包含通过 phpbrew 安装的 2 个版本的 PHP:

<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“站点”Virtualhost 配置中,您可以指定使用别名运行的 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>
于 2016-12-11T02:04:59.157 回答
2

如果 phpbrew 成功安装了带有 +apxs2 ext 的 php 版本,您应该在 apache2 的模块库(usr/lib/apache2/modules/etc/apache2/mods-available/php*.load)中有一个新的“.so”文件。

这些(或)文件中.so列出的文件是加载的版本。要在 php5 和 php7 版本之间切换,请使用 a2enmod/a2dismod php5 php7。php*.loadphp5.loadphp7.load

您需要在更改配置后重新加载 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 模块并重新启动服务器。

于 2017-01-27T23:25:48.993 回答