PHP运行环境的搭建及问题处理
本文讲的是在Windows10下,使用PHP7.4.4 压缩包+ Apache2.4.41压缩包为例详细介绍如何搭建PHP运行环境,其中还对新手可能碰到的问题给出了具体的处理办法。顺便指出,现在PHP和Apache官方都已不提供install版了。建议新手使用集成组件安装版,诸如WampServer、phpStudy,最后将说明。
PHP原为Personal Home Page后更名为 Hypertext Preprocessor(超级文本预处理语言),是一种创建动态交互性站点的强有力的服务器端脚本语言,是常用的网站编程语言。开源免费。
为了学习使用 PHP,你需要一个运行环境, PHP运行环境通常包括:
★Web 服务器,WEB服务器也称为WWW服务器、HTTP服务器,其主要功能是提供网上信息浏览服务。
Apache开源的老牌服务器,它可以运行在几乎所有广泛使用的计算机平台上。
IIS是英文Internet Information Server的缩写,译成中文就是"Internet信息服务"的意思,是微软公司主推的,专门运行在Windows 上。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。可以运行在多种平台上。
★PHP
★数据库,如 MySQL等。非必须,除非使用数据库存储数据。
下面详细介绍在Windows10下,使用目前最新的PHP-7.4.4 压缩包版本和Apache2.4.41压缩包版本搭建PHP运行环境。我这里使用的是
注意,PHP版本和Apache版本的选择有时很关键,否则易出现连接不上数据库等问题。httpd-2.4.41+php-7.4.4+微软常用运行库合集_2019.07.20_X64,下载地址
https://download.csdn.net/download/cnds123/12270209
安装PHP,先到官网下载:
https://www.php.net/downloads.php
【注:如果想使用Apache配置PHP的话,一般需要选择Thread Safe(TS)版本的PHP。
如果想使用IIS配置PHP的话,那么需要选择Non-Thread Safe(NTS)版本的PHP。
TS:Thread Safe 线程安全, 执行时会进行线程(Thread)安全检查
NTS:Non Thread Safe 非线程安全, 在执行时不进行线程(Thread)安全检查
使用Apache+PHP的模式下,一般是把PHP作为一个Module load到apache中,那么以apache父进程-多子进程的工作模式,是需要进行线程安全检查的,所以如果是以这种方式执行php,选择ts版本。
那么如果是使用FastCGI(是一个常驻(long-live)型的CGI(公共网关接口、Common Gateway Interface)),比如说用php-fpm管理php执行,则不需要进行线程安全检查,则选择nts版本的php。】
下载后解压(复制到D盘解压,可修改路径,不要含中文字符)为:D:/php-7.4.4
在其中有两个php配置文件,php.ini-development 和 php.ini-production,两个文件没有太多区别,一个用于开发环境,一个用于生产环境,区别也就是开发环境的配置能够看到更多的错误警告。
复制其中一个,这里是将php.ini-development后缀更改为ini,用记事本打开,按需求修改部分配置
找到; extension_dir = "ext" 去掉前面的分号,也可以在ext目录【其中是一些扩展库】前加上其实际所在的路径,如我的是:
extension_dir = "D:/php-7.4.4/ext"
参见下图:
再将 D:/php-7.4.4加入环境变量PATH中,选中计算机,右键属性–>高级系统设置 –>环境变量–>系统变量,找到Path,编辑,在其后加上。参见下图:
顺便说明,php命令行用法简介
在命令行中查看当前php的版本
php –v
在cmd(命令行)中查看使用帮助
php -help 或php –h
在cmd(命令行)中执行php文件
用记事本建立文件,内容:
<?php
echo "运行php命令行echo";
echo "\r\n";
echo "Hello, World.";
echo "\r\n";
echo "你好世界。";
?>
保存为文件名为:hello.php,保存路径为d:\phpDome。
可如下执行
php -f 路径\文件名,如:
php -f d:\hello.php
在cmd(命令行)中
php -a
进入交互shell后,键入php代码
ctrl+c退出交互shell
对此不多说了。
安装Apache,先到官网下载:
http://httpd.apache.org/download.cgi
【使用ApacheHaus或ApacheLounge,见上图标示2处,这儿使用后者】
下载后解压(复制到D盘解压,可修改路径,不要含中文字符和空格)为:D:/Apache24
将 D:\Apache24\bin加入环境变量PATH中(参见前面)
在其中找到httpd.conf
用记事本打开httpd.conf,
如下处理:
1)查找 DocumentRoot,若找到类似 DocumentRoot "c:/Apache24/htdocs"
说明此为早期版本,将之改为DocumentRoot "d:/Apache24/htdocs" ——即将后面“”内按你的实际安装路径改动,我这里是"d:/Apache24"。
若找到类似DocumentRoot "${SRVROOT}/htdocs"
说明此为后来版本,搜索Define SRVROOT,没错是找这个,找到 Define SRVROOT "/Apache24"之类,将之改为Define SRVROOT "d/Apache24"——即将后面“”内按你的实际安装路径改动,我这里是"d:/Apache24"。
2)在文末加入如下几句:
PHPIniDir "路径”
LoadModule php7_module "路径/php7apache2_4.dll"
AddType application/x-httpd-php .php .html .htm #添加支持对php脚本解析,解决显示php源码或直接下载文件
其中:
路径依据PHP的安装路径(php.ini文件所在的路径)修改,我这里是d:/php-7.4.4。PHP7的预处理器模块文件是 php7apache2_4.dll(特别提示,这是PHP7的预处理器模块文件)在PHP安装目录下可以看到。参见下图:
快速检查apache 中的 配置文件httpd.conf 是否正常
在cmd中输入httpd –t 回车(即按下Enter键),显示如下
OK!
【若在cmdzhong 用httpd -t 检查师,提示:
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::4de2:6c46:aec1:6a57. Set the 'ServerName' directive globally to suppress this message
Syntax OK
处理:
在httpd.conf中,搜索"#ServerName",
在#ServerName www.example.com:80句之后
添加ServerName localhost:80】
现在,可以启动apache,
以管理的身份运行CMD,参见下图:
先安装服务,在cmd中输入httpd -k install [–n “服务名”] ,其中[]部分代表可选,不用使用默认服务名,例如:
httpd -k install -n “Apache24”
再启动服务 net start 服务名,例如:
net start Apache24
参见下图:
类似上图显示Apache服务正常工作了。
注意,httpd.conf改动后,要重启Apache服务才成。
【若hetpd.conf加入PHPIniDir "php.ini的路径” 如PHPIniDir "d:/php7.4.4”报错
apache添加php模块后无法启动了。
可能缺少微软常用运行库,搜索“微软常用运行库合集” 下载安装。】
在cmd中查看Apache的版本号
httpd -v
【附、服务操作,以管理员身份打开cmd,再如下操作
删除服务 sc delete 服务名
sc delete Apache24
启动服务
通过命令net start 服务名
停止服务
通过命令net stop服务名
在cmd中查看开启了哪些服务
net start
在cmd中查看开启了哪些端口——列出所有端口的情况
netstat -ano
在cmd中查看指定端口的使用情况
如查找80端口的使用情况
netstat -ano|findstr :80
】
【顺便提及
找到ApacheMonitor.exe运行(在\bin),可以方便的管理服务:
在左下角上可以看到 右击它出现快捷菜单,单击Open Apache Monitor 出现Apache Service Monitor对话框。参见下图:
】
现在可以写一个php文件,内容如下:
<HTML>
<HEAD><h2>PHP Hello World - 来自PHP的问候。</h2></HEAD>
<BODY>
<?php
echo "Hello, World.";
echo "你好世界。";
?>
</BODY>
</HTML>
保存文件名为helloworld.php(或helloworld.html),注意保存位置htdocs中(这里是d:/Apache24/htdocs)
在浏览器输入网址:http://127.0.0.1/helloworld.php 或http://localhost/helloworld.php,运行结果如下:
OK!
下面给出一个好点的例子,简单投票系统
这个由3个文件组成poll.html、poll_vote.php、poll_result.txt
poll.html,此HTML 文件作为用户界面表单,内容如下:
<html>
<head>
<meta charset="utf-8">
<title>简单投票系统</title>
<script>
function getVote(int) {
if (window.XMLHttpRequest) {
// IE7+, Firefox, Chrome, Opera, Safari 执行代码
xmlhttp=new XMLHttpRequest();
} else {
// IE6, IE5 执行代码
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("poll").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","poll_vote.php?vote="+int,true);
xmlhttp.send();
}
</script>
</head>
<body>
<div id="poll">
<h3>你喜欢 PHP 和 AJAX 吗?</h3>
<form>
是:
<input type="radio" name="vote" value="0" οnclick="getVote(this.value)">
<br>否:
<input type="radio" name="vote" value="1" οnclick="getVote(this.value)">
</form>
</div>
</body>
</html>
poll_vote.php,此文件接受用户的操作,读写"poll_result.txt" 文件,内容如下:
<?php
$vote = htmlspecialchars($_REQUEST['vote']);
// 获取文件中存储的数据
$filename = "poll_result.txt";
$content = file($filename);
// 将数据分割到数组中
$array = explode("||", $content[0]);
$yes = $array[0];
$no = $array[1];
if ($vote == 0)
{
$yes = $yes + 1;
}
if ($vote == 1)
{
$no = $no + 1;
}
// 插入投票数据
$insertvote = $yes."||".$no;
$fp = fopen($filename,"w");
fputs($fp,$insertvote);
fclose($fp);
?>
<h2>结果:</h2>
<table>
<tr>
<td>是:</td>
<td>
<span style="display: inline-block; background-color:green;
width:<?php echo(100*round($yes/($no+$yes),2)); ?>px;
height:20px;" ></span>
<?php echo(100*round($yes/($no+$yes),2)); ?>%
</td>
</tr>
<tr>
<td>否:</td>
<td>
<span style="display: inline-block; background-color:red;
width:<?php echo(100*round($no/($no+$yes),2)); ?>px;
height:20px;"></span>
<?php echo(100*round($no/($no+$yes),2)); ?>%
</td>
</tr>
</table>
poll_result.txt内容如下:
0||0
说明:文本文件 (poll_result.txt) 中存储来自投票程序的数据。其中:
第一个数字表示 "Yes" 投票,第二个数字表示 "No" 投票。
现在可以发布这个小系统了。
【如何知道网址发布位置——Apache HTTP Server 的网站发布目录?
可以用记事本打开 http.conf 文件,搜索找到 DocumentRoot 为开头的那一行:
1)如果其中含有${SRVROOT},再搜索Define SRVROOT,由Define SRVROOT后面部分和DocumentRoot ${SRVROOT}后面部分两者确定网站发布目录,参见下图:
2)如果其中没有${SRVROOT},由DocumentRoot后面部分确定网站发布目录:
】
知道了网站发布目录,发布很简单
将这三个文件放到SimpleVoting 目录中,将SimpleVoting 目录复制到Apache安装路径的htdocs目录中(这里是d:/Apache24/htdocs)
现在可以运行这个简单投票系统了。
在浏览器输入网址:http://127.0.0.1/SimpleVoting/poll.html或http://localhost//SimpleVoting/poll.html
上面演示了这台电脑,若未接入网络,可在此电脑的浏览器输入:localhost/php项目起始文件名访问,若接入网络,就可以被互联网中其它客户端用户访问了——在浏览器输入:地址/php项目起始文件名 访问。假设设置这台电脑局域网IP为192.168.1.6,在此局域网的另一台电脑的浏览器输入网址http://192.168.1.6/simpleVoting/poll.html 回车(按下Enter键)即可访问。
数据库
通过 PHP,您可以连接和操作数据库。php支持的数据库较多,除常见的Oracle、SQLServer、 Mysql外,还有很多。
当有数据存储与检索等需求时,就需要数据库。
关于数据库安装不多说,可参见:
https://blog.csdn.net/cnds123/article/details/104454487
找到PHP根目录下的php.ini,用文本编辑器打开找到下面几条常用配置,去掉前面的分号:
;extension=mysqli
;extension=pdo_mysql
参见下图:
注意,改动后,要重启Apache服务生效。
推荐使用集成组件安装版,诸如WampServer等,它已经包含了 PHP、Apache、Mysql ,免去了开发人员将时间花费在繁琐的配置过程。
Windows 系统可以使用 WampServer,支持32位和64位系统,根据自己的系统选择版本。官网下载地址:http://www.wampserver.com
但一般情况下不可下载。可到网上搜索下载,下面给出一个链接(华军软件园WampServer3.2下载页):
http://soft.onlinedown.net/soft/82112.htm
WampServer
需要初学者最初明确的两点:一是WampServer 安装时要留意安装路径,集成的PHP、Apache、MySQL 安装在此路径下的bin中,二是安装路径中的www目录就是其默认的网站发布目录。参见下图:
WampServe之默认网站发布目录的修改
在WampServer的安装目录找到scripts目录,用记事本打开config.inc.php文件,找到下面的句子:
$wwwDir=Sc_installDir.'/www';
改成你要设置的网站发布目录,例如你想将网站代码放到d:/site,将上句改为
$wwwDir='d:/site'
然后重启WampServer生效。
【也可以httpd.conf文件中修改DocumentRoot指定目录,然后重启WampServer生效,但这样修改,通过任务栏“W”图标进入原来网站发布目录。】
wampapache或wampapache64、wampariadb或wampariadb64、wampmysqld或wampmysqld64是wamp安装后出现的服务进程。
64代表64位版本没有的是32位版本。
wampapache 是wamp的apache服务端进程。
wampariadb是wamp的ariadb数据库服务端进程。
wampmysqld是wamp的mysql数据库服务端进程。
phpStudy
该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境。
官网地址:https://www.xp.cn
其安装后的目录如下:
使用pdo 连接测试代码,其中password,要替换为MySQL的root用户的实际登录密码
<?php
try {
$con= new PDO("mysql:host=localhost","root","password");
echo "连接成功";
}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>
使用mysqli_connect 连接测试代码,其中password,要替换为MySQL的root用户的实际登录密码
<?php
$con= mysqli_connect("localhost","root1","password");
if ($con->connect_error) {
die("Connection failed: " . mysqli_connect_error());
}
echo "连接成功";
?>