win10 搭建 php + apache 开发运行环境

2020/05/17 posted in  日常折腾

我服了,作为一个4年的老 phper,当我想在 windows 上手动搭建环境还是遇到了好多问题,所以通过这篇记录下来,不要每次都是重新开始,每一次都要蹚一遍所有的坑!

php

在官网这个地址 https://windows.php.net/download/ 下载已编译好的php程序。里面同时提供了多个版本,当然选最新版的 php7.4,然后在 php7.4 里面又提供了4个版本,分别是:

  • VC15 x64 Non Thread Safe
  • VC15 x64 Thread Safe [√]
  • VC15 x86 Non Thread Safe
  • VC15 x86 Thread Safe

真是选择困难症啊,首先,win10是64位的,那肯定选x64,其次使用的是 apache,所以选择 thread safe 版本(原因请参考1),所以最终选择 VC15 x64 Thread Safe。如下图1所示,点击下载那个 zip 压缩文件。直接浏览器下载比较慢,所以我把地址复制到迅雷下载会快很多。

图1

下载完之后解压缩,我习惯放在 c:/lib/php/php7.4,然后打开系统环境变量,把 c:/lib/php/php7.4/bin 添加到环境变量,具体操作如下图,这下脑残都能看懂了吧:

图2:WIN+S 打开系统搜索,搜索 env 就出现环境变量

图3:添加环境变量

环境变量添加成功后,就能够在命令行直接运行 php,打开 cmd/git bash/powershell 或其他你用的任意一个命令行确认一下是否真的可以。哦,看到版本号就说明ok了。

C:\Users\feife>php --version
PHP 7.4.6 (cli) (built: May 12 2020 11:41:06) ( ZTS Visual C++ 2017 x86 )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

php extensions

接下来,就要安装 php 扩展了,在此以 php-redis 扩展为例,其他扩展可以类似操作。

首先,打开 php.ini 文件,如果没有这个文件,就把 c:/lib/php/php7.4/php.ini-development 这个文件复制一份,改名为 c:/lib/php/php7.4/php.ini,作为我们开发环境下的配置文件。修改一行配置,将 extension_dir 改为绝对路径,不然加载扩展会有问题:

extension_dir = "C:/Lib/php/7.4/ext"

其次打开这个地址 https://windows.php.net/downloads/pecl/releases/ ,这里面列出了 php 在 windows 下面的所有 pecl 扩展。直接 ∧ + F 搜索 redis,如下图4,点开它:

图4

我们又看到了好多版本的选择,真是选择困难症啊,一般来说,没有特殊项目要求的话,直接选最新版本即可。

图5:选择最新版本redis扩展

点开之后,又出现了 redis 的各个版本,这里根据我们上面选择的 php 版本,我们应该选择 php_redis-5.2.2-7.4-ts-vc15-x64.zip 这个,点击下载:

图6

下载之后解压,得到了 php_redis.dll 文件,把它复制到 c:/lib/php/php7.4/ext 目录下面,

图7

然后打开 php 的配置文件 c:/lib/php/php7.4/php.ini

打开 php.ini 后,找到这个位置,添加一行:extension=redis

图8

然后在命令行里面输入 php -m,列出所有已安装的扩展,看看有没有 redis,如果有,就说明安装成功了,如下图9:

图9

至此扩展就安装完成了,真费劲。

apache

打开这个地址 https://www.apachelounge.com/download/ ,里面列出了 apache 在 windows 下的已编译好的版本。废话不多说,直接下载最新版本 httpd-2.4.43-win64-VS16.zip。如下图10,然后还要注意一下,还需要下载并安装 vc_redist_x64,这个要先执行,直接点击安装就行了。否则 apache 启动不起来。

图10

下载后解压,我习惯于放在 c:/lib/apache24 里面,然后如上面描述一样,把 C:\Lib\Apache24\bin 这个地址也添加到环境变量 path 中,然后启动一下看看:

C:\Users\feife>httpd
httpd: Syntax error on line 39 of C:/Lib/Apache24/conf/httpd.conf: ServerRoot must be a valid directory

报了一个错误,那就打开 httpd.conf 配置文件看看:

图11

原来是这个配置 ServerRoot 的问题,默认配置写的是 c:/Apache24,这个显然不是我们的 apache 安装路径,所以改为 c:/lib/apache24 就可以了。再试一次:

图12

刚才的问题已经没有了,又冒出一个新的问题:AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::894f:14db:c88a:dfd0. Set the 'ServerName' directive globally to suppress this message,但注意,这个时候 httpd.exe 并没有退出,说明启动成功,这个消息只是一个警告提示。先到浏览器看一下:

图13

刚才那个警告,可以这样解决:打开 httpd.conf,找到这一行:#ServerName www.example.com:80 改为 ServerName localhost:80 即可。事实上,我发现不改的话好像也没问题,因为第二次执行 httpd 时已经不报这个错了,在浏览器访问 http://localhost 也成功了,说明它的配置默认也是用的 localhost:80 的。最终效果如下图14:

图14

目前为止,如果我想要apache服务,就必须手动执行 httpd,很不方便,命令行一退出服务就终止了,所以需要把 apache 安装作为一个服务,系统启动时默认启动。这也简单,命令行执行一下 httpd -k install 即可。下次系统启动时就会自动启动这个服务了,如果现在就要启动这个服务,执行 httpd -k start 即可,如果哪天不想用了,执行 httpd -k uninstall 卸载一下就是了。

