Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
中小企業中,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
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
電商網站搭建過程中,前端經常會向后端請求數據,有時候通過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就是我們想要將文件上傳的位置。(此代碼無安全機制,只可提供思路或同學游戲使用)
歡迎大家評論區留言指教[送心][送心][送心]
*請認真填寫需求信息,我們會在24小時內與您取得聯系。