xiaoyh 的个人博客

一个只会敲代码的咸鱼

0%

Windows 下的 PHP 的安装及配置

到虎扑实习了,技术栈是 php ,所以得先安装配置。

下载

PHP 官网下载安装包,下载后解压到指定目录即可。

线程安全与线程不安全

从 2000 年 10 月 20 日发布的第一个 Windows 版的 PHP3.0.17 开始的都是线程安全的版本,直至 5.2.1 版本开始有 Thread Safe(TS,线程安全)和 None Thread Safe(NTS,非线程安全)之分。

目前 PHP 运行的方式有以下几种:

  • CGI:Common Gateway Interface(通用网关接口),是外部应用程序(CGI程序)与 Web 服务器之间的接口标准,为每一个请求都开辟一个进程。
  • ISAPI:Internet Server Application Programming Interface(互联网应用程序接口),是为 Microsoft 所提的 Internet server 的 API,区别于 CGI ,ISAPI 采用多线程的方式
  • FastCGI:CGI 存在收到每个请求时都开辟一个进程等不足,FastCGI可以理解为是征对CGI的改进版

由于 Linux/Unix 系统是采用多进程的工作方式,而 Windows 系统采用多线程的工作方式。即 Linux 系统的任务调度基本单位是进程,Windows 系统的任务调度基本单位是线程。

因此如果在 IIS 服务器下以 CGI 方式运行 PHP 会非常慢,这是由于 CGI 模式是建立在多进程的基础之上的,而非多线程。因此一般会把 PHP 配置成以 ISAPI 的方式来运行,ISAPI 是多线程的方式,这样就快多了。

但这样存在一个问题:很多常用的 PHP 扩展是以 Linux/Unix 的多进程思想来开发的,这些扩展在 ISAPI 的方式运行时就会出错搞垮 IIS 。

因此在 IIS 下 CGI 模式才是 PHP 运行的最安全方式,但 CGI 模式对于每个 HTTP 请求都需要重新加载和卸载整个 PHP 环境,其消耗是巨大的。

为了兼顾 IIS 下 PHP 的效率和安全,微软给出了 FastCGI 的解决方案。FastCGI 可以让 PHP 的进程重复利用而不是每一个新的请求就重开一个进程。同时 FastCGI 也可以允许几个进程同时执行。这样既解决了 CGI 进程模式消耗太大的问题,又利用上了 CGI 进程模式不存在线程安全问题的优势。

因此,如果是使用 ISAPI 的方式来运行 PHP 就必须用 TS(线程安全)的版本;而用 FastCGI 模式运行 PHP 的话就没有必要用线程安全检查了, NTS(非线程安全)的版本能够更好的提高效率。

对于具体的服务器应该使用什么版本的问题,由于 Linux 下没有线程安全与线程不安全的区分,所以所有的选择都是对于 Windows 系统的:

  • IIS: NTS(非线程安全)
  • Nginx: NTS(非线程安全)
  • Apache: TS(线程安全)

配置 PHP

  1. 进入文件夹修改 php.ini-development 文件为 php-ini
  2. 将你的 PHP 的安装目录(如 D:\PHP7)添加进系统变量 Path,完成后可以在命令行中输入 php -v 来检查是否配置成功;
  3. ;extension_dir = "ext" 前面的分号去掉;
  4. 根据自身的需要,可以通过添加 extension=xxx 来加载需要的扩展。若该扩展不存在,可以通过网络下载并放进 /ext 目录下。

配置 redis 扩展

php 的 redis 扩展是需要下载的。首先打开 https://pecl.php.net/package/redis

注意,下载扩展时一定要跟你当前的 php 版本(版本号以及是否线程安全)是对应的

下载后将其解压,然后将其中的 php_redis.dll 文件复制到 PHP 目录下的 ext 文件夹里。

最后,在 php.ini 中添加 extension=redis 即可。

配置 Nginx

由于 Nginx 的高性能,现在的 PHP 大多与 Nginx 进行搭配。Nginx 直接去官网下载后解压即可,目录下的 conf/nginx.conf 即 Nginx 的配置文件。

首先,仍然需要修改 PHP 的配置。找到 php.ini 中的 cgi.fix_pathinfo=1 ,将其需要注释即可。cgi.fix_pathinfo 是用来设置在 cgi 模式下 PHP 是否提供 PATH_INFO 信息。因为 Nginx 默认不会设置 PATH_INFO 的值。

然后,再打开 Nginx 的配置文件 nginx.conf ,添加或修改这样的一个服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 80; // 端口号,根据自己需要修改

location / {
root E:\self\www; // 修改成自己网站根目录的绝对路径
index index.html index.htm;
}

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
# 下面这里原本是 script$fastcgi_script_name,改成 $document_root$fastcgi_script_name;
# $document_root 其实就是上面的 root
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

配置好后,只需在 Nginx 的目录下执行以下命令即可:

1
2
3
4
5
start nginx         # 打开

nginx -s stop # 关闭

nginx -s reload # 重载