为旧版本 AppServ 配置 PHP8

封面:恵&帆波(Pixiv ID:71713820)


当我发现 PHP8 已经 Release 的时候,我已经火星了。PHP8 引入了一系列 exciting 的特性(虽然这还是改变不了它比较屎的本质),于是我就希望火速在开发环境用上 PHP8。

我这边的垃圾环境是 AppServ 一键包 v8.6.0,自带 PHP5.6 和 PHP7.1,Apache 版本是 2.4,都还是能达到及格线的水平,但 PHP8 就得自己想办法了。

那么第一步当然是下载。我这边的开发环境是 Windows,需要注意 PHP8 需要 VS16(也就是 VC2015-2019)运行库,可以在微软官网下载(x86 x64)。

把下载到的 PHP8 压缩包解压到 AppServ/php8 之类的位置,方便后续操作。

然后我们需要新建 php.ini。由于是开发环境使用,我直接复制 php.ini-developmentphp.ini 使用。特别注意最好修改其中 extension_dir 配置项,使用绝对路径将其指向 AppServ/php8,例如:

extension_dir = "F:\AppServ\php8\ext"

到现在 PHP8 方面的准备工作完成了,可以尝试执行 PHP8 的 Interactive Shell 小小过瘾一把。(在 PHP8 安装目录下打开终端,执行 ./php -a

下面需要完成 Apache 和 PHP8 的对接工作。第一步是备份 httpd.conf,第二步是检查你的备份是不是真的备份好了,第三步是确认你备份了 httpd.conf

httpd.conf 在 Apache 安装目录的 conf 文件夹中。

备份完毕之后,打开 httpd.conf,找到类似这样的一段:

<IfModule mod_php7.c>
  AddType application/x-httpd-php .php
  AddType application/x-httpd-php-source .phps
</IfModule>

复制一遍添加在下方,把 mod_php7.c 中的 7 删掉,改为下面这个样子:

<IfModule mod_php.c>
  AddType application/x-httpd-php .php
  AddType application/x-httpd-php-source .phps
</IfModule>

保存。这样准备工作也完成了,下面找到 AppServ/php5/extras/swver.php 文件,这是用于切换 PHP 版本的脚本,目前它应该只支持在 PHP5 和 PHP7 之间切换,把它改成这样:

<?php
error_reporting(0);
$conf = "F:/AppServ/Apache24/conf/httpd.conf";
$php5ini = "F:/AppServ/php5/";
$php7ini = "F:/AppServ/php7/";
$php8ini = "F:/AppServ/php8/";

echo "\n";
echo "     Change PHP version for AppServ\n\n";

AppServCMD();

function AppServCMD() {
    global $conf, $php5ini, $php7ini, $php8ini;
    define('STDIN', fopen("php://stdin", "r"));
    echo "      Please choose your PHP Version : ";
    echo "\n";
    echo "         5) PHP 5.6\n";
    echo "         7) PHP 7.1\n";
    echo "         8) PHP 8.0\n";
    echo "         0) Exit\n";
    echo "\n";
    echo " Select choice : ";
    $input = trim(strtolower(fgets(STDIN)));

    $input = ereg_replace('\"', "\\\"", $input);
    $input = ereg_replace('\'', "\'", $input);
    // $len = strlen($input);
    switch ($input) {
        case "5":
            $ver = "5.6";
            break;
        case "7":
            $ver = "7.1";
            break;
        case "8":
            $ver = "8.0";
            break;
        case "0":
            echo "\n\n\n\n       Okay do nothing...... bye\n\n\n\n";
            sleep(5);
            exit;
            break;
        default:
            echo "\n    You must choose 5, 7 or 8 only !!!";
            echo "\n       Please try again.....";
            sleep(5);
            exit;
            break;
    }
    echo "\n   Please wait .............\n\n";
    echo "\n    Changing to PHP version -------> $ver <--------\n\n";
    exec("net stop apache24");

    $file = file($conf);
    $data = "";
    foreach ($file as $vars) {

        if (preg_match("/LoadModule php/", $vars)) {
            switch ($input) {
                case "5":
                    $vars = preg_replace("/php\\d/", "php5", $vars);
                    $vars = str_replace("php_module", "php5_module", $vars);
                    break;
                case "7":
                    $vars = preg_replace("/php\\d/", "php7", $vars);
                    $vars = str_replace("php_module", "php7_module", $vars);
                    break;
                case "8":
                    $vars = preg_replace("/php\\d/", "php8", $vars);
                    $vars = str_replace("php8_module", "php_module", $vars);
                    break;
                default:
                    break;
            }
            // echo "$vars";
        }

        if (preg_match("/PHPIniDir/", $vars)) {
            switch ($input) {
                case "5":
                    $vars = "PHPIniDir \"$php5ini\"\r\n";
                    break;
                case "7":
                    $vars = "PHPIniDir \"$php7ini\"\r\n";
                    break;
                case "8":
                    $vars = "PHPIniDir \"$php8ini\"\r\n";
                    break;
                default:
                    break;
            }
            // echo "$vars";
        }

        $data .= $vars;
    }

    ### Write to httpd.conf
    $handle = fopen("$conf", "w");
    fwrite($handle, $data);
    fclose($handle);
    sleep(2);
    exec("net start apache24");
    echo "\n    ##########    Completed     ##########\n\n\n\n";
    sleep(2);
} // end function

保存后运行开始菜单中的“PHP Version Switch”,选择 8,不出意外的话就 OK 了。

如果出了意外,用备份的 httpd.conf 覆盖目前的,然后洗洗睡吧。

最后修改:2020 年 12 月 13 日 11 : 13 AM
欢迎投食喵 ~

发表评论

3 条评论

  1. Abin

    十分感谢, 已配置成功,
    话说 httpd.conf 的LoadModule php_module
    php8 居然不是LoadModule php8_module.

    1. 无限UCW
      @Abin

      PHP8 官方发布的编译好的版本中模块名是不带版本号的,我当时也被这个坑了一下

  2. zizdog

    说点儿啥~
    php都8了?!?!震惊体