整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Linux 下配置nginx到php的连接

Linux 下配置nginx到php的连接

中小企业中,LAMP架构被广泛使用。而对于高并发请求的情形,其Web服务器通常以Nginx居多,因此LNMP组合架构也非常普遍。在LAMP架构中,Apache可以使用三种方式与PHP连接通信,即以模块化的方式,CGI(已不再使用)以及FastCGI。那对于Nginx而言,则可以使用FastCGI方式,即反向代理方式,将PHP代码有FastCGI转交给PHP解释器进行处理。本文描述配置Nginx到PHP的连接。

一、环境准备

安装Nginx:Linux 6 下安装编译安装Nginx

安装PHP : Linux 6 下编译安装 PHP 5.6

二、演示环境

###当前环境为CentOS 6.7,本演示配置适用于CentOS 7下配置nginx连接PHP。
# cat /etc/redhat-release 
CentOS release 6.7 (Final)
# nginx -v
nginx version: nginx/1.8.1
# service nginx start
Starting nginx: [ OK ]
# ss -nltp|grep nginx
LISTEN 0 128 *:8001 *:* users:(("nginx",2168,6),("nginx",2171,6))
# service php-fpm start 
Starting php-fpm done
# ss -nltp|grep php
LISTEN 0 128 127.0.0.1:9000 *:* users:(("php-fpm",2255,9),("php-fpm",2256,0),("php-fpm",2257,0))
# php -v
PHP 5.6.9 (cli) (built: Jul 17 2016 18:45:50) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
 with XCache v3.2.0, Copyright (c) 2005-2014, by mOo
 with XCache Optimizer v3.2.0, Copyright (c) 2005-2014, by mOo
 with XCache Cacher v3.2.0, Copyright (c) 2005-2014, by mOo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

三、配置nginx

1、编辑/etc/nginx
/nginx.conf,启用如下选项:
location ~ \.php$ {
 root html;
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
 include fastcgi_params;
 }
在所支持的主页面格式中添加php格式的主页,类似如下:
location / {
 root html;
 index index.php index.html index.htm;
 }
2、编辑/etc/nginx/fastcgi_params,将其内容更改为如下内容:
# cp /etc/nginx/fastcgi_params /etc/nginx/fastcgi_params.bk
# cat /dev/null>/etc/nginx/fastcgi_params
# vim /etc/nginx/fastcgi_params
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
3、重新载入nginx的配置文件:
# nginx -t 
# service nginx reload 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

四、验证

1、在/etc/nginx/html新建index.php的测试页面,
测试php是否能正常工作:
# vi /etc/nginx/html/index.php 
<?php ### Author : Leshami
phpinfo(); ### Blog : http://blog.csdn.net/leshami
?>
2、通过浏览测试php页面
浏览器打开 http://192.168.1.245:8001
也可以使用如下方式测试
# curl -I http://192.168.1.245:8001
HTTP/1.1 200 OK 
Server: nginx/1.8.1
Date: Tue, 19 Jul 2016 03:29:44 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.9
3、访问mysql数据库
#yum install php-mysql(安装php的mysql驱动)
vim /etc/nginx/html/connmysql.php
<?php
 $conn=mysql_connect('192.168.1.242','robin','xxx');
 if ($conn)
 echo "succ";
 else
 echo "failute";
 mysql_close();
?>
# curl http://192.168.1.245:8001/connmysql.php
succ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

五、Nginx与PHP分离的情形

电商网站搭建过程中,前端经常会向后端请求数据,有时候通过HTML、JS和PHP文件的处理来实现数据的连通。通常情况下,用户在HTML中做关键字操作,JS对提交的表单进行数据处理,向后端发起ajax请求对应PHP的api接口,PHP在接收到数据后对连接服务器,服务器再通过PHP中的SQL语句对数据库关键字进行处理返回给PHP,再由PHP返回给前端,前端通过JS处理将数据渲染在HTML中,最终呈现给用户。图1为数据传输流程图:

图1 HTML、JS与PHP之间的数据传输流程图

以加入商品到购物车为例,本例为模拟数据,和实际的数据库的数据不同。

图2 商品列表

加入购物车的点击事件大致步骤为:用户点击"加入购物车"按钮==>页面获取当前商品唯一值(如商品ID:productID)==>JS处理点击事件,将唯一值连同用户信息通过ajax请求传送给PHP===>PHP向服务器请求连接===>数据库语句执行===>服务器将执行结果返回给PHP===>PHP将执行结果传送给前端。

如果数据库语句执行成功,那么数据库中该用户的购物车表就多了一项刚加入的商品数据,同时服务器也会向PHP返回执行成功信息(及一条不为空的数据串),而用户的界面就会显示"成功加入购物车"等字样(如图1-1所示);若执行失败,也会将失败信息(err)传给PHP,用户界面也会显示相应的提示,如图3所示。

图3 成功加入购物车提示

1. HTML中的代码实例,商品列表信息通过引入art-template模块进行渲染,代码如下

<ul class="productContainer">

{{each product prod}}

<li>

<input type="text" value="{{prod.id}}">

<img src="{{prod.img}}"/>

<p>{{prod.title}}</p>

<span>¥{{prod.price}}</span>

<a href="javascript:void(0)">加入购物车</a>

</li>

{{/each}}

</ul>

2. JS中的数据请求处理实例如下,加入购物车的请求的api文件路径为http://localhost/api/add.php,此时将点击加入的商品ID及操作的用户ID封装为对象,用ajax的post请求传给服务端

