電商網站搭建過程中,前端經常會向后端請求數據,有時候通過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。
自我介紹一下?
答:我叫xxx,來自北京,20xx年畢業于xx大學計算機xx系,畢業后在xx從事了x年的php開發工作,公司是一個外包公司,主要做微信開發,公眾號推廣,商城,論壇的開發
你在公司負責那些項目?
答:由于我們公司是一個外包公司,不可能只做一個項目,公司的項目都是交叉進行的,論壇,微信,商城我都做過?
你做過哪些模塊?
答:登陸注冊,商品管理,購物車模塊,訂單管理
mvc是什么?相互間有什么關系?
答:mvc是一種開發模式,主要分為三部分:m(model),也就是模型,負責數據的操作;v(view),也就是視圖,負責前后臺的顯示;c(controller),也就是控制器,負責業務邏輯
客戶端請求項目的控制器,如果執行過程中需要用到數據,控制器就會到模型中獲取數據,再將獲取到的數據通過視圖顯示出來
oop是什么?
答:oop是面向對象編程,面向對象編程是一種計算機編程架構,OOP 的一條基本原則是計算機程序是由單個能夠起到子程序作用的單元或對象組合而成。
OOP具有三大特點
1、封裝性:也稱為信息隱藏,就是將一個類的使用和實現分開,只保留部分接口和方法與外部聯系,或者說只公開了一些供開發人員使用的方法。于是開發人員只 需要關注這個類如何使用,而不用去關心其具體的實現過程,這樣就能實現MVC分工合作,也能有效避免程序間相互依賴,實現代碼模塊間松藕合。
2、繼承性:就是子類自動繼承其父級類中的屬性和方法,并可以添加新的屬性和方法或者對部分屬性和方法進行重寫。繼承增加了代碼的可重用性。PHP只支持單繼承,也就是說一個子類只能有一個父類。
3、多態性:子類繼承了來自父級類中的屬性和方法,并對其中部分方法進行重寫。于是多個子類中雖然都具有同一個方法,但是這些子類實例化的對象調用這些相同的方法后卻可以獲得完全不同的結果,這種技術就是多態性。多態性增強了軟件的靈活性。
1、易維護
采用面向對象思想設計的結構,可讀性高,由于繼承的存在,即使改變需求,那么維護也只是在局部模塊,所以維護起來是非常方便和較低成本的。
2、質量高
在設計時,可重用現有的,在以前的項目的領域中已被測試過的類使系統滿足業務需求并具有較高的質量。
3、效率高
在軟件開發時,根據設計的需要對現實世界的事物進行抽象,產生類。使用這樣的方法解決問題,接近于日常生活和自然的思考方式,勢必提高軟件開發的效率和質量。
4、易擴展
由于繼承、封裝、多態的特性,自然設計出高內聚、低耦合的系統結構,使得系統更靈活、更容易擴展,而且成本較低。
smarty是什么,有什么作用?
回答一:smarty是用php寫出來的模板引擎,也是目前業界最著名的php模板引擎之一
它分離了邏輯代碼和外在的顯示,提供了一種易于管理和使用的方法,用來將混雜的php邏輯代碼與html代碼進行分離
回答二:smarty是php中最著名的引擎框架之一,我們公司使用的是TP框架,已經封裝好了smarty模板,所以沒有單獨使用過
回答三: smarty是個模板引擎,最顯著的地方就是有可以把模板緩存起來。一般模板來說,都是做一個靜態頁面,然后在里面把一些動態的部分用一切分隔符切開,然后在PHP里打開這個模板文件,把分隔符里面的值替換掉,然后輸出來,你可以看下PHPLib里面的template部分。
而smarty設定了緩存參數以后,第一次運行時候會把模板打開,在php替換里面值的時候把讀取的html和php部分重新生成一個臨時的php文件,這樣就省去了每次打開都重新讀取html了。如果修改了模板,只要重新刷下就行了。
TP框架有哪些優點?
答:TP框架是我們中國人自己開發的框架,各種資料比較齊全,國內用的比較多,比較簡單和方便,而且是免費開源的
TP的特性有哪些?
1.多表查詢非常方便,在model中幾句代碼就可以完成對多表的關聯操作
2.融合了smarty模板,使前后臺分離
3.支持多種緩存技術,尤其對memcache技術支持非常好
4.命名規范,模型,視圖,控制器嚴格遵循命名規則,通過命名一一對應
5.支持多種url模式
6.內置ajax返回方法,包括xml,json,html等
7.支持應用擴展,類庫擴展,驅動擴展等
TP框架中的大字母函數?
U:對url的組裝
A:內部實例化控制器
S:緩存處理
R:調用某個控制器的操作方法
D:實例化自定義模型類
M:實例化基礎模型類
I:獲取參數
L:設置或者獲取當前語言
C:設置或獲取,保存配置
請介紹一下laravel框架?
答: laravel框架的設計思想比較先進,非常適合應用各種開發模式,作為一個框架,它為你準備好了一切,composer是php的未來,沒有composer,php肯定要走向沒落
laravel框架最大的特點和優秀之處就是集合了php比較新的特點,以及各種各樣的設計模式,Ioc模式,依賴注入等
laravel有那些特點?
回答一:
1.強大的rest router:用簡單的回調函數就可以調用,快速綁定controller和router
2.artisan:命令行工具,很多手動的工作都自動化
3.可繼承的模板,簡化view的開發和管理
4.blade模板:渲染速度更快
5.ORM操作數據庫
6.migration:管理數據庫和版本控制
7.測試功能也很強大
8.composer也是亮點
回答二: laravel框架引入了門面,依賴注入,Ioc模式,以及各種各樣的設計模式等
請簡述一下數據庫的優化?
答:數據庫的優化可以從四個方面來優化:
1.從結構層: web服務器采用負載均衡服務器,mysql服務器采用主從復制,讀寫分離
2.從儲存層: 采用合適的存儲引擎,采用三范式
3.從設計層: 采用分區分表,索引,表的字段采用合適的字段屬性,適當的采用逆范式,開啟mysql緩存
4.sql語句層:結果一樣的情況下,采用效率高,速度快節省資源的sql語句執行
如何解決異常處理?
答: 拋出異常:使用try…catch,異常的代碼放在try代碼塊內,如果沒有觸發異常,則代碼繼續執行,如果異常被觸發,就會 拋出一個異常。Catch代碼塊捕獲異常,并創建一個包含異常信息的對象。$e->getMessage(),輸出異常的錯誤信息。
解決異常:使用set_error_handler函數獲取異常(也可以使用try()和catch()函數),然后使用set_exception_handler()函數設置默認的異常處理程序,register_shutdown_function()函數來執行,執行機制是,php要把調入的函數調入到內存,當頁面所有的php語句都執行完成時,再調用此函數
前端?
答:我在工作中處理前端的功能,一般就是用ajax向后臺請求數據,然后返回數據在前臺頁面中顯示出來。我從來沒有獨立的完整的將html和css樣式都一個人完成,如果公司實在有這樣的需求的話,我可能會找一些前臺的模板或者說是前端的框架,比如說h—ui等等
權限管理(RBAC)的實現?
1.首先創建一張用戶表:id name auto(保存格式為:控制器-方法)
2.然后在后臺中創建一個基類控制器,控制器里封裝一個構造方法,當用戶登陸成功后,使用TP框架中封裝好的session函數獲取保存在服務器中的session id,然后實例化模型,通過用戶id獲取保存在數據表中的auth數據,使用explode函數分割獲取到的數據,并使用一個數組保存起來,然后使用TP框架中封裝好的常量獲取當前控制器和方法,然后把他們組裝成字符串,使用in_array函數進行判斷該數組中是否含有當前獲取到的控制器和方法,如果沒有,就提示該用戶沒有權限,如果有就進行下一步操作
怎么保證促銷商品不會超賣?
答:這個問題是我們當時開發時遇到的一個難點,超賣的原因主要是下的訂單的數目和我們要促銷的商品的數目不一致導致的,每次總是訂單的數比我們的促銷商品的數目要多,當時我們的小組討論了好久,給出了好幾個方案來實現:
第一種方案:在每次下訂單前我們判斷促銷商品的數量夠不夠,不夠不允許下訂單,更改庫存量時加上一個條件,只更改商品庫存大于0的商品的庫存,當時我們使用ab進行壓力測試,當并發超過500,訪問量超過2000時,還是會出現超賣現象。所以被我們否定了。
第二種方案:使用mysql的事務加排他鎖來解決,首先我們選擇數據庫的存儲引擎為innoDB,使用的是排他鎖實現的,剛開始的時候我們測試了下共享鎖,發現還是會出現超賣的現象。有個問題是,當我們進行高并發測試時,對數據庫的性能影響很大,導致數據庫的壓力很大,最終也被我們否定了。
第三種方案:使用文件鎖實現。當用戶搶到一件促銷商品后先觸發文件鎖,防止其他用戶進入,該用戶搶到促銷品后再解開文件鎖,放其他用戶進行操作。這樣可以解決超賣的問題,但是會導致文件得I/O開銷很大。
最后我們使用了redis的隊列來實現。將要促銷的商品數量以隊列的方式存入redis中,每當用戶搶到一件促銷商品則從隊列中刪除一個數據,確保商品不會超賣。這個操作起來很方便,而且效率極高,最終我們采取這種方式來實現
商城秒殺的實現?
答:搶購、秒殺是如今很常見的一個應用場景,主要需要解決的問題有兩個:
1 高并發對數據庫產生的壓力
2 競爭狀態下如何解決庫存的正確減少("超賣"問題)
對于第一個問題,已經很容易想到用緩存來處理搶購,避免直接操作數據庫,例如使用Redis。第二個問題,我們可以使用redis隊列來完成,把要秒殺的商品放入到隊列中,因為pop操作是原子的,即使有很多用戶同時到達,也是依次執行,文件鎖和事務在高并發下性能下降很快,當然還要考慮其他方面的東西,比如搶購頁面做成靜態的,通過ajax調用接口,其中也可能會出現一個用戶搶多次的情況,這時候需要再加上一個排隊隊列和搶購結果隊列及庫存隊列。
高并發情況下,將用戶進入排隊隊列,用一個線程循環處理從排隊隊列取出一個用戶,判斷用戶是否已在搶購結果隊列,如果在,則已搶購,否則未搶購,庫存減1,寫數據庫,將用戶入結果隊列。
購物車的原理?
答:購物車相當于現實中超市的購物車,不同的是一個是實體車,一個是虛擬車而已。
用戶可以在購物網站的不同頁面之間跳轉,以選購自己喜愛的商品,點擊購買時,該商品就自動保存到你的購物車中,重復選購后,最后將選中的所有商品放在購物車中統一到付款臺結賬,這也是盡量讓客戶體驗到現實生活中購物的感覺。服務器通過追蹤每個用戶的行動,以保證在結賬時每件商品都物有其主。
主要涉及以下幾點:
1、把商品添加到購物車,即訂購
2、刪除購物車中已定購的商品
3、修改購物車中某一本圖書的訂購數量
4、清空購物車
5、顯示購物車中商品清單及數量、價格
實現購物車的關鍵在于服務器識別每一個用戶并維持與他們的聯系。但是HTTP協議是一種“無狀態(Stateless)”的協議,因而服務器不能記住是誰在購買商品,當把商品加入購物車時,服務器也不知道購物車里原先有些什么,使得用戶在不同頁面間跳轉時購物車無法“隨身攜帶”,這都給購物車的實現造成了一定的困難。
目前購物車的實現主要是通過cookie、session或結合數據庫的方式。下面分析一下它們的機制及作用。
cookie
cookie是由服務器產生,存儲在客戶端的一段信息。它定義了一種Web服務器在客戶端存儲和返回信息的機制,cookie文件它包含域、路徑、生存期、和由服務器設置的變量值等內容。當用戶以后訪問同一個Web服務器時,瀏覽器會把cookie原樣發送給服務器。
通過讓服務器讀取原先保存到客戶端的信息,網站能夠為瀏覽者提供一系列的方便,例如在線交易過程中標識用戶身份、安全要求不高的場合避免用戶重復輸入名字和密碼、門戶網站的主頁定制、有針對性地投放廣告等等。利用cookie的特性,大大擴展了WEB應用程序的功能,不僅可以建立服務器與客戶機的聯系,因為cookie可以由服務器定制,因此還可以將購物信息生成cookie值存放在客戶端,從而實現購物車的功能。
用基于cookie的方式實現服務器與瀏覽器之間的會話或購物車,有以下特點:
1、cookie存儲在客戶端,且占用很少的資源,瀏覽器允許存放300個cookie,每個cookie的大小為4KB,足以滿足購物車的要求,同時也減輕了服務器的負荷;
2、cookie為瀏覽器所內置,使用方便。即使用戶不小心關閉了瀏覽器窗口,只要在cookie定義的有效期內,購物車中的信息也不會丟失;
3、cookie不是可執行文件,所以不會以任何方式執行,因此也不會帶來病毒或攻擊用戶的系統;
4、基于cookie的購物車要求用戶瀏覽器必須支持并設置為啟用cookie,否則購物車則失效;
5、存在著關于cookie侵犯訪問者隱私權的爭論,因此有些用戶會禁止本機的cookie功能。
session
session是實現購物車的另一種方法。session提供了可以保存和跟蹤用戶的狀態信息的功能,使當前用戶在session中定義的變量和對象能在頁面之間共享,但是不能為應用中其他用戶所訪問,它與cookie最重大的區別是,session將用戶在會話期間的私有信息存儲在服務器端,提高了安全性。
在服務器生成session后,客戶端會生成一個sessionid識別號保存在客戶端,以保持和服務器的同步。這個sessionid是只讀的,如果客戶端禁止cookie功能,session會通過在URL中附加參數,或隱含在表單中提交等其他方式在頁面間傳送。因此利用session實施對用戶的管理則更為安全、有效。
同樣,利用session也能實現購物車,這種方式的特點是:
1、session用新的機制保持與客戶端的同步,不依賴于客戶端設置;
2、與cookie相比,session是存儲在服務器端的信息,因此顯得更為安全,因此可將身份標示,購物等信息存儲在session中;
3、session會占用服務器資源,加大服務器端的負載,尤其當并發用戶很多時,會生成大量的session,影響服務器的性能;
4、因為session存儲的信息更敏感,而且是以文件形式保存在服務器中,因此仍然存在著安全隱患。
結合數據庫的方式
這也是目前較普遍的模式,在這種方式中,數據庫承擔著存儲購物信息的作用,session或cookie則用來跟蹤用戶。這種方式具有以下特點:
1、數據庫與cookie分別負責記錄數據和維持會話,能發揮各自的優勢,使安全性和服務器性能都得到了提高;
2、每一個購物的行為,都要直接建立與數據庫的連接,直至對表的操作完成后,連接才釋放。當并發用戶很多時,會影響數據庫的性能,因此,這對數據庫的性能提出了更高的要求;
3、使cookie維持會話有賴客戶端的支持。
各種方式的選擇:
雖然cookie可用來實現購物車,但必須獲得瀏覽器的支持,再加上它是存儲在客戶端的信息,極易被獲取,所以這也限制了它存儲更多,更重要的信息。所以一般cookie只用來維持與服務器的會話
例如國內最大的當當網絡書店就是用cookie保持與客戶的聯系,但是這種方式最大的缺點是如果客戶端不支持cookie就會使購物車失效。
Session能很好地與交易雙方保持會話,可以忽視客戶端的設置。在購物車技術中得到了廣泛的應用。但session的文件屬性使其仍然留有安全隱患。
結合數據庫的方式雖然在一定程度上解決了上述的問題,但從上面的例子可以看出:在這種購物流程中涉及到對數據庫表的頻繁操作,尤其是用戶每選購一次商品,都要與數據庫進行連接,當用戶很多的時候就加大了服務器與數據庫的負荷。
redis消息隊列先進先出需要注意什么?(
REDIS高級應用:使用redis消息隊列完成秒殺過期訂單處理)
答:通常使用一個list來實現隊列操作,這樣有一個小限制,所以的任務統一都是先進先出,如果想優先處理某個任務就不太好處理了,這就需要讓隊列有優先級的概念,我們就可以優先處理高級別的任務,實現方式有以下幾種方式:
1)單一列表實現:隊列正常的操作是 左進右出(lpush,rpop)為了先處理高優先級任務,在遇到高級別任務時,可以直接插隊,直接放入隊列頭部(rpush),這樣,從隊列頭部(右側)獲取任務時,取到的就是高優先級的任務(rpop)
2)使用兩個隊列,一個普通隊列,一個高級隊列,針對任務的級別放入不同的隊列,獲取任務時也很簡單,redis的BRPOP命令可以按順序從多個隊列中取值,BRPOP會按照給出的 key 順序查看,并在找到的第一個非空 list 的尾部彈出一個元素,redis> BRPOP list1 list2 0
list1 做為高優先級任務隊列
list2 做為普通任務隊列
這樣就實現了先處理高優先級任務,當沒有高優先級任務時,就去獲取普通任務
方式1最簡單,但實際應用比較局限,方式3可以實現復雜優先級,但實現比較復雜,不利于維護
方式2是推薦用法,實際應用最為合適
你負責的模塊有哪些難題?
答:在我負責的B2B電商項目中,當時我負責的是訂單模塊,由于客戶一次選擇了多家商戶的商品,最終生成了一個訂單,這樣我們平臺在給商戶結算時出現了不知道這比費用應該給哪個商戶,這時候我們小組經過討論,需要涉及到訂單拆分,也就是說用戶點擊支付后,如果有多件商品,并且不是同一家店鋪那么 就要用到訂單的拆分,比如如果有兩件商品,并且不是同一店鋪 就在原來的訂單號下 在生成兩個子訂單號 并修改訂單表中兩件商品的訂單號。最終實現了商品的分配管理,解決了我們的難題。
我覺得在開發過程中,遇到的難題無非是兩個,一個是技術層次的,我認為,只要你有恒心,有熱心,沒有覺得不了的難題。另一個就是溝通問題,在任何地方任何時候溝通都是最重要的,尤其是我們做開發的,不溝通好,會影響整個項目的進度,我本人是個非常還溝通的人,所以這點上也沒多大問題。
用戶下單是怎么處理的?
答:判斷用戶有沒有登錄,在沒有登錄的情況下,不允許下單。登陸后,可進行下單,并生成唯一的訂單號,此時訂單的狀態為未支付。
電商的登錄是怎么實現的?
答:分為普通登錄和第三方登錄 這邊主要說一下第三方登錄吧,第三方登陸主要使用的是author協議,我就以QQ的第三方登陸為例來進行說明:當用戶在我們的站點請求QQ的第三方登陸時,我們站點會引導用戶跳轉到QQ的登陸授權界面, 當用戶輸入QQ和密碼成功登錄以后會自動跳回到我們站點設置好的回調頁面,并附帶一個code參數,接著你使用code再次去請求QQ的授權頁面,就可以從中獲取到一個access token(訪問令牌),通過這個access_token,我們可以調用QQ提供給我們的接口,比如獲取open_id,可以獲取用戶的基本信息。獲取到之后,我們需要拿用戶的授權信息和open_id和我們平臺的普通用戶進行綁定。這樣不管是普通用戶登陸還是第三方登陸用戶,都可以實現登陸。
接口安全方面是怎么處理的?
答:我們當時是這么做的,使用HTTP的POST方式,對固定參數+附加參數進行數字簽名,使用的是md5加密,比如:我想通過標題獲取一個信息,在客戶端使用 信息標題+日期+雙方約定好的一個key通過md5加密生成一個簽名(sign),然后作為參數傳遞到服務器端,服務器端使用同樣的方法進行校驗,如何接受過來的sign和我們通過算法算的值相同,證明是一個正常的接口請求,我們才會返回相應的接口數據。
用的什么技術實現短信發送,在哪調用?
答:我主要用的第三方短信接口,在申請接口時進行相應信息的配置,然后在我們站點需要用到短信驗證的地方進行調用,我們通常在用戶注冊時使用到。
看了以上的面試題,是不是有種豁然開朗的感覺呢?小編還有更多面試題及答案分享給大家哦:
完整面試題獲取方式:關注黑馬程序員頭條號,后臺回復“PHP面試”即可!
51CTO.com快譯】JavaScript與PHP,都是目前人氣較高的兩款編程語言。PHP是基于C語言而打造,因此非常適合有C語言基礎的開發者。事實上,兩種語言對于新手程序員來說都是比較容易上手的,而且它們都具備出色的靈活性與可擴展性。
那么,它們到底有何不同?
1.PHP能更輕松地實現定制化目標:
重構與定制化能力是決定編程語言命運的兩大重要因素。PHP是開放源代碼軟件,意味開發者可以根據社區需求進行修改,而非立足單個開發者的需求,也正是它的開源特性使得PHP更為靈活也更加適用。憑借著這一點PHP能獲得很多開發者的支持的原因之一。Comiconverse公司CEO透露稱,“我們更樂于利用PHP開發網站,因為我們能夠輕松做出自己需要的變更。JavaScript雖然也很實用,但開發者能夠利用PHP更輕松地實現定制化目標。”
需要注意的是,PHP在這方面僅僅是略有優勢。JavaScript同樣可以根據實際需求進行重構與定制,只不過在效率上不及PHP。
2.各方面對比:
上手難度:js完全oop相對PHP更容易理解一些,但是文檔不如PHP完善,而且語言更新運營還解析引擎不是一家,沒辦法寫清底層原理。那也是js上手簡單一些,起碼不用搭環境選版本
特性:js是事件驅動的,很靈活但是也很坑,調試起來比較困難(曾經被吭哭),而PHP的特性就比較混亂了,組件很多。雙方特性各有優點,PHP的引用傳遞,js的萬物皆對象。平均水平js贏,整天實力PHP贏。
功能:要說功能強大,很明顯,js暫時還比不上PHP,而且客戶端js被限制了很多,比如跨域,ajax寫入,文件讀取什么的。
開發難度:其實都不難,但是PHP比較依賴文檔還搜索引擎,因為命名問題很難記住,這一點js做的就比較好了,尤其是正則表達式部分。
語義:個人比較看重的一點就是語言的語義性,這一點js的完全對象化占很大的優勢,調用屬性或方法.和[]語義性特別強,而PHP這方面就比較謹慎,限制的比較嚴格。但是js也有一個語義部分很糟糕的部分,就是下面這個
注釋:PHP有相當完善的注釋系統,而且各個IDE支持的非常好,當PHP作為核心驅動的時候代碼提示和注釋非常給力。反觀js大多以編輯器為主,作為驅動也是最近不久,所以注釋方面不如PHP完善。
3.開發大型Web應用中,JavaScript有明顯優勢
兩種語言都能用于開發大型Web應用,但JavaScript在這一領域擁有明顯優勢。如之前所提到,專用服務器能夠更好地托管JavaScript用例,因此其更適合用于大型Web應用開發。
4.PHP是一種更為年輕的語言,因此傳統企業更傾向于選擇JavaScript。
如果是在小型企業工作的開發人員,他們通常會使用PHP。但如果在大型企業或者是傳統企業,那么JavaScript會是系統與項目中的普及度更高的語言。PHP是一種更為年輕的語言,因此傳統企業更傾向于選擇JavaScript,以簡化IT部門內部的管理工作。
同樣需要強調的是,JavaScript是一種認證的付費語言。這意味著大家可以考取JavaScript相關資質認證,而PHP則不行。另外,如果學PHP,最后你還得學javascript,因為現在PHP 只會后端不會前端,很難找到工作。
5.不可一概而論
正如很多程序員所言,我們沒辦法將二者進行簡單比較,因為它們的用途并不一樣。PHP是一種服務器端腳本語言,而JavaScript則是一種面向桌面與服務器端的通用型語言。這意味著程序員能夠利用JavaScript完成更為廣泛的應用目標。
6.總結——應該如何選擇?
選擇哪款語言,取決于您的協作對象以及使用目的。在理想情況下,大家最好能同時掌握兩者。如果非要選擇其一,那么PHP應該能夠憑借著開源特性、更多支持選項以及靈活的可塑性小幅勝出。
當然,這只是我的個人見解。您對此有何看法?請在評論中與我們分享。
原文鏈接:https://dzone.com/articles/javascript-vs-php-whats-the-difference
原文標題:JavaScript vs. PHP: What's the Difference?
原文作者:Carol Jon
【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】
*請認真填寫需求信息,我們會在24小時內與您取得聯系。