博主還將大量面試題整理成了一個PHP面試手冊,html
是PDF版,文章結尾有獲取方式,感興趣的來。程序員
答:購物車至關於現實中超市的購物車,不一樣的是一個是實體車,一個是虛擬車而已。用戶能夠在購物網站的不一樣頁面之間跳轉,以選購本身喜好的商品,點擊購買時,該商品就自動保存到你的購物車中,重複選購後,最後將選中的全部商品放在購物車中統一到付款臺結帳,這也是儘可能讓客戶體驗到現實生活中購物的感受。服務器經過追蹤每一個用戶的行動,以保證在結帳時每件商品都物有其主。
主要涉及如下幾點:面試
一、把商品添加到購物車,即訂購
二、刪除購物車中已定購的商品
三、修改購物車中某一本圖書的訂購數量
四、清空購物車
五、顯示購物車中商品清單及數量、價格redis
實現購物車的關鍵在於服務器識別每個用戶並維持與他們的聯繫。可是HTTP協議是一種「無狀態(Stateless)」的協議,於是服務器不能記住是誰在購買商品,當把商品加入購物車時,服務器也不知道購物車裏原先有些什麼,使得用戶在不一樣頁面間跳轉時購物車沒法「隨身攜帶」,這都給購物車的實現形成了必定的困難。
目前購物車的實現主要是經過cookie、session或結合數據庫的方式。下面分析一下它們的機制及做用。算法
cookie
cookie是由服務器產生,存儲在客戶端的一段信息。它定義了一種Web服務器在客戶端存儲和返回信息的機制,cookie文件它包含域、路徑、生存期、和由服務器設置的變量值等內容。當用戶之後訪問同一個Web服務器時,瀏覽器會把cookie原樣發送給服務器。經過讓服務器讀取原先保存到客戶端的信息,網站可以爲瀏覽者提供一系列的方便,例如在線交易過程當中標識用戶身份、安全要求不高的場合避免用戶重複輸入名字和密碼、門戶網站的主頁定製、有針對性地投放廣告等等。利用cookie的特性,大大擴展了WEB應用程序的功能,不只能夠創建服務器與客戶機的聯繫,由於cookie能夠由服務器定製,所以還能夠將購物信息生成cookie值存放在客戶端,從而實現購物車的功能。用基於cookie的方式實現服務器與瀏覽器之間的會話或購物車,有如下特色:數據庫
一、cookie存儲在客戶端,且佔用不多的資源,瀏覽器容許存放300個cookie,每一個cookie的大小爲4KB,足以知足購物車的要求,同時也減輕了服務器的負荷;
二、cookie爲瀏覽器所內置,使用方便。即便用戶不當心關閉了瀏覽器窗口,只要在cookie定義的有效期內,購物車中的信息也不會丟失;
三、cookie不是可執行文件,因此不會以任何方式執行,所以也不會帶來病毒或***用戶的系統;
四、基於cookie的購物車要求用戶瀏覽器必須支持並設置爲啓用cookie,不然購物車則失效;
五、存在着關於cookie侵犯訪問者隱私權的爭論,所以有些用戶會禁止本機的cookie功能。json
session瀏覽器
session是實現購物車的另外一種方法。session提供了能夠保存和跟蹤用戶的狀態信息的功能,使當前用戶在session中定義的變量和對象能在頁面之間共享,可是不能爲應用中其餘用戶所訪問,它與cookie最重大的區別是,session將用戶在會話期間的私有信息存儲在服務器端,提升了安全性。在服務器生成session後,客戶端會生成一個sessionid識別號保存在客戶端,以保持和服務器的同步。這個sessionid是隻讀的,若是客戶端禁止cookie功能,session會經過在URL中附加參數,或隱含在表單中提交等其餘方式在頁面間傳送。所以利用session實施對用戶的管理則更爲安全、有效。
一樣,利用session也能實現購物車,這種方式的特色是:安全
一、session用新的機制保持與客戶端的同步,不依賴於客戶端設置;
二、與cookie相比,session是存儲在服務器端的信息,所以顯得更爲安全,所以可將身份標示,購物等信息存儲在session中;
三、session會佔用服務器資源,加大服務器端的負載,尤爲當併發用戶不少時,會生成大量的session,影響服務器的性能;
四、由於session存儲的信息更敏感,並且是以文件形式保存在服務器中,所以仍然存在着安全隱患。服務器
結合數據庫的方式
這也是目前較廣泛的模式,在這種方式中,數據庫承擔着存儲購物信息的做用,session或cookie則用來跟蹤用戶。這種方式具備如下特色:
一、數據庫與cookie分別負責記錄數據和維持會話,能發揮各自的優點,使安全性和服務器性能都獲得了提升;
二、每個購物的行爲,都要直接創建與數據庫的鏈接,直至對錶的操做完成後,鏈接才釋放。當併發用戶不少時,會影響數據庫的性能,所以,這對數據庫的性能提出了更高的要求;
三、使cookie維持會話有賴客戶端的支持。
各類方式的選擇:
雖然cookie可用來實現購物車,但必須得到瀏覽器的支持,再加上它是存儲在客戶端的信息,極易被獲取,因此這也限制了它存儲更多,更重要的信息。因此通常cookie只用來維持與服務器的會話,例如國內最大的當當網絡書店就是用cookie保持與客戶的聯繫,可是這種方式最大的缺點是若是客戶端不支持cookie就會使購物車失效。
Session能很好地與交易雙方保持會話,能夠忽視客戶端的設置。在購物車技術中獲得了普遍的應用。但session的文件屬性使其仍然留有安全隱患。
結合數據庫的方式雖然在必定程度上解決了上述的問題,但從上面的例子能夠看出:在這種購物流程中涉及到對數據庫表的頻繁操做,尤爲是用戶每選購一次商品,都要與數據庫進行鏈接,當用戶不少的時候就加大了服務器與數據庫的負荷。
答:一般使用一個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和咱們經過算法算的值相同,證實是一個正常的接口請求,咱們纔會返回相應的接口數據。
答:我主要用的第三方短信接口,在申請接口時進行相應信息的配置,而後在咱們站點須要用到短信驗證的地方進行調用,咱們一般在用戶註冊時使用到。
答:整體來講:在工做我主要遇到這幾個問題比較難處理:
①我以前工做的時候發現常常會出現一些臨時需求打亂了個人計劃,搞得有時候這個任務還沒完成,又得去作其餘的任務,最後一天下來,大大小小的東西是不少,可是沒有完成得很是好的,後面我總結了一下,我會把這些都添加優先級,遇到臨時需求,按照優先級從新將已有任務和臨時任務進行排版,保證在規定時間內有效率的完成優先級高的任務。
②在作項目需求時候,遇到理解能力欠佳的人,溝通時容易被氣到,影響本身的情緒,最後反倒還不能到達須要的效果。後面,每次到這種時候,我通常會藉助一些紙質的、更加形象的東西,讓雙方都認同的、都能明白的一種方式來進行溝通,後面減小了不少沒必要須的麻煩。你們都知道,對於程序員來講,改需求是一件很痛苦的事情,因此前期的溝通工做很重要。
③還有一件事時,我之前的領導不太懂技術,因此每次出一個新的需求出來,老是要求咱們在很短的時間內完成,完不成咱們就會被懷疑能力有問題。固然,每一個領導都但願本身的員工可以儘快的完成任務,下降成本,提升效率。這時候我會把咱們的需求細化,把其中的重點、難點都列出來,作好時間規劃,耐心的跟領導溝通,項目每一個點的重要性和時間的花費比例,確保在這個規劃的時間點內保質保量的完成任務。慢慢的也獲得了領導的承認,其實領導也不是一味的不通情理,只要把東西計劃好了,以最小的代價換取最高的價值,每一個人都是很容易理解得
答:用戶在不登陸的狀況下,能夠把要購買商品的信息(如商品的ID,商品的價格、商品的sku_id,購買數量等關鍵數據)存到COOKIE裏面,當登錄的狀況下。把COOKIE裏面的內容存到數據庫,並清除cookie中的數據。
答:寫過。接口分爲兩種:一種是數據型接口,一種是應用型接口。
數據型接口:是比抽象類更抽象的某種「結構」——它其實不是類,可是跟類同樣的某種語法結構,是一種結構規範,規範咱們類要以什麼格式進行定義,通常用於團隊比較大,分支比較多的狀況下使用。
應用型接口: API(application interface) 數據對外訪問的一個入口
我主要是參與的APP開發中接口的編寫,客戶端須要什麼樣的數據,咱們就給他們提供相應的數據,數據以json/xml的格式返回,而且配以相應的接口文檔。
答:SKU = Stock Keeping Unit (庫存量單位)
即庫存進出計量的單位,能夠是以件,盒,托盤等爲單位。SKU是庫存量單位,區分單品。
在服裝、鞋類商品中使用最多最廣泛。 例如紡織品中一個SKU一般表示:規格、顏色、款式。
在設計表時,不只僅只有商品表,商品表中有個總庫存,咱們還須要涉及一張SKU表,裏面有SKU庫存和單價字段,用戶每購買一件商品,實際上購買的都是SKU商品,這樣在下訂單成功後,應該根據所購買的商品的惟一的SKU號來進行相應的SKU庫存的減小,固然商品的總庫存保存在商品主表中,也須要減小總庫存中的庫存量。
關注微信公衆號:PHP大神,而後回覆「面試手冊」便可獲取~