php8和php5、php6、php7都需要安装对应版本的 Microsoft Visual C++运行库
,下载页面左侧说明里有运行库下载路径:
VC15 & VS16
More recent versions of PHP are built with VC15 or VS16 (Visual Studio 2017 or 2019 compiler respectively) and include improvements in performance and stability.
-The VC15 and VS16 builds require to have the Visual C++ Redistributable for Visual Studio 2015-2019 x64 or x86 installed
VS16 x64 Non Thread Safe (2020-Nov-24 22:43:38)
,注意vs16
字样VC15 x64 Non Thread Safe (2020-Nov-24 15:08:39)
,注意vc15
字样往期版本如果标题类似 php-5.3.4-Win32-VC6-x86.zip
,那就意味着需要安装vc6运行库
,去微软官网找吧。
如果用最简约的安装方法,那么成功后应当仅存在如下图功能:
2022.08.24配置了整整一天windows2016和php8.1.9,到处都是不兼容,甚至明明打开了gd组件,但程序提示对应函数无法使用。
强烈不建议安装8.1.x,甚至8.1.x这一版本让我都感觉到了php的没落!
参考吐槽文章《windows2016安装php8.1及mysql8出现的问题汇总(简直就是*#*o#)》
将下载好的php8压缩包解压后放置于相关目录。个人经验建议创建类似这样的目录c:/php/php8.0
,下次升级php的时候可以再建目录c:/php/php8.3
,这样切换php相对而言比较清晰。
date.timezone = Asia/Shanghai
extension_dir = "c:\php\php8.0\ext"
;
注释标记即可extension=curl
extension=gd
extension=mbstring
extension=mysqli
extension=openssl
extension=pdo_mysql
session.save_path = "d:\temp\phpSession"
sys_temp_dir = "d:\temp\phpSys"
PHP Warning: Unknown: Unable to create temporary file, Check permissions in temporary files directory. in Unknown on line 0
upload_tmp_dir = "d:\temp\phpUpload"
cgi.fix_pathinfo = 0
、fastcgi.impersonate = 1
、cgi.force_redirect = 0
、expose_php = Off
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting
; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo = 0
; FastCGI under IIS supports the ability to impersonate
; security tokens of the calling client. This allows IIS to define the
; security context that the request runs under. mod_fastcgi under Apache
; does not currently support this feature (03/17/2002)
; Set to 1 if running under IIS. Default is zero.
; http://php.net/fastcgi.impersonate
fastcgi.impersonate = 1
; cgi.force_redirect is necessary to provide security running PHP as a CGI under
; most web servers. Left undefined, PHP turns this on by default. You can
; turn it off here AT YOUR OWN RISK
; **You CAN safely turn this off for IIS, in fact, you MUST.**
; http://php.net/cgi.force-redirect
cgi.force_redirect = 0
; Decides whether PHP may expose the fact that it is installed on the server
; (e.g. by adding its signature to the Web server header). It is no security
; threat in any way, but it makes it possible to determine whether you use PHP
; on your server or not.
; http://php.net/expose-php
expose_php = Off
以往都是设置cgi.fix_pathinfo = 1
,但现在发现有重大漏洞,原因举例:
当访问www.xx.com/phpinfo.jpg/1.php这个URL时,$fastcgi_script_name会被设置“phpinfo.jpg/1.php”,然后构造成SCRIPT_FILENAME(绝对路径)传递给PHP CGI,如果开启了cgi.fix_pathinfo=1选项(这个默认值就是1,所以没有设置过就是开启),那么就会触发在PHP中的如下逻辑:
PHP会认为SCRIPT_FILENAME(绝对路径)是phpinfo.jpg,而1.php是PATH_INFO,所以就会phpinfo.jpg作为PHP文件来解析了.
也是一个逻辑问题,所以说我们只需要在正常的.jpg后面加/.php就可以成功的绕过解析
如果某些网站打开后提示No input file specified.
,那只能使用cgi.fix_pathinfo = 1
,值不能为0
。
《Nginx + PHP CGI的一个可能的安全漏洞》
《php fpm 设置项 cgi.fix_pathinfo=1 漏洞不再出现》
目录权限
如果提示无法运行程序,可以尝试修改一下目录权限
其它设置
以上配置仅为最基本的安全运行配置,如果在实际开发时,可能需要改变其它配置,例如改变上传文件的大小、响应等待时间等等。
打开iis界面,选择 处理程序映射
- 添加模块映射
,按照下图操作,注意可执行文件是php-cgi.exe
提示是否创建FastCGI应用程序,选择是
即可。
如果上一步选择了是
,那么这里就已经设置好了。
双击后根据实际情况编辑。
添加默认的php文档,一般是index.php
、default.php
。
如果你使用单入口的php框架,可以自定义一些奇怪的文件名称~~比如Xsdf2dm.php
。
在根目录下新建一个index.php
文件查看配置是否正确,代码如下:
phpinfo();?>
实际运行时记得删除本文件,否则太暴露了~~
<configuration>
<system.webServer>
<handlers>
<remove name="php7.0" />
<remove name="php8.0" />
<add name="php7.0" path="*.php" verb="*" modules="FastCgiModule" scriptProcessor="c:\php\php7.0\php-cgi.exe" resourceType="Unspecified" requireAccess="Script" />
handlers>
system.webServer>
configuration>
经测试不写
和
,只写add
也是能成功运行的,默认下后者会覆盖前者,可以使用函数phpinfo()
来看一下当前使用哪个版本的php。但一个目录下两者混用可能会出现问题,见下一条。
。冲突案例:
比如我在实际运行时,服务器配置了php5.6和php7.0,其中一个站点的同一域名下有http://xx.com/a/index.php
和http://xx.com/a/b/index.php
两个mvc框架入口,并分别开发了网站前台和管理后台,框架都在另一个目录中,由入口文件正常调用。
项目完成后,网站前台和管理后台在本机使用一切正常,但通过互联网访问时管理后台始终无法登录,问题是session
值生成了,但无法正确获取,就像有人半路截掉又重新生成了一个。如果不停点击登录提交,十次中可能有1次会获取到正确的session。
解决办法也很蹊跷:
a. 在后端与该登录页面相关的代码(比如model
相关login
方法)中强制输出一个值,例如:echo 'welcome';
,session就能正常获取了。可能与缓冲区的刷新有关。
b. 将前台首页禁用session,也就是http://xx.com/a
不使用session_start()
,那么管理后台http://xx.com/a/b
的登录取session也能正常,可能是和管理后台b
目录是在前端a
目录中的缘故?
c. 将两个目录分开,即http://xx.com/a/index.php
和http://xx.com/b/index.php
。
d. 其实上三个方法都没有解决根本问题,真正的原因既然是冲突,那么在web.config
里删除其中一个就可以了,。
参考:
VC++6.0、VC2008、VC2010之间的区别
PHP8.0尝鲜系列(一):Windows 10安装PHP8.0
PHP全线产品升级至5.3、5.4流程(PHP5.3在IIS上的配置)
IIS7中多个版本php共存的方法