如果在卸载的时候遇到:(OS 5)拒绝访问。 : AH10010: Failed to open the 'Apache2.4' service,如下图15:

图15

这个原因是当前命令行没有以管理员启动,所以要以管理员权限启动之后才可以,如下图16,

图16:以管理员权限启动命令行

我用的是 windows terminalcmdpowershell 也都有这个选项。但 git bash 没有,这个要注意一下

图17

好了,apache 的安装就结束了。

apache 配置支持 php 项目

我们先配置一下项目,看看会有什么问题。

配置项目

我的项目是 C:\Users\feife\Documents\code\lara-admin,一个基于 laravel 的后台管理系统,下面要配置这个项目到 http://localhost:8000 访问。

打开 apache 的配置文件 C:\Lib\Apache24\conf\extra\httpd-vhosts.conf,这个配置文件就是专门用于配置虚拟主机的,里面已经有了两个示例(图18),我们只要在这个基础之上改改就好了。

图18

修改完之后

<VirtualHost *:8000>
    DocumentRoot "C:/Users/feife/Documents/code/feiffy.cc/lara-admin/public"
    <Directory "C:/Users/feife/Documents/code/feiffy.cc/lara-admin/public">
        AllowOverride All
        Require all granted
    </Directory>
    ErrorLog "logs/lara-admin-error.log"
    CustomLog "logs/lara-amdin-access.log" common
</VirtualHost>

别忘了,这里虚拟主机的端口号是 8000,还需要在 httpd.conf 增加一行 Listen 8000 以支持 8000 端口的监听。改完保存,重启一下服务 httpd -k restart 再打开 http://localhost:8000 看看:

图19

拒绝了连接,是不是启动失败了?看下错误日志 C:\Lib\Apache24\logs\error.log,

(OS 5)拒绝访问。  : AH10014: Failed to open the 'Apache2.4' service

哦,对的,这个命令 httpd -k restart 也是需要管理员权限的,再试一次。

图20

怎么直接返回默认 80 端口的内容了,一定是哪里不对,搜索一番,哦,原来这个配置文件 C:\Lib\Apache24\conf\extra\httpd-vhosts.conf 默认是不加载的。那么好办,打开 httpd.conf,找到这行:

# Virtual hosts
#Include conf/extra/httpd-vhosts.conf

把前面的 # 去掉,再重启一次试试:

图21

403错误,这时我们去日志目录看看,发现新增了一个 lara-admin-error.log 的错误日志文件,这至少说明一件事,我们的虚拟主机配置已经生效了,接下来看下这个错误日志内容:

[Sun May 17 13:40:32.171675 2020] [autoindex:error] [pid 9704:tid 1152] [client ::1:5968] AH01276: Cannot serve directory C:/Users/feife/Documents/code/lara-admin/public/: No matching DirectoryIndex (index.html) found, and server-generated directory index forbidden by Options directive

这个简单,是配置的问题,打开 C:\Lib\Apache24\conf\extra\httpd-vhosts.conf,增加一行 directoryIndex index.php 的配置,完整如下图:

图22

再三重启服务,看看:

图23

如图,直接把 index.php 的源码输出了,我故意的,因为到目前为止,apache 还不支持解析 php 代码,需要额外安装一个 dll 库,此时,apache 就把 index.php 当成普通 txt 文本输出了。

配置 php 支持

要支持 php,需要安装一个 dll,这个 dll 其实 php7.4 已经自带了,就在 C:\Lib\php\7.4\php7apache2_4.dll,只需要在 apache 的配置文件中一行对这个dll的引用即可。

打开 httpd.conf,在最后一行添加三行配置,后重启服务,再打开浏览器看看

LoadModule php7_module "C:/Lib/php/7.4/php7apache2_4.dll"
AddHandler application/x-httpd-php .php
PHPIniDir "C:/Lib/php/7.4"

OK了,最后成功打开。

增加 mod_rewrite 支持

如果不启用这个模块,那么 php 的 index.php 同目录下 的 .htaccess 就不生效,就不能把所有请求重定向到 index.php 了。

打开 httpd.conf,将下面一行前面的 # 去掉,再重启服务即可:

LoadModule rewrite_module modules/mod_rewrite.so

设置允许跨域

由于我的项目是前后端分离,所以要支持跨域。

首先,需要在 httpd.conf 中开启 mod_headers 模块,找到下面一行,去掉 #

LoadModule headers_module modules/mod_headers.so

然后,在 httpd-vhost.conf 文件中加上一行允许的请求域名,完整配置如下:

# match a ServerName or ServerAlias in any <VirtualHost> block.
#
<VirtualHost *:8000>
    DocumentRoot "C:/Users/feife/Documents/code/lara-admin/public"
    <Directory "C:/Users/feife/Documents/code/lara-admin/public">
        directoryIndex index.php
        AllowOverride All
        Require all granted
        Header set Access-Control-Allow-Origin *
    </Directory>
    ErrorLog "logs/lara-admin-error.log"
    CustomLog "logs/lara-amdin-access.log" common
</VirtualHost>

再重启服务,即可

End

以上就是一个多年经验的 phper 想要在一台全新的 win10 上面手动搭建 php apache laravel 开发运行环境的心路历程。

完。