版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、酒店預(yù)訂怎么實(shí)現(xiàn)?怎么設(shè)計(jì)表你好,我大約的說下我們的業(yè)務(wù)流程,我們的業(yè)務(wù)流程是:用戶在網(wǎng)站瀏覽酒店信息,可以根據(jù)地區(qū)檢索出該地區(qū)的酒店信息。列表展示酒店的信息由:酒店的名稱,酒店圖片,酒店位置,評論人數(shù),評論分?jǐn)?shù)以及最低入住價(jià)格。用戶選中要入住的酒店進(jìn)入酒店詳情頁面,查看酒店的介紹以及酒店的房型列表,用戶根據(jù)他要入住的時(shí)間和離店的時(shí)間,檢索出這個(gè)時(shí)間段內(nèi)的所有可選房型(房間數(shù)量-當(dāng)天的訂單-當(dāng)天未離店訂單=剩余房間數(shù)量)顯示給用戶。用戶選擇好房型后就可以進(jìn)行下單,規(guī)定有訂單的開始時(shí)間,結(jié)束時(shí)間,房間數(shù)量,住客姓名,抵店時(shí)間,聯(lián)系方式,備注信息等等。那我的表是這么設(shè)計(jì)的,總共有6張表,分別是:用戶表user,里面有下面幾個(gè)字段,(用戶編號,用戶名稱,用戶密碼,用戶聯(lián)系方式)酒店表hotel,里面有(酒店編號,酒店名稱,酒店圖片,評論人數(shù),評論分?jǐn)?shù),最低入住價(jià)格,所在地區(qū))酒店圖片表pic(圖片編號,圖片地址,圖片排序,圖片所屬酒店)評論表comment(評論編號,評論內(nèi)容,評論時(shí)間,用戶編號,酒店編號)房型表house(房型編號,床型,早餐,寬帶,人數(shù)上限,房價(jià),房間數(shù)量,最長預(yù)定期間)訂單表order(訂單編號,開始時(shí)間,結(jié)束時(shí)間,房間數(shù)量,住客姓名,最晚抵店時(shí)間,聯(lián)系電話,使用優(yōu)惠券,備注,訂單狀態(tài))以上就是我對這個(gè)酒店預(yù)訂系統(tǒng)的設(shè)計(jì)2、預(yù)定期間怎么寫入數(shù)據(jù)庫的以預(yù)訂當(dāng)時(shí)的時(shí)間戳作為預(yù)訂時(shí)間寫入數(shù)據(jù)庫。用戶下訂單時(shí)會選擇一個(gè)抵店時(shí)間,將該抵店時(shí)間以時(shí)間戳方式存入數(shù)據(jù)庫中。離店時(shí)間以當(dāng)時(shí)的日期轉(zhuǎn)為時(shí)間戳方式存入數(shù)據(jù)庫中3、怎么判斷尚有沒有房間我可以根據(jù)用戶的入住時(shí)間和離店時(shí)間來檢索這個(gè)有效時(shí)間段內(nèi)房間的庫存。房間數(shù)量扣除在這個(gè)時(shí)間段內(nèi)入住的訂單和在這個(gè)時(shí)間段內(nèi)離店的訂單??鄢蟮鹊降臄?shù)量才是這段時(shí)間內(nèi)有效房間數(shù)量。4、怎么記錄天天的房間庫存我的思緒是根據(jù)一個(gè)公式來推理實(shí)現(xiàn)的,天天房間的庫存=房型下房間數(shù)量-(當(dāng)天入住的訂單+當(dāng)天未離店的訂單),這樣我就可以得到天天尚有多少房間是剩余的了。5、怎么在數(shù)據(jù)庫里對房間做唯一標(biāo)記上面所設(shè)計(jì)的房型表就是我們的房間表,每個(gè)房間是唯一的,我們是使用數(shù)字作為編號的,也即使用主鍵作為唯一標(biāo)記。6、最近出的新功能最近我們出了個(gè)會員機(jī)制,客戶第一次預(yù)訂酒店成功后,可以辦理睬員卡,憑借會員卡,下次來的時(shí)候可以打折,會員在一些比較特殊的日期預(yù)訂酒店成功,可以享受不同樣的優(yōu)惠措施。怎么保證促銷商品不會超賣這個(gè)問題是我們當(dāng)時(shí)開發(fā)時(shí)碰到的一個(gè)難點(diǎn),超賣的因素重要是下的訂單的數(shù)目和我們要促銷的商品的數(shù)目不一致導(dǎo)致的,每次總是訂單的數(shù)比我們的促銷商品的數(shù)目要多,當(dāng)時(shí)我們的小組討論了好久,給出了好幾個(gè)方案來實(shí)現(xiàn):第一種方案是:①在每次下訂單前我們判斷促銷商品的數(shù)量夠不夠,不夠不允許下訂單,更改庫存量時(shí)加上一個(gè)條件,只更改商品庫存大于0的商品的庫存,當(dāng)時(shí)我們使用ab進(jìn)行壓力測試,當(dāng)并發(fā)超過500,訪問量超過2023時(shí),還是會出現(xiàn)超賣現(xiàn)象。所以被我們否認(rèn)了。第二種方案是:②使用mysql的事務(wù)加排他鎖來解決,一方面我們選擇數(shù)據(jù)庫的存儲引擎為innoDB,使用的是排他鎖實(shí)現(xiàn)的,剛開始的時(shí)候我們測試了下共享鎖,發(fā)現(xiàn)還是會出現(xiàn)超賣的現(xiàn)象。有個(gè)問題是,當(dāng)我們進(jìn)行高并發(fā)測試時(shí),對數(shù)據(jù)庫的性能影響很大,導(dǎo)致數(shù)據(jù)庫的壓力很大,最終也被我們否認(rèn)了。第三種方案是:③使用文獻(xiàn)鎖實(shí)現(xiàn)。當(dāng)用戶搶到一件促銷商品后先觸發(fā)文獻(xiàn)鎖,防止其他用戶進(jìn)入,該用戶搶到促銷品后再解開文獻(xiàn)鎖,放其他用戶進(jìn)行操作。這樣可以解決超賣的問題,但是會導(dǎo)致文獻(xiàn)得I/O開銷很大。最后我們使用了redis的隊(duì)列來實(shí)現(xiàn)。將要促銷的商品數(shù)量以隊(duì)列的方式存入redis中,每當(dāng)用戶搶到一件促銷商品則從隊(duì)列中刪除一個(gè)數(shù)據(jù),保證商品不會超賣。這個(gè)操作起來很方便,并且效率極高,最終我們采用這種方式來實(shí)現(xiàn)8、redis集群怎么做HYPERLINK""\o"Redis知識庫"\t""Redis集群提供了以下兩個(gè)好處??1、將數(shù)據(jù)自動切分(split)到多個(gè)節(jié)點(diǎn)? 2、當(dāng)集群中的某一個(gè)節(jié)點(diǎn)故障時(shí),redis還可以繼續(xù)解決客戶端的請求。?2、集群的方案:redis-cluster集群,采用無中心結(jié)構(gòu),每個(gè)節(jié)點(diǎn)保存數(shù)據(jù)和整個(gè)集群狀態(tài),每個(gè)節(jié)點(diǎn)都和其他所有節(jié)點(diǎn)連接,重要通過節(jié)點(diǎn)的配置,輔以redis的主歷來完畢集群。由于這塊東西我使用得很少,所以只是平時(shí)抽時(shí)間去研究過,并沒有真正的在線上實(shí)現(xiàn)過。9、redis和memcacahe、mongoDB的區(qū)別答:都是非關(guān)系型數(shù)據(jù)庫,性能都非常高,但是mongoDB和memcache、redis是不同的兩種類型。后兩者重要用于數(shù)據(jù)的緩存,前者重要用在查詢和儲存大數(shù)據(jù)方面,是最接近數(shù)據(jù)庫的文檔型的非關(guān)系數(shù)據(jù)庫。這里我重要談?wù)刴emcache和redis的區(qū)別。①從數(shù)據(jù)存儲位置上來分,memcache的數(shù)據(jù)存在內(nèi)存中,而redis既可以存儲在內(nèi)存中,也可以存儲的到磁盤中,達(dá)成持久化存儲的功能,memcache一旦斷電,數(shù)據(jù)所有丟失,redis可以運(yùn)用快照和AOF把數(shù)據(jù)存到磁盤中,當(dāng)恢復(fù)時(shí)又從磁盤中讀取到內(nèi)存中,當(dāng)物理內(nèi)存使用完畢后,可以把數(shù)據(jù)寫入到磁盤中。②從存儲數(shù)據(jù)的類型上來分,memcache和redis存儲的方式都是鍵值對,只但是redis值的類型比較豐富,有string(字符串),hash(哈希),list(列表),set(集合)zset(有序集合),而memcache重要存儲的是字符串。③從架構(gòu)層次來分,Redis支持master-slave(主—從)模式應(yīng)用,memcache支持分布式。④此外從存儲數(shù)據(jù)的大小上來分,Redis單個(gè)value的最大限制是1GB,memcached只能保存1MB的數(shù)據(jù)。但是Memcache在存儲100K以上的數(shù)據(jù),性能稍微好一點(diǎn)。⑤此外redis只支持單核,memcache可以支持多核,當(dāng)然關(guān)于redis取代memcache的說法,在一般情況下,兩者性能都很高,在大多的業(yè)務(wù)場景選擇上,redis的選擇也許更加具有優(yōu)勢,但也不能說可以完全取代,最終還是取決于你的應(yīng)用場景。10、持久化redis有幾種方式?答:重要有兩種方式:①快照持久化在redis配置文獻(xiàn)中已經(jīng)自動啟動了,格式是:saveNM表達(dá)在N秒之內(nèi),redis至少發(fā)生M次修改則redis抓快照到磁盤。當(dāng)然我們也可以手動執(zhí)行save或者bgsave(異步)命令來做快照②appendonlyfileAOF持久化總共有三種模式,如appendfsynceverysec默認(rèn)的是每秒強(qiáng)制寫入磁盤一次appendfsyncalways每次執(zhí)行寫操作的時(shí)候就強(qiáng)制寫入磁盤appendfsyncno完全取決于os,性能最佳但是持久化沒法保證其中第三種模式最佳。redis默認(rèn)的也是采用第三種模式。11、mysql存儲引擎答:常用的重要分為兩種,一種是innodb,一種是myisam,兩者的重要區(qū)別是①myisam不支持事務(wù)解決,而innoDB支持事務(wù)解決②myisam不支持外鍵,innoDB支持外鍵③myisam支持全文檢索,而innoDB在MySQL5.6版本之后才支持全文檢索④數(shù)據(jù)的存儲形式不同樣,mysiam表存放在三個(gè)文獻(xiàn):結(jié)構(gòu)、索引、數(shù)據(jù),innoDB存儲把結(jié)構(gòu)存儲為一個(gè)文獻(xiàn),索引和數(shù)據(jù)存儲為一個(gè)文獻(xiàn)⑤myisam在查詢和增長數(shù)據(jù)性能更優(yōu)于innoDB,innoDB在批量刪除方面性能較高。⑥myisam支持表鎖,而innoDB支持行鎖12、sql注入是什么及如何防止sql注入?答:SQL注入襲擊指的是用戶或者黑客通過構(gòu)建特殊的輸入作為參數(shù)傳入我們的Web應(yīng)用程序端,而這些輸入大都是SQL語法里的一些組合,通過執(zhí)行SQL語句進(jìn)而執(zhí)行襲擊者所要的操作,其重要因素是程序員沒有細(xì)致地過濾用戶輸入的數(shù)據(jù),致使非法數(shù)據(jù)侵入系統(tǒng)而導(dǎo)致的。因此我們在做開發(fā)過程中一定要防止sql注入,重要從兩方面著手:1、占位符的方式,就是對sql語句進(jìn)行預(yù)解決,然后執(zhí)行sql語句2、通過addslashes或者mysql_real_escape_string這兩個(gè)函數(shù)對用戶輸入的值進(jìn)行轉(zhuǎn)義解決,把一些特殊的字符轉(zhuǎn)義掉。13、有用過預(yù)解決么?答:用過,PDO類中,有個(gè)prepare方法可以實(shí)現(xiàn)預(yù)解決,PDOStament類中的excute方法可以執(zhí)行預(yù)解決,預(yù)解決的參數(shù)分為兩種,一種是:字符串占位符,另一種是?占位符,:字符串占位符在執(zhí)行預(yù)解決傳遞參數(shù)時(shí)傳入的是關(guān)聯(lián)數(shù)組,而?占位符傳遞的是索引數(shù)組。兩者不能混合使用,但一般推薦使用:字符串占位符。14、用框架還用自己的解決嗎答:一般成熟的開源框架中都考慮到了數(shù)據(jù)安全這方面的東西,但有時(shí)候我們也許會使用一些原生的SQL語句時(shí),我們就需要考慮自己對sql語句進(jìn)行預(yù)解決。當(dāng)然有時(shí)候框架中的過濾方法我們不希望采用,比如使用文本編輯器時(shí),我們可以使用自己的過濾方式。15、mysql優(yōu)化怎么做的?答:mysql優(yōu)化重要從以下幾個(gè)方面來實(shí)現(xiàn):①設(shè)計(jì)角度:存儲引擎的選擇,字段類型選擇,范式②功能角度:可以運(yùn)用mysql自身的特性,如索引,查詢緩存,碎片整理,分區(qū)、分表等③sql語句的優(yōu)化方面:盡量簡化查詢語句,能查詢字段少就盡量少查詢字段,優(yōu)化分頁語句、分組語句等。④部署大負(fù)載架構(gòu)體系:數(shù)據(jù)庫服務(wù)器單獨(dú)出來,負(fù)載大時(shí)可以采用主從復(fù)制,讀寫分離機(jī)制進(jìn)行設(shè)計(jì)⑤從硬件上升級數(shù)據(jù)庫服務(wù)器。16、訂單表用是什么存儲引擎答:由于訂單表存在著事務(wù)的解決,比如下了訂單,商品的庫存就要減少,這里就涉及到了事務(wù),所以就用到innodb19、sql語句的優(yōu)化答:一方面我們得擬定哪些sql語句需要優(yōu)化,一般在一個(gè)系統(tǒng)中,查詢語句最多,所以我們重要是針對查詢語句進(jìn)行優(yōu)化。重要采用兩種方式來擬定要優(yōu)化的sql語句:①使用慢查詢?nèi)沼?設(shè)立需要優(yōu)化的sql語句的執(zhí)行時(shí)間,記錄下超過該設(shè)立時(shí)間的語句,即為需要優(yōu)化的語句。②使用profiling機(jī)制,記錄下每條sql語句的執(zhí)行時(shí)間,找出執(zhí)行較慢的語句,即為需要優(yōu)化的語句。我們重要通過給表字段添加索引的方式進(jìn)行優(yōu)化,加上索引后,sql語句的執(zhí)行時(shí)間顯著提高了,但并不是加上索引了這條sql語句就會用到索引,所以一方面看執(zhí)行慢的語句后面是否有加索引,我們可以使用explain或者desc加在要執(zhí)行的sql語句前,查看是否使用到索引。有幾個(gè)地方需要注意的是:①為了避免建議索引而導(dǎo)致索引文獻(xiàn)過大,有時(shí)候我們會使用復(fù)合索引,這時(shí)候要遵循最左原則。②like查詢,前%不會用到索引③假如條件中有or,則規(guī)定or的索引字段都必須有索引,否則不能用到索引。④假如列類型是字符串,一定要在條件中將數(shù)據(jù)使用引號引用起來,否則不使用索引。⑤優(yōu)化groupby語句⑥盡量避免模糊匹配,這樣會導(dǎo)致全盤掃描21、索引有幾種歐4答:索引重要有:主鍵索引:數(shù)據(jù)記錄里面不能有null,數(shù)據(jù)內(nèi)容不能反復(fù),在一張表里面不能有多個(gè)主鍵索引。普通索引:使用字段關(guān)鍵字建立的索引,重要是提高查詢速度唯一索引:字段數(shù)據(jù)是唯一的,數(shù)據(jù)內(nèi)容里面能否為null,在一張表里面,是可以添加多個(gè)唯一索引。全文索引:在比較老的版本中,只有myisam引擎支持全文索引,在innodb5.6后引擎也支持全文索引,在mysql中全文索引不支持中文。我們一般使用sphinx集合coreseek來實(shí)現(xiàn)中文的全文索引。復(fù)合索引23、左前索引原則答:左前索引重要指的是在復(fù)合索引中,給兩個(gè)或多個(gè)字段建立了復(fù)合索引后,在sql語句后的條件中,只有復(fù)合索引前面的字段在條件的前面時(shí),該索引才起作用,比如創(chuàng)建了個(gè)復(fù)合索引index(a,b),在使用where或者orderby條件時(shí),假如只有條件b的,該索引不會生效,必須有條件a且必須要在條件b的前面該索引才會生效。24、分布式數(shù)據(jù)庫答:我所知道的分布式數(shù)據(jù)庫有memcache,重要是分布式的非關(guān)系型數(shù)據(jù)庫,用于緩存解決。分布式是指將不同的業(yè)務(wù)分布在不同的地方。而集群指的是將幾臺服務(wù)器集中在一起,實(shí)現(xiàn)同一業(yè)務(wù)。?分布式中的每一個(gè)節(jié)點(diǎn),都可以做集群。而集群并不一定就是分布式的。舉例:就比如新浪網(wǎng),訪問的人多了,他可以做一個(gè)群集,前面放一個(gè)響應(yīng)服務(wù)器,后面幾臺服務(wù)器完畢同一業(yè)務(wù),假如有業(yè)務(wù)訪問的時(shí)候,響應(yīng)服務(wù)器看哪臺服務(wù)器的負(fù)載不是很重,就將給哪一臺去完畢。
而分布式,從窄意上理解,也跟集群差不多,但是它的組織比較松散,不像集群,有一個(gè)組織性,一臺服務(wù)器垮了,其它的服務(wù)器可以頂上來。memcache的應(yīng)用場景1、合用memcached的業(yè)務(wù)場景?1)假如網(wǎng)站包含了訪問量很大的動態(tài)網(wǎng)頁,因而數(shù)據(jù)庫的負(fù)載將會很高。由于大部分?jǐn)?shù)據(jù)庫請求都是讀操作,那么memcached可以顯著地減小數(shù)據(jù)庫負(fù)載。2)運(yùn)用memcached可以緩存session數(shù)據(jù)、臨時(shí)數(shù)據(jù)以減少對他們的數(shù)據(jù)庫寫操作。4)緩存一些很小但是被頻繁訪問的文獻(xiàn)。5)訪問比較頻繁,安全性不高,丟失無所謂,修改比較頻繁的數(shù)據(jù),比如一些用戶的在線狀態(tài)2、不合用memcached的業(yè)務(wù)場景?1)緩存對象的大小大于1MBmemcache自身就不是為了解決龐大的多媒體(largemedia)和巨大的二進(jìn)制塊(streaminghugeblobs)而設(shè)計(jì)的。2)key的長度大于250字符3)應(yīng)用運(yùn)營在不安全的環(huán)境中4)業(yè)務(wù)自身需要的是持久化數(shù)據(jù)或者說需要的應(yīng)當(dāng)是database25、nginx日記,怎么記錄每個(gè)ip的訪問量(參考阿銘哥手冊)stub_stat(yī)us模塊重要用于查看Nginx的一些狀態(tài)信息,例如記錄nginx的訪問量,一方面我們得查看該模塊有沒有安裝,假如沒有安裝,得先安裝,安裝好后,修改nginx的配置文獻(xiàn),啟動該模塊,然后就可以使用以下命令來進(jìn)行記錄,如:1.根據(jù)訪問IP記錄UVawk'{print$1}'
access.log|sort|uniq-c|wc-l2.記錄訪問URL記錄PVawk'{print$7}'access.log|wc-l3.查詢訪問最頻繁的URLawk'{print$7}'access.log|sort|uniq-c|sort-n-k1-r|more4.查詢訪問最頻繁的IPawk'{print$1}'access.log|sort|uniq-c|sort-n-k1-r|more記錄nginx日記中訪問最多的100個(gè)ip及訪問次數(shù)awk‘{print$1}’access.log|sort|uniq-c|sort-n-k1-r|head-n10026、http協(xié)議HTTP是一個(gè)屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議,由于其簡捷、快速的方式,合用于分布式超媒體信息系統(tǒng)HTTP協(xié)議的重要特點(diǎn)可概括如下:? 1.支持客戶/服務(wù)器模式。? 2.簡樸快速:客戶向服務(wù)器請求服務(wù)時(shí),只需傳送請求方法和途徑。請求方法常用 的有GET、HEAD、POST。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同。由于HTTP 協(xié)議簡樸,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度不久。? 3.靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對象。正在傳輸?shù)念愋陀蒀ontent-Type加 ?以標(biāo)記。? ?4.無連接:無連接的含義是限制每次連接只解決一個(gè)請求。服務(wù)器解決完客戶的請求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時(shí)間。? ?5.無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務(wù)解決沒有記憶能力。 缺少狀態(tài)意味著假如后續(xù)解決需要前面的信息,則它必須重傳,這樣也許導(dǎo)致每次 連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。27、cookie與session的區(qū)別?1、cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上。2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙
考慮到安全應(yīng)當(dāng)使用session。3、session會在一定期間內(nèi)保存在服務(wù)器上。當(dāng)訪問增多,會比較占用你服務(wù)器的性能
考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用COOKIE。4、單個(gè)cookie保存的數(shù)據(jù)不能超過4K,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie。5、所以個(gè)人建議:?
將登陸信息等重要信息存放為SESSION?
其他信息假如需要保存,可以放在COOKIE中28、php在儲存session以什么形式存在 PHP為session的存儲提供了三種方式:文獻(xiàn)/內(nèi)存/自定義存儲,默認(rèn)是使用文獻(xiàn)存儲.在訪問量大的網(wǎng)站上采用這種方式就不大合適,由于這樣會導(dǎo)致大量的輸入輸出的冗余.我們可以在php.ini更改配置文獻(xiàn)或者php腳本中通過相應(yīng)的函數(shù)來設(shè)立session文獻(xiàn)的存儲類型來改變session文獻(xiàn)的存儲形式29、xss襲擊怎么防止XSS又稱CSS,全稱CrossSiteScript(跨站腳本襲擊),XSS襲擊類似于SQL注入襲擊,是Web程序中常見的漏洞,XSS屬于被動式且用于客戶端的襲擊方式,所以容易被忽略其危害性。其原理是襲擊者向有XSS漏洞的網(wǎng)站中輸入(傳入)惡意的HTML代碼,當(dāng)用戶瀏覽該網(wǎng)站時(shí),這段HTML代碼會自動執(zhí)行,從而達(dá)成襲擊的目的。如,盜取用戶Cookie信息、破壞頁面結(jié)常見的惡意字符XSS輸入:1.XSS輸入通常包含JavaScript腳本,如彈出惡意警告框:<script>alert("XSS");</script>2.XSS輸入也也許是HTML代碼段,譬如:(1)網(wǎng)頁不斷地刷新<metahttp-equiv="refresh"content="0;">(2)嵌入其它網(wǎng)站的鏈接<iframesrc=http://xxxxwidth=250height=250></iframe>構(gòu)、重定向到其它網(wǎng)站等。方法:運(yùn)用phphtmlentities()函數(shù)php防止XSS跨站腳本襲擊的方法:是針對非法的HTML代碼涉及單雙引號等,使用htmlspecialchars()函數(shù)。在使用htmlspecialchars()函數(shù)的時(shí)候注意第二個(gè)參數(shù),直接用htmlspecialchars($string)的話,第二個(gè)參數(shù)默認(rèn)是ENT_COMPAT,函數(shù)默認(rèn)只是轉(zhuǎn)化雙引號("),不對單引號(')做轉(zhuǎn)義。所以,htmlspecialchars()函數(shù)更多的時(shí)候要加上第二個(gè)參數(shù),應(yīng)當(dāng)這樣用:htmlspecialchars($string,ENT_QUOTES)。當(dāng)然,假如需要不轉(zhuǎn)化如何的引號,用htmlspecialchars($string,ENT_NOQUOTES)。此外,盡量少用htmlentities(),在所有英文的時(shí)候htmlentities()和htmlspecialchars()沒有區(qū)別,都可以達(dá)成目的。但是,中文情況下,htmlentities()卻會轉(zhuǎn)化所有的html代碼,連同里面的它無法辨認(rèn)的中文字符也給轉(zhuǎn)化了。htmlentities()和htmlspecialchars()這兩個(gè)函數(shù)對單引號(')之類的字符串支持不好,都不能轉(zhuǎn)化,所以用htmlentities()和htmlspecialchars()轉(zhuǎn)化的字符串只能防止XSS襲擊,不能防止SQL注入襲擊。所有有打印的語句如echo,print等,在打印前都要使用htmlentities()進(jìn)行過濾,這樣可以防止XSS,注意中文要寫出htmlentities($name,ENT_NOQUOTES,GB2312)。30、禁用cookie后,session還能用嗎?可以,在存儲session的文獻(xiàn)中,生成sessionI(lǐng)D,通過get傳參的方式將sessionID傳到要實(shí)現(xiàn)session共享的頁面,讀取sessionID,從而從session中獲取數(shù)據(jù)。31、mongodb基于什么開發(fā)的?MongoDB是一個(gè)基于分布式文獻(xiàn)存儲的數(shù)據(jù)庫。由C++語言編寫。旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲解決方案。32、mongodb是非范式還是范式?數(shù)據(jù)表達(dá)的方式有很多種,其中最重要的問題之一就是在多大限度上對數(shù)據(jù)進(jìn)行范式化。范式化(normalization)是將數(shù)據(jù)分散到多個(gè)不同的集合,不同集合之間可以互相引用數(shù)據(jù)。雖然很多文檔可以引用某一塊數(shù)據(jù),但是這塊數(shù)據(jù)只存儲在一個(gè)集合中。所以,假如要修改這塊數(shù)據(jù),只需修改保存這塊數(shù)據(jù)的那一個(gè)文檔就行了。但是,MongoDB沒有提供連接(join)工具,所以在不同集合之間執(zhí)行連接查詢需要進(jìn)行多次查詢。反范式化(denormalizat(yī)ion)與范式化相反:將每個(gè)文檔所需的數(shù)據(jù)都嵌入在文檔內(nèi)部。每個(gè)文檔都擁有自己的數(shù)據(jù)副本,而不是所有文檔共同引用同一個(gè)數(shù)據(jù)副本。這意味著,假如信息發(fā)生了變化,那么所有相關(guān)文檔都需要進(jìn)行更新,但是在執(zhí)行查詢時(shí),只需要一次查詢,就可以得到所有數(shù)據(jù)。決定何時(shí)采用范式化何時(shí)采用反范式化時(shí)比較困難的。范式化可以提高數(shù)據(jù)寫入速度,反范式化可以提高數(shù)據(jù)讀取速度。需要根據(jù)自己應(yīng)用程序的十幾需要仔細(xì)權(quán)衡。33、mongodb與mysql區(qū)別MySQL是關(guān)系型數(shù)據(jù)庫。優(yōu)勢:在不同的引擎上有不同的存儲方式。查詢語句是使用傳統(tǒng)的sql語句,擁有較為成熟的體系,成熟度很高。開源數(shù)據(jù)庫的份額在不斷增長,mysql的份額頁在連續(xù)增長。缺陷:在海量數(shù)據(jù)解決的時(shí)候效率會顯著變慢。Mongodb是非關(guān)系型數(shù)據(jù)庫(nosql),屬于文檔型數(shù)據(jù)庫。文檔是mongoDB中數(shù)據(jù)的基本單元,類似關(guān)系數(shù)據(jù)庫的行,多個(gè)鍵值對有序地放置在一起便是文檔,語法有點(diǎn)類似javascript面向?qū)ο蟮牟樵冋Z言,它是一個(gè)面向集合的,模式自由的文檔型數(shù)據(jù)庫。存儲方式:虛擬內(nèi)存+持久化。查詢語句:是獨(dú)特的Mongodb的查詢方式。適合場景:事件的記錄,內(nèi)容管理或者博客平臺等等。架構(gòu)特點(diǎn):可以通過副本集,以及分片來實(shí)現(xiàn)高可用。數(shù)據(jù)解決:數(shù)據(jù)是存儲在硬盤上的,只但是需要經(jīng)常讀取的數(shù)據(jù)會被加載到內(nèi)存中,將數(shù)據(jù)存儲在物理內(nèi)存中,從而達(dá)成高速讀寫。成熟度與廣泛度:新興數(shù)據(jù)庫,成熟度較低,Nosql數(shù)據(jù)庫中最為接近關(guān)系型數(shù)據(jù)庫,比較完善的DB之一,合用人群不斷在增長。優(yōu)點(diǎn):快速!在適量級的內(nèi)存的Mongodb的性能是非常迅速的,它將熱數(shù)據(jù)存儲在物理內(nèi)存中,使得熱數(shù)據(jù)的讀寫變得十分快。高擴(kuò)展性,存儲的數(shù)據(jù)格式是json格式!缺陷:不支持事務(wù),并且開發(fā)文檔不是很完全,完善。Mysql和Mongodb重要應(yīng)用場景(簡樸了解敘述下即可)1.假如需要將mongodb作為后端db來代替mysql使用,即這里mysql與mongodb屬于平行級別,那么,這樣的使用也許有以下幾種情況的考量:(1)mongodb所負(fù)責(zé)部分以文檔形式存儲,可以有較好的代碼親和性,json格式的直接寫入方便。(如日記之類)(2)從dat(yī)amodels設(shè)計(jì)階段就將原子性考慮于其中,無需事務(wù)之類的輔助。開發(fā)用如nodejs之類的語言來進(jìn)行開發(fā),對開發(fā)比較方便。(3)mongodb自身的failover機(jī)制,無需使用如MHA之類的方式實(shí)現(xiàn)。2.將mongodb作為類似redis,memcache來做緩存db,為mysql提供服務(wù),或是后端日記收集分析??紤]到mongodb屬于nosql型數(shù)據(jù)庫,sql語句與數(shù)據(jù)結(jié)構(gòu)不如mysql那么親和,也會有很多時(shí)候?qū)ⅲ恚飊godb做為輔助mysql而使用的類redismemcache之類的緩存db來使用。亦或是僅作日記收集分析。34、寫一個(gè)函數(shù)記錄每一個(gè)元素出現(xiàn)的次數(shù) PHP中的array_count_values()函數(shù)可以實(shí)現(xiàn)array_count_values()函數(shù)用于記錄數(shù)組中所有值出現(xiàn)的次數(shù)。本函數(shù)返回一個(gè)數(shù)組,其元素的鍵名是原數(shù)組的值,鍵值是該值在原數(shù)組中出現(xiàn)的次數(shù)。35、手寫排序重要從原理方面來說:重點(diǎn)介紹冒泡排序和選擇排序 //冒泡排序function
BubbleSort($arr)
{
//
獲得數(shù)組總長度
$num
=
count($arr);
//
正向遍歷數(shù)組
for
($i
=
1;
$i
<
$num;
$i++)
{
//
反向遍歷
for
($j
=
$num
-
1;
$j
>=
$i
;
$j--)
{
//
相鄰兩個(gè)數(shù)比較
if
($arr[$j]
<
$arr[$j-1])
{
//
暫存較小的數(shù)
$iTemp
=
$arr[$j-1];
//
把較大的放前面
$arr[$j-1]
=
$arr[$j];
//
較小的放后面
$arr[$j]
=
$iTemp;
}
}
}
return
$arr;}//互換法排序function
ExchangeSort($arr){
$num
=
count($arr);
//
遍歷數(shù)組
for
($i
=
0;$i
<
$num
-
1;
$i++)
{
//
獲得當(dāng)前索引的下一個(gè)索引
for
($j
=
$i
+
1;
$j
<
$num;
$j++)
{
//
比較相鄰兩個(gè)的值大小
if
($arr[$j]
<
$arr[$i])
{
//
暫存較小的數(shù)
$iTemp
=
$arr[$i];
//
把較大的放前面
$arr[$i]
=
$arr[$j];
//
較小的放后面
$arr[$j]
=
$iTemp;
}
}
}
return
$arr;}//選擇法排序function
SelectSort($arr)
{
//
獲得數(shù)組總長度
$num
=
count($arr);
//
遍歷數(shù)組
for
($i
=
0;$i
<
$num-1;
$i++)
{
//
暫存當(dāng)前值
$iTemp
=
$arr[$i];
//
暫存當(dāng)前位置
$iPos
=
$i;
//
遍歷當(dāng)前位置以后的數(shù)據(jù)
for
($j
=
$i
+
1;$j
<
$num;
$j++){
//
假如有小于當(dāng)前值的
if
($arr[$j]
<
$iTemp)
{
//
暫存最小值
$iTemp
=
$arr[$j];
//
暫存位置
$iPos
=
$j;
}
}
//
把當(dāng)前值放到算好的位置
$arr[$iPos]
=
$arr[$i];
//
把當(dāng)前值換成算好的值
$arr[$i]
=
$iTemp;
}
return
$arr;}//插入法排序function
InsertSort($arr){
$num
=
count($arr);
//
遍歷數(shù)組
for
($i
=
1;$i
<
$num;
$i++)
{
//
獲得當(dāng)前值
$iTemp
=
$arr[$i];
//
獲得當(dāng)前值的前一個(gè)位置
$iPos
=
$i
-
1;
//
假如當(dāng)前值小于前一個(gè)值切未到數(shù)組開始位置
while
(($iPos
>=
0)
&&
($iTemp
<
$arr[$iPos]))
{
//
把前一個(gè)的值往后放一位
$arr[$iPos
+
1]
=
$arr[$iPos];
//
位置遞減
$iPos--;
}
$arr[$iPos+1]
=
$iTemp;
}
return
$arr;}//快速排序function
QuickSort($arr){
$num
=
count($arr);
$l
=
$r
=
0;
$left
=
$right
=
array();
//
從索引的第二個(gè)開始遍歷數(shù)組
for
($i
=
1;$i
<
$num;
$i++)
{
//
假如值小于索引1
if
($arr[$i]
<
$arr[0])
{
//
裝入左索引數(shù)組(小于索引1的數(shù)據(jù))
$left[]
=
$arr[$i];
$l++;
}
else
{
//
否則裝入右索引中(大于索引1的數(shù)據(jù))
$right[]
=
$arr[$i];
$r++;
//
}
}
//
假如左索引有值
則對左索引排序
if($l
>
1)
{
$left
=
QuickSort($left);
}
//
排序后的數(shù)組
$new_arr
=
$left;
//
將當(dāng)前數(shù)組第一個(gè)放到最后
$new_arr[]
=
$arr[0];
//
假如又索引有值
則對右索引排序
if
($r
>
1)
{
$right
=
QuickSort($right);
}
//
根據(jù)右索引的長度再次增長數(shù)據(jù)
for($i
=
0;$i
<
$r;
$i++)
{
$new_arr[]
=
$right[$i];
}
return
$new_arr;}36、設(shè)計(jì)模式在PHP中,我重要使用了以下兩種設(shè)計(jì)模式1、單例模式單例模式顧名思義,就是只有一個(gè)實(shí)例。作為對象的創(chuàng)建模式,單例模式保證某一個(gè)類只有一個(gè)實(shí)例,并且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。單例模式的要點(diǎn)有三個(gè):一是某個(gè)類只能有一個(gè)實(shí)例;二是它必須自行創(chuàng)建這個(gè)實(shí)例;三是它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。典型的代表如框架中的基類對象。2、簡樸工廠模式①抽象基類:類中定義抽象一些方法,用以在子類中實(shí)現(xiàn)②繼承自抽象基類的子類:實(shí)現(xiàn)基類中的抽象方法③工廠類:用以實(shí)例化所有相相應(yīng)的子類這種我們使用最常見,基本所有的MVC框架中都是這樣產(chǎn)生的。37、用過什么PHP框架在開發(fā)過程中,我重要使用過了這么幾種框架。thinkPHP框架、CI框架,laravel框架和yii框架。我接觸到的第一個(gè)框架是TP框架,我簡樸的說下我對這幾個(gè)框架的見解:ThinkPHP框架優(yōu)點(diǎn):TP借鑒了Java思想,基于PHP5,充足運(yùn)用了PHP5的特性,部署簡樸只需一個(gè)入口文獻(xiàn),一切搞定,簡樸高效,中文文檔齊全,入門超級簡樸。自帶模板引擎,具有獨(dú)特的數(shù)據(jù)驗(yàn)證和自動填充功能,框架更新速度比較迅速。缺陷:一個(gè)Model中可以操作多個(gè)表,但TP只能一個(gè)。?TP默認(rèn)初始化了很多配置,使用起來很方便,但自然也會影響效率。但是把一些加載配置的時(shí)間拿去研究算法,這些小影響近乎可以忽略了。CodeIgniter框架優(yōu)點(diǎn):配置簡樸,上手不久,所有的配置使用PHP腳本來配置,沒有使用很多太復(fù)雜的設(shè)計(jì)模式,執(zhí)行性能和代碼可讀性上都不錯(cuò),執(zhí)行效率比較高,具有基本的MVC功能.快速簡潔,代碼量少,框架簡樸,容易上手,自帶了很多簡樸好用的library,框架適合中小型項(xiàng)目,大型項(xiàng)目也不是不可以,只是擴(kuò)展能力稍差。缺陷:1.把Model層簡樸的理解為數(shù)據(jù)庫操作2.PHP框架略顯簡樸,只可以滿足小型應(yīng)用,略微不太可以滿足中型應(yīng)用需要laravel框架(目前最新的是5.3,規(guī)定PHP版本較高5.6)?優(yōu)點(diǎn):1.Laravel注重代碼的模塊化和可擴(kuò)展性。2.artisan:命令行工具,很多手動的工作都自動了3.可繼承的模版,簡化view的開發(fā)和管理Laravel一直是PHP開發(fā)者最受歡迎的PHP框架。這是一個(gè)年輕的框架,但是擁有優(yōu)雅的語法,可簡樸快速開發(fā)你的應(yīng)用。它擁有大多數(shù)常見的功能,如:路由,身份驗(yàn)證,會話,隊(duì)列和緩存。缺陷:laravel的中英文文檔比較少demo也比較少有時(shí)候一個(gè)功能要試好久甚至要看源碼YII框架(目前是2.0版本)優(yōu)點(diǎn):1、快速,靈敏,不拖沓,給程序員飛翔的能力;2、有g(shù)ii功能!(創(chuàng)建控制器,model層,crud等操作);3、具有高度的可重用性和可擴(kuò)展性,是純粹的面向?qū)ο蟮?。開發(fā)速度快,完備的文檔,可重用性可高擴(kuò)展,是最高效的開發(fā)框架之一。缺陷:1、對Model層的指導(dǎo)和考慮較少2、文檔實(shí)例較少3、英文太多4、規(guī)定PHP技術(shù)精通,OOP編程要純熟?。怠⒁?guī)定會bootstrap38、代碼管理工具我使用過的版本控制工具有兩種:初期的時(shí)候使用的是SVN,現(xiàn)在重要使用git,我就我個(gè)人的觀點(diǎn),簡樸的說下兩者的區(qū)別:1.Git是分布式的,SVN是集中式的,好處是跟其他同事不會有太多的沖突,自己寫的代碼放在自己電腦上,一段時(shí)間后再提交、合并,也可以不用聯(lián)網(wǎng)在本地提交;2.Git下載下來后,在本地不必聯(lián)網(wǎng)就可以看到所有的log,很方便學(xué)習(xí),SVN卻需要聯(lián)網(wǎng);3.Git鼓勵(lì)分Branch(分支),而SVN,說實(shí)話,我用Branch的次數(shù)還挺少的,SVN自帶的Branchmerge我還真沒用過,有merge時(shí)用的是BeyondCompare工具合并后再Commit的;4.SVN在Commit前,我們都建議是先Update一下,跟本地的代碼并確編譯沒問題,保開發(fā)的功能正常后再提交SVN
的重要功能
SVN屬于集中化的版本控制系統(tǒng),有個(gè)不太精確的比方:SVN=
版本控制+
備份服務(wù)器
SVN使用起來有點(diǎn)像是檔案倉庫的感覺,支持并行讀寫文獻(xiàn),支持代碼的版本化管理,功能涉及取出、導(dǎo)入、更新、分支、改名、還原、合并等。
功能有許多我就不一一列了,SVN大都采用圖形界面操作,直觀,上手快。Git的重要功能
Git是一個(gè)分布式版本控制系統(tǒng),操作命令涉及:clone,pull,push,branch,merge,rebas,Git擅長的是程序代碼的版本化管理。SVN
的優(yōu)缺陷
SVN對中文支持好,操作簡樸,使用沒有難度,美工人員,產(chǎn)品人員,測試人員,實(shí)行人員都可輕松上手。使用界面統(tǒng)一,功能完善,操作方便。Git的優(yōu)缺陷
對程序源代碼進(jìn)行差異化的版本管理,代碼庫占很少的空間。易于代碼的分支化管理。不支持中文,圖形界面支持差,使用難度大。不易推廣。SVN
和
Git
哪個(gè)更合用于項(xiàng)目管理?
SVN更合用于項(xiàng)目管理,
Git僅合用于代碼管理。
一個(gè)研發(fā)隊(duì)伍的成員正常涉及:需求分析、設(shè)計(jì)、美工、程序員、測試、實(shí)行、運(yùn)維,每個(gè)成員在工作中都有產(chǎn)出物,
涉及了文檔、設(shè)計(jì)代碼、程序代碼,這些都需要按項(xiàng)目集中進(jìn)行管理的。SVN能清楚的按目錄進(jìn)行分類管理,使項(xiàng)目組的管理處在有序高效的狀態(tài)?,F(xiàn)在越來越多人使用git做為版本控制工具,我以前的公司也是使用git.39、手寫單例模式怎么寫三私一公。classExample{//保存例實(shí)例在此屬性中privatestatic$_instance;
//構(gòu)造函數(shù)聲明為privat(yī)e,防止直接創(chuàng)建對象privatefunction__construct(){echo'IamConstruceted';}
//單例方法publicstaticfunctionsingleton(){if(?。閟set(self::$_instance)){$c=__CLASS__;self::$_instance=new$c;}returnself::$_instance;}
//阻止用戶復(fù)制對象實(shí)例publicfunction__clone(){trigger_error('Cloneisnotallow',E_USER_ERROR);}
functiontest(){echo("test");
}}
//這個(gè)寫法會犯錯(cuò),由于構(gòu)造方法被聲明為private$test=newExample;
//下面將得到Example類的單例對象$test=Example::singleton();$test->test();
//復(fù)制對象將導(dǎo)致一個(gè)E_USER_ERROR.$test_clone=clone$test;?>40、nosql和Mysql的區(qū)別也即非關(guān)系型數(shù)據(jù)庫和關(guān)系型數(shù)據(jù)庫。目前世界上主流的存儲系統(tǒng)大部分還是采用了關(guān)系型數(shù)據(jù)庫,其重要有一下優(yōu)點(diǎn):1.事務(wù)解決—保持?jǐn)?shù)據(jù)的一致性;2.由于以標(biāo)準(zhǔn)化為前提,數(shù)據(jù)更新的開銷很小(相同的字段基本上只有一處);3.可以進(jìn)行Join等復(fù)雜查詢。nosql在優(yōu)勢方面,重要體現(xiàn)在下面這三點(diǎn):
?1.簡樸的擴(kuò)展:典型例子是Cassandra,由于其架構(gòu)是類似于經(jīng)典的P2P,所以能通過輕松地添加新的節(jié)點(diǎn)來擴(kuò)展這個(gè)集群;
?2.快速的讀寫:重要例子有Redis,由于其邏輯簡樸,并且純內(nèi)存操作,使得其性能非常杰出,單節(jié)點(diǎn)每秒可以解決超過10萬次讀寫操作;
?3.低廉的成本:這是大多數(shù)分布式數(shù)據(jù)庫共有的特點(diǎn),由于重要都是開源軟件,沒有昂貴的License成本;
?4.
?但瑕不掩瑜,NoSQL數(shù)據(jù)庫還存在著很多的局限性,常見重要有下面這幾個(gè):
?1.不提供對SQL的支持:假如不支持SQL這樣的工業(yè)標(biāo)準(zhǔn),將會對用戶產(chǎn)生一定的學(xué)習(xí)和應(yīng)用遷移成本;
2.支持的特性不夠豐富:現(xiàn)有產(chǎn)品所提供的功能都比較有限,大多數(shù)NoSQL數(shù)據(jù)庫都不支持事務(wù),也不像SQLServer和HYPERLINK""\o"Oracle知識庫"Oracle那樣能提供各種附加功能,比如BI和報(bào)表等;
?3.現(xiàn)有產(chǎn)品的不夠成熟:大多數(shù)產(chǎn)品都還處在初創(chuàng)期,和關(guān)系型數(shù)據(jù)庫幾十年的完善不可同日而語;
41、在TP中M方法與D方法的區(qū)別雖然都是實(shí)例化模型對象,兩者還是有區(qū)別的D和M的區(qū)別重要在于M方法不需要?jiǎng)?chuàng)建模型類文獻(xiàn),M方法不會讀取模型類,所以默認(rèn)情況下自動驗(yàn)證是無效的,但是可以通過動態(tài)賦值的方式實(shí)現(xiàn)而D方法必須有創(chuàng)建模型類。我們可以用下面兩種方法去創(chuàng)建一個(gè)數(shù)據(jù)表的映射對象第一種:$Test=D(‘Test’)第二種:$Test=newModel(‘Test’)雖然這兩種都可以對數(shù)據(jù)進(jìn)行select,insert,delete,udpate操作,在數(shù)據(jù)驗(yàn)證上有很大的不同,用第一種方式實(shí)例一個(gè)模型就會有數(shù)據(jù)檢查功能,假如title沒有填寫的話就會提醒“請輸入標(biāo)題”(這個(gè)是tp提供的一個(gè)自動驗(yàn)證功能,當(dāng)然也需要在相應(yīng)的model中定義好驗(yàn)證條件);假如用第二種就沒有了這個(gè)數(shù)據(jù)驗(yàn)證功能,需要手動驗(yàn)證。D函數(shù)實(shí)例化的是你當(dāng)前項(xiàng)目的Lib/Model下面的模塊。
假如該模塊不存在的話,直接返回實(shí)例化Model的對象(意義就與M()函數(shù)相同)。
而M只返回,實(shí)例化Model的對象。它的$name參數(shù)作為HYPERLINK""\o"MySQL知識庫"\t""數(shù)據(jù)庫的表名來解決對數(shù)據(jù)庫的操作。42、對網(wǎng)站大訪問量的優(yōu)化方案提高訪問速度。從硬件,最佳從網(wǎng)站程序等等方面考慮。我給出以下幾種方案:1.盡量使用靜態(tài)頁,不要老使用動態(tài)信息調(diào)用。非常容易出問題
2.圖片內(nèi)容與網(wǎng)站數(shù)據(jù)盡量放在同一個(gè)服務(wù)器或者機(jī)房內(nèi)。大量外鏈圖片是會有問題的
3.一次又一次,一遍又一遍的分析流量走向,然后縮短瀏覽者瀏覽距離,舉個(gè)例子,瀏覽者假如現(xiàn)在在你網(wǎng)站看一個(gè)新聞需要點(diǎn)5次鼠標(biāo),你就要縮短這個(gè)點(diǎn)擊數(shù)。
4.一次又一次,一遍又一遍的分析,修改你的網(wǎng)站HYPERLINK""\t""數(shù)據(jù)庫結(jié)構(gòu),使其更加簡潔。?5.提高網(wǎng)站的安防能力?6.買個(gè)好服務(wù)器,托管在一個(gè)好的機(jī)房!43、HYPERLINK""網(wǎng)站高并發(fā)大流量訪問的解決及解決方法第一:確認(rèn)服務(wù)器硬件是否足夠支持當(dāng)前的流量。
普通的P4服務(wù)器一般最多能支持天天10萬獨(dú)立IP,假如訪問量比這個(gè)還要大,那么必須一方面配置一臺更高性能的專用服務(wù)器才干解決問題,否則怎么優(yōu)化都不也許徹底解決性能問題。
第二:優(yōu)化數(shù)據(jù)庫訪問?前臺實(shí)現(xiàn)完全的靜態(tài)化當(dāng)然最佳,可以完全不用訪問數(shù)據(jù)庫,但是對于頻繁更新的網(wǎng)站,靜態(tài)化往往不能滿足某些功能。?緩存就是另一個(gè)解決方案,就是將動態(tài)數(shù)據(jù)存儲到緩存文獻(xiàn)中,動態(tài)網(wǎng)頁直接調(diào)用這些文獻(xiàn),而不必再訪問數(shù)據(jù)庫,技術(shù)假如的確無法避免對數(shù)據(jù)庫的訪問,那么可以嘗試優(yōu)化數(shù)據(jù)庫的查詢SQL.避免使用Select*from這樣的語句,每次查詢只返回自己需要的結(jié)果,避免短時(shí)間內(nèi)的大量SQL查詢。最佳在相同字段進(jìn)行比較操作,在建立好的索引字段上盡量減少函數(shù)操作,假如要做到極致的話需要代碼的優(yōu)化;?第三,嚴(yán)禁外部的盜鏈。
外部網(wǎng)站的或者文獻(xiàn)盜鏈往往會帶來大量的負(fù)載壓力,因此應(yīng)當(dāng)嚴(yán)格限制外部對于自身的圖片或者文獻(xiàn)盜鏈,好在目前可以簡樸地通過refer來控制盜鏈,自己就可以通過配置來嚴(yán)禁盜鏈。當(dāng)然,偽造refer也可以通過來實(shí)現(xiàn)盜鏈,但是目前蓄意偽造refer盜鏈的還不多,可以先不去考慮,或者使用非技術(shù)手段來解決,比如在圖片上增長水印。
第四,控制大文獻(xiàn)的下載。
大文獻(xiàn)的下載會占用很大的流量,并且對于非SCSI硬盤來說,大量文獻(xiàn)下載會消耗CPU,使得網(wǎng)站響應(yīng)能力下降。因此,盡量不要提供超過2M的大文獻(xiàn)下載,假如需要提供,建議將大文獻(xiàn)放在此外一臺服務(wù)器上。
第五,使用不同主機(jī)分流重要流量?將文獻(xiàn)放在不同的主機(jī)上,提供不同的鏡像供用戶下載。比如假如覺得RSS文獻(xiàn)占用流量大,那么使用FeedBurner或者FeedSky等服務(wù)將RSS輸出放在其他主機(jī)上,這樣別人訪問的流量壓力就大多集中在FeedBurner的主機(jī)上,RSS就不占用太多資源了。?第六,使用流量分析記錄軟件。
在網(wǎng)站上一個(gè)流量分析記錄軟件,可以即時(shí)知道哪些地方花費(fèi)了大量流量,哪些頁面需要再進(jìn)行優(yōu)化,因此,解決流量問題還需要進(jìn)行精確的記錄分析才可以。我推薦使用的流量分析記錄軟件是Analytics(Google分析)。45、重要運(yùn)用到哪些緩存一、數(shù)據(jù)緩存這里所說的數(shù)據(jù)緩存是指數(shù)據(jù)庫查詢緩存,每次訪問頁面的時(shí)候,都會先檢測相應(yīng)的緩存數(shù)據(jù)是否存在,假如不存在,就連接數(shù)據(jù)庫,得到數(shù)據(jù),并把查詢結(jié)果序列化后保存到文獻(xiàn)中,以后同樣的查詢結(jié)果就直接從緩存表或文獻(xiàn)中獲得。用的最廣的例子看Discuz的搜索功能,把結(jié)果ID緩存到一個(gè)表中,下次搜索相同關(guān)鍵字時(shí)先搜索緩存表。?舉個(gè)常用的方法,多表關(guān)聯(lián)的時(shí)候,把附表中的內(nèi)容生成數(shù)組保存到主表的一個(gè)字段中,需要的時(shí)候數(shù)組分解一下,這樣的好處是只讀一個(gè)表,壞處就是兩個(gè)數(shù)據(jù)同步會多不少環(huán)節(jié),數(shù)據(jù)庫永遠(yuǎn)是瓶頸,用硬盤換速度,是這個(gè)的關(guān)鍵點(diǎn)。二、頁面緩存每次訪問頁面的時(shí)候,都會先檢測相應(yīng)的緩存頁面文獻(xiàn)是否存在,假如不存在,就連接數(shù)據(jù)庫,得到數(shù)據(jù),顯示頁面并同時(shí)生成緩存頁面文獻(xiàn),這樣下次訪問的時(shí)候頁面文獻(xiàn)就發(fā)揮作用了。(模板引擎和網(wǎng)上常見的一些緩存類通常有此功能)。三、時(shí)間觸發(fā)緩存檢查文獻(xiàn)是否存在并且時(shí)間戳小于設(shè)立的過期時(shí)間,假如文獻(xiàn)修改的時(shí)間戳比當(dāng)前時(shí)間戳減去過期時(shí)間戳大,那么就用緩存,否則更新緩存。四、內(nèi)容觸發(fā)緩存當(dāng)插入數(shù)據(jù)或更新數(shù)據(jù)時(shí),強(qiáng)制更新緩存。五、靜態(tài)緩存這里所說的靜態(tài)緩存是指靜態(tài)化,直接生成HTML或XML等文本文獻(xiàn),有更新的時(shí)候重生成一次,適合于不太變化的頁面,這就不說了。
六、內(nèi)存緩存
Memcached是高性能的,分布式的內(nèi)存對象緩存系統(tǒng),用于在動態(tài)應(yīng)用中減少數(shù)據(jù)庫負(fù)載,提高訪問速度。redis也可以做到。46、php的設(shè)計(jì)模式1、單例模式 2、工廠模式 3、觀測者模式?4、命令鏈模式 5、策略模式?單例模式:一個(gè)類在整個(gè)應(yīng)用中,只有一個(gè)對象實(shí)例的設(shè)計(jì)模式類必須自行創(chuàng)建這個(gè)實(shí)例必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例三私:私有靜態(tài)成員變量、構(gòu)造函數(shù)、克隆函數(shù)一公:公共的靜態(tài)方法??2、工廠模式可以根據(jù)輸入的參數(shù)或者應(yīng)用程序配置的不同一創(chuàng)建一種專門用來實(shí)例化并返回其它類的實(shí)例的類3、觀測者模式觀測者模式提供了組件之間緊密耦合的另一種方法。該模式:一個(gè)對象通過添加一個(gè)方法(該方法允許另一個(gè)對象,即觀測者注冊自己)全自身變得可觀測。當(dāng)可觀測的對象更改時(shí),它會將消息發(fā)送到已注冊的觀測者。這些觀測者使用該信息執(zhí)行的操作與可觀測的對象無關(guān)。4、命令鏈模式:以松散耦合主題為基礎(chǔ),發(fā)送消息、命令和請求,或通過一組解決程序發(fā)送任意內(nèi)容。每個(gè)解決程序都會自行判斷自己能否解決請求,假如可以,該請求被解決,進(jìn)程停止。5、策略模式:此算法是從復(fù)雜類提取的,因而可以方便地替換。47.Mysql事務(wù)的特性事務(wù)是作為一個(gè)邏輯單元執(zhí)行的一系列操作,一個(gè)邏輯工作單元必須有四個(gè)屬性,稱為HYPERLINK""\t"_blank"ACID(原子性、一致性、隔離性和持久性)屬性,只有這樣才干成為一個(gè)事務(wù):?原子性
事務(wù)必須是原子工作單元;對于其數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行。?一致性?事務(wù)在完畢時(shí),必須使所有的數(shù)據(jù)都保持一致狀態(tài)。在相關(guān)數(shù)據(jù)庫中,所有規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持所有數(shù)據(jù)的完整性。?事務(wù)結(jié)束時(shí),所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(如B樹索引或雙向鏈表)都必須是對的的。?隔離性?由并發(fā)事務(wù)所作的修改必須與任何其它并發(fā)事務(wù)所作的修改隔離。事務(wù)查看數(shù)據(jù)時(shí)數(shù)據(jù)所處的狀態(tài),要么是另一并發(fā)事務(wù)修改它之前的狀態(tài),
要么是另一事務(wù)修改它之后的狀態(tài),事務(wù)不會查看中間狀態(tài)的數(shù)據(jù)。這稱為可串行性,由于它可以重新裝載起始數(shù)據(jù),
并且重播一系列事務(wù),以使數(shù)據(jù)結(jié)束時(shí)的狀態(tài)與原始事務(wù)執(zhí)行的狀態(tài)相同。持久性?事務(wù)完畢之后,它對于系統(tǒng)的影響是永久性的。該修改即使出現(xiàn)系統(tǒng)故障也將一直保持。begin開始一個(gè)事務(wù)rollback事務(wù)回滾commit事務(wù)確認(rèn)48、Mysql事務(wù)的應(yīng)運(yùn)場景事務(wù)解決在各種管理系統(tǒng)中都有著廣泛的應(yīng)用,比如人員管理系統(tǒng),很多同步數(shù)據(jù)庫操作大都需要用到事務(wù)解決。比如說,在人員管理系統(tǒng)中,你刪除一個(gè)人員,你即需要?jiǎng)h除人員的基本資料,也要?jiǎng)h除和該人員相關(guān)的信息,如信箱,文章等等,這樣,這些數(shù)據(jù)庫操作語句就構(gòu)成一個(gè)事務(wù)!比如手機(jī)充值過程,支付寶金額減少,相應(yīng)的手機(jī)話費(fèi)增長,只要有一個(gè)操作不成功,則此外一個(gè)操作也不會成功49.Include和require的區(qū)別require函數(shù)通常放在PHP程序的最前面,在PHP程序執(zhí)行之前,就會先讀取require指定引入的文獻(xiàn),使它變成PHP程序網(wǎng)頁的一部分。include函數(shù)一般是放在流程控制的解決部分中。PHP程序在讀到include的文獻(xiàn)時(shí),才將它讀進(jìn)來,這種方式可以把程序執(zhí)行時(shí)的流程簡樸化。他們兩個(gè)的用途是同樣的,不一定非要哪個(gè)放在最前面哪個(gè)放在中間,他們最主線的區(qū)別在于錯(cuò)誤解決的方式不同樣。require一個(gè)文獻(xiàn)存在錯(cuò)誤的話,那么程序就會中斷執(zhí)行,并顯示致命錯(cuò)誤而include一個(gè)文獻(xiàn)存在錯(cuò)誤的話,那么程序不會中斷,會繼續(xù)執(zhí)行,并顯示一個(gè)警告的錯(cuò)誤其它區(qū)別:include有返回值,而require沒有。50、索引的建立與使用索引就是類似書的目錄,提高檢索數(shù)據(jù)的效率。索引是系統(tǒng)按照某個(gè)具體的算法(哈希,散列,二叉樹),將數(shù)據(jù)從所有數(shù)據(jù)里進(jìn)行提取,維護(hù)成一個(gè)索引文獻(xiàn),然后系統(tǒng)在進(jìn)行數(shù)據(jù)查詢的時(shí)候,發(fā)現(xiàn)假如查詢條件剛好滿足索引條件,就可以從索引文獻(xiàn)中快速的定位的數(shù)據(jù)所在位置。mysql中有以下幾種索引:主鍵索引(primarykey效率最高的索引)唯一索引(uniquekey):不為空的情況下效率最高普通索引(index)對數(shù)據(jù)沒有規(guī)定,文獻(xiàn)很大,效率比較低全文索引(fulltext),對整個(gè)文章內(nèi)部進(jìn)行關(guān)鍵字索引(mysql5.5以后InnoDB支持全文索引) 英文的全文索引很簡樸:英文單詞默認(rèn)是用空格分離的?中文的全文索引很難:中文的詞組成很麻煩,需要運(yùn)用分詞工具(sphinx)索引可以在創(chuàng)建表的同時(shí)創(chuàng)建索引,也可以在修改表結(jié)構(gòu)時(shí)添加索引,索引重要是加在經(jīng)常做為查詢條件的字段上,可以使用相應(yīng)的手段來檢測所執(zhí)行的sql語句中是否使用到了索引。51.正則匹配表達(dá)式各個(gè)符文表達(dá)的意義\?將下一個(gè)字符標(biāo)記為一個(gè)特殊字符、或一個(gè)原義字符、或一個(gè)向后引用、或一個(gè)八進(jìn)制轉(zhuǎn)義符。例如,’n’匹配字符“n”?!痋n’匹配一個(gè)換行符。序列‘\\’匹配“\”而“\(”則匹配“(”。^?匹配輸入字符串的開始位置。假如設(shè)立了RegExp對象的Multiline屬性,^也匹配‘\n’或‘\r’之后的位置。$ 匹配輸入字符串的結(jié)束位置。假如設(shè)立了RegExp對象的Multiline屬性,$也匹配‘\n’或‘\r’之前的位置。* 匹配前面的子表達(dá)式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等價(jià)于{0,}。+ 匹配前面的子表達(dá)式一次或多次。例如,’zo+’能匹配“zo”以及“zoo”,但不能匹配“z”。+等價(jià)于{1,}。? 匹配前面的子表達(dá)式零次或一次。例如,”do(es)?”可以匹配“do”或“does”中的”do”。?等價(jià)于{0,1}。{n}?n是一個(gè)非負(fù)整數(shù)。匹配擬定的n次。{n,}?n是一個(gè)非負(fù)整數(shù)。至少匹配n次。{n,m} m和n均為非負(fù)整數(shù),其中n<=m。最少匹配n次且最多匹配m次。.?匹配除“\n”之外的任何單個(gè)字符。要匹配涉及‘\n’在內(nèi)的任何字符,請使用象‘[.\n]’的模式。x|y 匹配x或y。[xyz]?字符集合。匹配所包含的任意一個(gè)字符。例如,‘[abc]’可以匹配“plain”中的‘a’。[^xyz]?負(fù)值字符集合。匹配未包含的任意字符。例如,‘[^abc]’可以匹配“plain”中的’p'。[a-z]?字符范圍。匹配指定范圍內(nèi)的任意字符。例如,’[a-z]’可以匹配‘a(chǎn)’到‘z’范圍內(nèi)的任意小寫字母字符。[^a-z] 負(fù)值字符范圍。匹配任何不在指定范圍內(nèi)的任意字符。例如,’[^a-z]’可以匹配任何不在‘a(chǎn)’到‘z’范圍內(nèi)的任意字符。\b 匹配一個(gè)單詞邊界,也就是指單詞和空格間的位置。例如,‘er\b’可以匹配”never”中的‘er’,但不能匹配“verb”中的‘er’。\d?匹配一個(gè)數(shù)字字符。等價(jià)于[0-9]。\D 匹配一個(gè)非數(shù)字字符。等價(jià)于[^0-9]。\f?匹配一個(gè)換頁符。等價(jià)于\x0c和\cL。\n 匹配一個(gè)換行符。等價(jià)于\x0a和\cJ。\r?匹配一個(gè)回車符。等價(jià)于\x0d和\cM。\s?匹配任何空白字符,涉及空格、制表符、換頁符等等。等價(jià)于[\f\n\r\t\v]。\S?匹配任何非空白字符。等價(jià)于[^\f\n\r\t\v]。\t?匹配一個(gè)制表符。等價(jià)于\x09和\cI。\v 匹配一個(gè)垂直制表符。等價(jià)于\x0b和\cK。\w 匹配涉及下劃線的任何單詞字符。等價(jià)于’[A-Za-z0-9_]’。\W 匹配任何非單詞字符。等價(jià)于‘[^A-Za-z0-9_]’。52.PHP的變量類型四種標(biāo)量類型:boolean(布爾型):這是最簡樸的類型,只有兩種取值,可認(rèn)為TRUE/true或FALSE/false,不區(qū)分大小寫。具體請查看:PHP布爾類型(boolean)integer(整型):在32位操作系統(tǒng)中它的有效范圍是:-2147483648~+2147483647。整型值可以使用十進(jìn)制,十六進(jìn)制或八進(jìn)制表達(dá),前面可以加上可選的符號(-或者+)。八進(jìn)制表達(dá)數(shù)字前必須加上0(零),十六進(jìn)制表達(dá)數(shù)字前必須加上0x。float(浮點(diǎn)型,也稱作double)string(字符串):字符型變量不同于其他編程語言有字符與字符串之分,在PHP中,統(tǒng)一使用字符型變量來定義字符或者字符串。兩種復(fù)合類型:array(數(shù)組):數(shù)組型變量是一種比較特殊的變量類型,將在后續(xù)章節(jié)中具體說明。object(對象):對象也是一種特殊的數(shù)據(jù)類型。要?jiǎng)?chuàng)建object變量,請使用new關(guān)鍵字。具體請查看:PHP對象類型(object)最后是兩種特殊類型:resource(資源):源是一種特殊變量,保存了到外部資源的一個(gè)引用。資源是通過專門的函數(shù)來建立和使用的。詳情請查看:PHP資源類型(resource)NULL(NULL):表達(dá)一個(gè)變量沒有值。NULL類型唯一也許的值就是NULL。54.商城秒殺的實(shí)現(xiàn)搶購、秒殺是如今很常見的一個(gè)應(yīng)用場景,重要需要解決的問題有兩個(gè):
1高并發(fā)對數(shù)據(jù)庫產(chǎn)生的壓力?2競爭狀態(tài)下如何解決庫存的對的減少("超賣"問題)?對于第一個(gè)問題,已經(jīng)很容易想到用緩存來解決搶購,避免直接操作數(shù)據(jù)庫,例如使用Redis。第二個(gè)問題,我們可以使用redis隊(duì)列來完畢,把要秒殺的商品放入到隊(duì)列中,由于pop操作是原子的,即使有很多用戶同時(shí)到達(dá),也是依次執(zhí)行,文獻(xiàn)鎖和事務(wù)在高并發(fā)下性能下降不久,當(dāng)然還要考慮其他方面的東西,比如搶購頁面做成靜態(tài)的,通過ajax調(diào)用接口,其中也也許會出現(xiàn)一個(gè)用戶搶多次的情況,這時(shí)候需要再加上一個(gè)排隊(duì)隊(duì)列和搶購結(jié)果隊(duì)列及庫存隊(duì)列。高并發(fā)情況下,將用戶進(jìn)入排隊(duì)隊(duì)列,用一個(gè)線程循環(huán)解決從排隊(duì)隊(duì)列取出一個(gè)用戶,判斷用戶是否已在搶購結(jié)果隊(duì)列,假如在,則已搶購,否則未搶購,庫存減1,寫HYPERLINK""\o"MySQL知識庫"數(shù)據(jù)庫,將用戶入結(jié)果隊(duì)列。55.購物車的原理購物車相稱于現(xiàn)實(shí)中超市的購物車,不同的是一個(gè)是實(shí)體車,一個(gè)是虛擬車而已。用戶可以在購物網(wǎng)站的不同頁面之間跳轉(zhuǎn),以選購自己愛慕的商品,點(diǎn)擊購買時(shí),該商品就自動保存到你的購物車中,反復(fù)選購后,最后將選中的所有商品放在購物車中統(tǒng)一到付款臺結(jié)賬,這也是盡量讓客戶體驗(yàn)到現(xiàn)實(shí)生活中購物的感覺。服務(wù)器通過追蹤每個(gè)用戶的行動,以保證在結(jié)賬時(shí)每件商品都物有其主。重要涉及以下幾點(diǎn):1、把商品添加到購物車,即訂購2、刪除購物車中已定購的商品3、修改購物車中某一本圖書的訂購數(shù)量4、清空購物車5、顯示購物車中商品清單及數(shù)量、價(jià)格實(shí)現(xiàn)購物車的關(guān)鍵在于服務(wù)器辨認(rèn)每一個(gè)用戶并維持與他們的聯(lián)系。但是HTTP協(xié)議是一種“無狀態(tài)(Stateless)”的協(xié)議,因而服務(wù)器不能記住是誰在購買商品,當(dāng)把商品加入購物車時(shí),服務(wù)器也不知道購物車?yán)镌扔行┦裁?,使得用戶在不同頁面間跳轉(zhuǎn)時(shí)購物車無法“隨身攜帶”,這都給購物車的實(shí)現(xiàn)導(dǎo)致了一定的困難。目前購物車的實(shí)現(xiàn)重要是通過cookie、session或結(jié)合數(shù)據(jù)庫的方式。下面分析一下它們的機(jī)制及作用。1.cookiecookie是由服務(wù)器產(chǎn)生,存儲在客戶端的一段信息。它定義了一種Web服務(wù)器在客戶端存儲和返回信息的機(jī)制,cookie文獻(xiàn)它包含域、途徑、生存期、和由服務(wù)器設(shè)立的變量值等內(nèi)容。當(dāng)用戶以后訪問同一個(gè)Web服務(wù)器時(shí),瀏覽器會把cookie原樣發(fā)送給服務(wù)器。通過讓服務(wù)器讀取原先保存到客戶端的信息,網(wǎng)站可認(rèn)為瀏覽者提供一系列的方便,例如在線交易過程中標(biāo)記用戶身份、安全規(guī)定不高的場合避免用戶反復(fù)輸入名字和密碼、門戶網(wǎng)站的主頁定制、有針對性地投放廣告等等。運(yùn)用cookie的特性,大大擴(kuò)展了WEB應(yīng)用程序的功能,不僅可以建立服務(wù)器與客戶機(jī)的聯(lián)系,由于cookie可以由服務(wù)器定制,因此還可以將購物信息生成cookie值存放在客戶端,從而實(shí)現(xiàn)購物車的功能。用基于cookie的方式實(shí)現(xiàn)服務(wù)器與瀏覽器之間的會話或購物車,有以下特點(diǎn):1、cookie存儲在客戶端,且占用很少的資源,瀏覽器允許存放300個(gè)cookie,每個(gè)cookie的大小為4KB,足以滿足購物車的規(guī)定,同時(shí)也減輕了服務(wù)器的負(fù)荷;2、cookie為瀏覽器所內(nèi)置,使用方便。即使用戶不小心關(guān)閉了瀏覽器窗口,只要在cookie定義的有效期內(nèi),購物車中的信息也不會丟失;3、cookie不是可執(zhí)行文獻(xiàn),所以不會以任何方式執(zhí)行,因此也不會帶來病毒或襲擊用戶的系統(tǒng);4、基于cookie的購物車規(guī)定用戶瀏覽器必須支持并設(shè)立為啟用cookie,否則購物車則失效;5、存在著關(guān)于cookie侵犯訪問者隱私權(quán)的爭論,因此有些用戶會嚴(yán)禁本機(jī)的cookie功能。2.sessionsession是實(shí)現(xiàn)購物車的另一種方法。session提供了可以保存和跟蹤用戶的狀態(tài)信息的功能,使當(dāng)前用戶在session中定義的變量和對象能在頁面之間共享,但是不能為應(yīng)用中其他用戶所訪問,它與cookie最重大的區(qū)別是,session將用戶在會話期間的私有信息存儲在服務(wù)器端,提高了安全性。在服務(wù)器生成session后,客戶端會生成一個(gè)sessionid辨認(rèn)號保存在客戶端,以保持和服務(wù)器的同步。這個(gè)sessionid是只讀的,假如客戶端嚴(yán)禁cookie功能,session會通過在URL中附加參數(shù),或隱含在表單中提交等其他方式在頁面間傳送。因此運(yùn)用session實(shí)行對用戶的管理則更為安全、有效。同樣,運(yùn)用session也能實(shí)現(xiàn)購物車,這種方式的特點(diǎn)是:1、session用新的機(jī)制保持與客戶端的同步,不依賴于客戶端設(shè)立;2、與cookie相比,session是存儲在服務(wù)器端的信息,因此顯得更為安全,因此可將身份標(biāo)示,購物等信息存儲在session中;3、session會占用服務(wù)器資源,加大服務(wù)器端的負(fù)載,特別當(dāng)并發(fā)用戶很多時(shí),會生成大量的session,影響服務(wù)器的性能;4、由于session存儲的信息更敏感,并且是以文獻(xiàn)形式保存在服務(wù)器中,因此仍然存在著安全隱患。3.結(jié)合數(shù)據(jù)庫的方式這也是目前較普遍的模式,在這種方式中,數(shù)據(jù)庫承擔(dān)著存儲購物信息的作用,session或cookie則用來跟蹤用戶。這種方式具有以下特點(diǎn):1、數(shù)據(jù)庫與cookie分別負(fù)責(zé)記錄數(shù)據(jù)和維持會話,能發(fā)揮各自的優(yōu)勢,使安全性和服務(wù)器性能都得到了提高;2、每一個(gè)購物的行為,都要直接建立與數(shù)據(jù)庫的連接,直至對表的操作完畢后,連接才釋放。當(dāng)并發(fā)用戶很多時(shí),會影響數(shù)據(jù)庫的性能,因此,這對數(shù)據(jù)庫的性能提出了更高的規(guī)定;3、使cookie維持會話有賴客戶端的支持。各種方式的選擇:雖然cookie可用來實(shí)現(xiàn)購物車,但必須獲得瀏覽器的支持,再加上它是存儲在客戶端的信息,極易被獲取,所以這也限制了它存儲更多,更重要的信息。所以一般cookie只用來維持與服務(wù)器的會話,例如國內(nèi)最大的當(dāng)當(dāng)網(wǎng)絡(luò)書店就是用cookie保持與客戶的聯(lián)系,但是這種方式最大的缺陷是假如客戶端不支持cookie就會使購物車失效。Session能很好地與交易雙方保持會話,可以忽視客戶端的設(shè)立。在購物車技術(shù)中得到了廣泛的應(yīng)用。但session的文獻(xiàn)屬性使其仍然留有安全隱患。結(jié)合數(shù)據(jù)庫的方式雖然在一定限度上解決了上述的問題,但從上面的例子可以看出:在這種購物流程中涉及到對數(shù)據(jù)庫表的頻繁操作,特別是用戶每選購一次商品,都要與數(shù)據(jù)庫進(jìn)行連接,當(dāng)用戶很多的時(shí)候就加大了服務(wù)器與數(shù)據(jù)庫的負(fù)荷。56.redis消息隊(duì)列先進(jìn)先出需要注意什么通常使用一個(gè)list來實(shí)現(xiàn)隊(duì)列操作,這樣有一個(gè)小限制,所以的任務(wù)統(tǒng)一都是先進(jìn)先出,假如想優(yōu)先解決某個(gè)任務(wù)就不太好解決了,這就需要讓隊(duì)列有優(yōu)先級的概念,我們就可以優(yōu)先解決高級別的任務(wù),實(shí)現(xiàn)方式有以下幾種方式:1)單一列表實(shí)現(xiàn):隊(duì)列正常的操作是左進(jìn)右出(lpush,rpop)為了先解決高優(yōu)先級任務(wù),在碰到高級別任務(wù)時(shí),可以直接插隊(duì),直接放入隊(duì)列頭部(rpush),這樣,從隊(duì)列頭部(右側(cè))獲取任務(wù)時(shí),取到的就是高優(yōu)先級的任務(wù)(rpop)2)使用兩個(gè)隊(duì)列,一個(gè)普通隊(duì)列,一個(gè)高級隊(duì)列,針對任務(wù)的級別放入不同的隊(duì)列,獲取任務(wù)時(shí)也很簡樸,redis的BRPOP命令可以按順序從多個(gè)隊(duì)列中取值,BRPOP會按照給出的key順序查看,并在找到的第一個(gè)非空list的尾部彈出一個(gè)元素,redis>BRPOPlist1list20?
list1做為高優(yōu)先級任務(wù)隊(duì)列?list2做為普通任務(wù)隊(duì)列這樣就實(shí)現(xiàn)了先解決高優(yōu)先級任務(wù),當(dāng)沒有高優(yōu)先級任務(wù)時(shí),就去獲取普通任務(wù)方式1最簡樸,但實(shí)際應(yīng)用比較局限,方式3可以實(shí)現(xiàn)復(fù)雜優(yōu)先級,但實(shí)現(xiàn)比較復(fù)雜,不利于維護(hù)
方式2是推薦用法,實(shí)際應(yīng)用最為合適57、你負(fù)責(zé)的模塊有哪些難題在我負(fù)責(zé)的B2B電商項(xiàng)目中,當(dāng)時(shí)我負(fù)責(zé)的是訂單模塊,由于客戶一次選擇了多家商戶的商品,最終生成了一個(gè)訂單,這樣我們平臺在給商戶結(jié)算時(shí)出現(xiàn)了不知道這比費(fèi)用應(yīng)當(dāng)給哪個(gè)商戶,這時(shí)候我們小組通過討論,需要涉及到訂單拆分,也就是說用戶點(diǎn)擊支付后,假如有多件商品,并且不是同一家店鋪那么就要用到訂單的拆分,比如假如有兩件商品,并且不是同一店鋪就在本來的訂單號下在生成兩個(gè)子訂單號并修改訂單表中兩件商品的訂單號。最終實(shí)現(xiàn)了商品的分派管理,解決了我們的難題。我覺得在開發(fā)過程中,碰到的難題無非是兩個(gè),一個(gè)是技術(shù)層次的,我認(rèn)為,只要你有恒心,有熱心,沒有覺得不了的難題。另一個(gè)就是溝通問題,在任何地方任何時(shí)候溝通都是最重要的,特別是我們做開發(fā)的,不溝通好,會影響整個(gè)項(xiàng)目的進(jìn)度,我本人是個(gè)非常還溝通的人,所以這點(diǎn)上也沒多大問題。58、用戶下單是怎么解決的判斷用戶有沒有登錄,在沒有登錄的情況下,不允許下單。登陸后,可進(jìn)行下單并生成唯一的訂單號,此時(shí)訂單的狀態(tài)為未支付。59、電商的登錄是怎么登錄的分為普通登錄和第三方登錄這邊重要說一下第三方登錄吧,第三方登陸重要使用的是author協(xié)議,我就以QQ的第三方登陸為例來進(jìn)行說明:當(dāng)用戶在我們的站點(diǎn)請求QQ的第三方登陸時(shí),我們站點(diǎn)會引導(dǎo)用戶跳轉(zhuǎn)到QQ的登陸授權(quán)界面,當(dāng)用戶輸入QQ和密碼成功登錄以后會自動跳回到我們站點(diǎn)設(shè)立好的回調(diào)頁面,并附帶一個(gè)code參數(shù),接著你使用code再次去請求QQ的授權(quán)頁面,就可以從中獲取到一個(gè)accesstoken(訪問令牌),通過這個(gè)access_token,我們可以調(diào)用QQ提供應(yīng)我們的接口,比如獲取open_id,可以獲取用戶的基本信息。獲取到之后,我們需要拿用戶的授權(quán)信息和open_id和我們平臺的普通用戶進(jìn)行綁定。這樣不管是普通用戶登陸還是第三方登陸用戶,都可以實(shí)現(xiàn)登陸。60、有負(fù)責(zé)開發(fā)app嗎我以前有過使用hybridAPP開發(fā)過APP,做過一個(gè)簡樸的廣場舞APP,但我重要參與到APP的接口編寫這塊中。61、開發(fā)app過程中碰到了什么難題hybridAPP開發(fā)過程中,前端知識是我的硬傷,以前,前端我一直都沒有花太多精力在上面,所以在使用hybridAPP開發(fā)過程中,頁面樣式總是調(diào)得很難看,后面我花了一周時(shí)間自己自學(xué)惡補(bǔ)了以下前端的東西,感覺收獲很大。尚有我記得以前在公司寫接口時(shí),我們的安卓工程師認(rèn)為他們APP的分頁效果,得我們接口這邊事先分好頁,然后他們再調(diào)用接口,其實(shí)分頁的頁碼需要他那邊提供應(yīng)我們,但是他就認(rèn)定了是我們這邊的問題,后面通過多次溝通和測試,我們共同完畢了這項(xiàng)任務(wù)。62、linux殺死一個(gè)進(jìn)程命令是什么一方面,我們得知道要?dú)⑺赖倪M(jìn)程的進(jìn)程ID,可以通過ps-ef|grep進(jìn)程名稱查到當(dāng)前運(yùn)營的進(jìn)程ID,然后通過kill命令殺死進(jìn)程,如kill-93329表達(dá)強(qiáng)制殺死進(jìn)程,當(dāng)然尚有不同的等級,取決于中間的數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國臉部按摩器行業(yè)市場現(xiàn)狀分析及競爭格局與投資發(fā)展研究報(bào)告(2024-2030版)
- 2024年中國提花印花駿花緞市場調(diào)查研究報(bào)告
- 中國紅豆杉市場深度調(diào)查研究報(bào)告(2024-2030版)
- 中國管樂器行業(yè)發(fā)展分析及前景趨勢與投資風(fēng)險(xiǎn)研究報(bào)告(2024-2030版)
- 中國禽飼料行業(yè)行業(yè)競爭態(tài)勢及投資前景預(yù)測研究報(bào)告(2024-2030版)
- 中國碳酸二甲酯(DMC)行業(yè)發(fā)展形勢及投資潛力分析研究報(bào)告(2024-2030版)
- 中國硫普羅寧行業(yè)發(fā)展動態(tài)及應(yīng)用趨勢預(yù)測研究報(bào)告(2024-2030版)
- 2024年中國女裝單鞋市場調(diào)查研究報(bào)告
- 中國瑜伽運(yùn)動褲行業(yè)市場現(xiàn)狀分析及競爭格局與投資發(fā)展研究報(bào)告(2024-2030版)
- 中國煙用接裝紙行業(yè)競爭動態(tài)及需求規(guī)模預(yù)測研究報(bào)告(2024-2030版)
- CA碼生成原理及matlab程序?qū)崿F(xiàn)
- 國家開放大學(xué)《電氣傳動與調(diào)速系統(tǒng)》章節(jié)測試參考答案
- 須彌(短篇小說)
- 旋風(fēng)除塵器設(shè)計(jì)與計(jì)算
- 《裝配基礎(chǔ)知識培訓(xùn)》
- 出口退稅的具體計(jì)算方法及出口報(bào)價(jià)技巧
- PCB鍍層與SMT焊接
- Unit 1 This is my new friend. Lesson 5 課件
- 2019年青年英才培養(yǎng)計(jì)劃項(xiàng)目申報(bào)表
- 芳香油的提取
- 企業(yè)人才測評發(fā)展中心建設(shè)方案
評論
0/150
提交評論