$(".productContainer").on("click", ".add", function () {

var productID=$("#prodID").val();//获取到当前商品的ID值

$.post("http://localhost/api/add.php", {productID:productID,userID},

function (data) {

if (data.res_code===1) { //返回的数据中,data.res_code为1表示加入成功

alert("加入成功");//对用户进行加入成功提示

} else {

alert(data.res_message);//若不为1则表示加入失败,data.res_message为失败信息

}

}, "json");

});

3. PHP中的代码(及JS中所请求的add.php文件)

<?php

// CORS跨域

header("Access-Control-Allow-Origin:*");

/* 向购物车添加商品 */

$productID=$_POST["productID"];

$userid=$_POST["userID"];

// 连接数据库服务器

mysql_connect("localhost:3306", "root", "");

// 选择连接数据库的名称

mysql_select_db("cart");

// 读写库编码

mysql_query("set character set utf8");

mysql_query("set names utf8");

// 编写SQL语句

//若该用户未添加该商品,则向cartList表插入该商品,并将数量置为1

$sql1="INSERT INTO cartList(productID, userID,count) VALUES ('$productID', '$userID',1)";

//若该用户已添加该商品,再次添加时只在cartList表中让该商品的数量+1

$sql2="UPDATE cartList SET count=count+1 WHERE productID='$productID' AND userid='$userID'";

// 执行SQL语句,首先执行sql1的语句,如果表中有相同的数据,则sql1会执行失败,那么执行sql2

$result=mysql_query($sql1);

if(!$result){

$result=mysql_query($sql2);

}

// 判断

if ($result) { // 执行成功,将res_code的值设为1,并将返回信息设置为"加入成功"

$arr=array("res_code"=>1, "res_message"=>"加入成功");

echo json_encode($arr);

} else { // 执行失败,则将res_code设为0,并将错误信息设置为"加入失败"

$arr=array("res_code"=>0, "res_message"=>"加入失败" . mysql_error());

echo json_encode($arr);

}

// 关闭连接

mysql_close();

?>

4. 当用户进入购物车时,页面要请求该用户在数据库中的购物车表cartList,此时查询结果应该为一个数组,数组里的每一个子元素对应一个唯一的商品对象,数据库查询语句如下:

// 编写SQL语句

//在购物车cartList表中找到该用户已经添加的购物车商品数据的信息

$sql="SELECT * FROM cartList WHERE userID='$userID'";

// 执行SQL语句

$result=mysql_query($sql);

// 新建一个数组用来存查询出来的结果,每条结果仅有一条商品的信息

$results=array();

// 每次查询成功,将当前查询到的商品结果存入results数组中

while($row=mysql_fetch_row($result))

{

$results[]=$row;

}

if ($results) {//返回数组$results,res_code值设为1

$arr=array("res_code"=>1, "res_message"=>$results);

echo json_encode($arr);

}

else { // 查找失败,返回信息"查找失败",res_code值设为0

$arr=array("res_code"=>0, "res_message"=>"查找失败" . mysql_error());

echo json_encode($arr);

}

关于PHP语法的说明:

mysql_query() 函数执行某个针对数据库的查询,每次查询结果仅有一条数据。

mysql_fetch_row() 从和结果标识 data 关联的结果集中取得一行数据并作为数组返回。每个结果的列储存在一个数组的单元中,偏移量从 0 开始。依次调用 mysql_fetch_row() 将返回结果集中的下一行,如果没有更多行则返回 FALSE。

们今天来简单的说一下我们的PHP文件上传功能。

首先我们需要对数据库进行设计,我们想要进行文件的上传,就需要一个id字段来存放顺序,一个path字段来存放我们文件的路径,一个time字段来存放时间戳,这是最基本的数据库结果,当然,如果我们想要有其他功能,我们也可以增建其他的字段。


数据库字段


我们对数据库建设完毕后,可以先建一个文件夹来存放我们的上传文件,然后我们就可以来写代码了。注意:我们需要建一个PHP文件。

这个的代码量比较少,我就写在一个文件里了,我们先写个HTML的表单,注意,我们的form一定要有enctype="multipart/form-data"属性,并且是post的提交方式。

PHP代码最好写在HTML代码的下面。

我们在一开始可以写个判断语句,判断是否有文件提交,如果有文件提交我们再执行PHP代码,如果有文件提交的话,我们进行数据库的链接,我们获取到上传文件的时间并存放在变量里方便后续使用。

我们规定一个路径,路径的指向就是我们刚刚创建的那个文件夹,然后用move_uploaded_file函数将我们的文件从服务器的临时目录里保存到我们想要保存的文件夹中。文件的保存我们就算完成了。

注意:我们最好对数据库的插入语句进行判断,以免出现数据库和文件上传的数据不符的情况,我们可以将文件的上传放在我们数据库语句输入成功的条件里,只有数据库语句插入成功才能进行文件的上传。

接下来就是对数据库的操作了,我们写一个sql语句将我们文件的路径和时间戳保存到我们的数据库中至此我们文件上传的功能就算实现了。

代码展示



文件的关系

我们一定要注意路径的关系,不然的话我们可能无法上传或者后期无法下载展示等。文件中的upload就是我们想要将文件上传的位置。(此代码无安全机制,只可提供思路或同学游戏使用)

欢迎大家评论区留言指教[送心][送心][送心]