8、redis集群怎麼做 1、Redis集群提供了以下兩個好處1、將數據自動切分(split)到多個節點2、當集群中的某一個節點故障時,redis還可以繼續處理客戶端的請求。2、集群的方案: redis-cluster集群,採用無中心結構,每個節點保存數據和整個集群狀態,每個節點都和其他所有節點連接 ...
8、redis集群怎麼做
1、Redis集群提供了以下兩個好處
1、將數據自動切分(split)到多個節點
2、當集群中的某一個節點故障時,redis還可以繼續處理客戶端的請求。
2、集群的方案:
redis-cluster集群,採用無中心結構,每個節點保存數據和整個集群狀態,每個節點都和其他所有節點連接,主要通過節點的配置,輔以redis的主從來完成集群。由於這塊東西我使用得很少,所以只是平時抽時間去研究過,並沒有真正的線上上實現過。
9、redis和memcacahe、mongoDB的區別
答:都是非關係型資料庫,性能都非常高,但是mongoDB和memcache、redis是不同的兩種類型。後兩者主要用於數據的緩存,前者主要用在查詢和儲存大數據方面,是最接近資料庫的文檔型的非關係資料庫。
這裡我主要談談memcache和redis的區別。
①從數據存儲位置上來分,memcache的數據存在記憶體中,而redis既可以存儲在記憶體中,也可以存儲的到磁碟中,達到持久化存儲的功能,memcache一旦斷電,數據全部丟失,redis可以利用快照和AOF把數據存到磁碟中,當恢復時又從磁碟中讀取到記憶體中,當物理記憶體使用完畢後,可以把數據寫入到磁碟中。
②從存儲數據的類型上來分,memcache和redis存儲的方式都是鍵值對,只不過redis值的類型比較豐富,有string(字元串),hash(哈希),list(列表),set(集合)zset(有序集合),而memcache主要存儲的是字元串。
③從架構層次來分,Redis支持master-slave(主—從)模式應用,memcache支持分散式。
④另外從存儲數據的大小上來分,Redis單個value的最大限制是1GB,memcached只能保存1MB的數據。但是Memcache在存儲100K以上的數據,性能稍微好一點。
⑤另外redis只支持單核,memcache可以支持多核,當然關於redis取代memcache的說法,在一般情況下,兩者性能都很高,在大多的業務場景選擇上,redis的選擇可能更加具有優勢,但也不能說可以完全取代,最終還是取決於你的應用場景。
10、持久化redis有幾種方式?
答:主要有兩種方式:
① 快照持久化
在redis配置文件中已經自動開啟了,
格式是:save N M
表示在N秒之內,redis至少發生M次修改則redis抓快照到磁碟。
當然我們也可以手動執行save或者bgsave(非同步)命令來做快照
②append only file AOF持久化
總共有三種模式,如
appendfsync everysec預設的是每秒強制寫入磁碟一次
appendfsync always 每次執行寫操作的時候就強制寫入磁碟
appendfsync no 完全取決於os,性能最好但是持久化沒法保證
其中第三種模式最好。redis預設的也是採取第三種模式。
11、mysql存儲引擎
答:常用的主要分為兩種,一種是innodb,一種是myisam,兩者的主要區別是
①myisam不支持事務處理,而innoDB支持事務處理
②myisam 不支持外鍵,innoDB支持外鍵
③myisam支持全文檢索,而innoDB在MySQL5.6版本之後才支持全文檢索
④數據的存儲形式不一樣,mysiam表存放在三個文件:結構、索引、數據,innoDB存儲把結構存儲為一個文件,索引和數據存儲為一個文件
⑤myisam在查詢和增加數據性能更優於innoDB,innoDB在批量刪除方面性能較高。
⑥myisam支持表鎖,而innoDB支持行鎖
12、 sql註入是什麼及如何預防sql註入?
答:SQL註入攻擊指的是用戶或者黑客通過構建特殊的輸入作為參數傳入我們的Web應用程式端,而這些輸入大都是SQL語法里的一些組合,通過執行SQL語句進而執行攻擊者所要的操作,其主要原因是程式員沒有細緻地過濾用戶輸入的數據,致使非法數據侵入系統而造成的。因此我們在做開發過程中一定要預防sql註入,主要從兩方面著手:1、占位符的方式,就是對sql語句進行預處理,然後執行sql語句
2、通過addslashes或者mysql_real_escape_string這兩個函數對用戶輸入的值進行轉義處理,把一些特殊的字元轉義掉。
13、有用過預處理麽?
答:用過,PDO類中,有個prepare方法可以實現預處理,PDOStament類中 的excute方法可以執行預處理,預處理的參數分為兩種,一種是:字元串占位符,另一種是?占位符,:字元串占位符在執行預處理傳遞參數時傳入的是關聯數組,而?占位符傳遞的是索引數組。兩者不能混合使用,但一般推薦使用:字元串占位符。
14、用框架還用自己的處理嗎
答:一般成熟的開源框架中都考慮到了數據安全這方面的東西,但有時候我們可能會使用一些原生的SQL語句時,我們就需要考慮自己對sql語句進行預處理。當然有時候框架中的過濾方法我們不希望採用,比如使用文本編輯器時,我們可以使用自己的過濾方式。
15、mysql優化怎麼做的?
答:mysql優化主要從以下幾個方面來實現:
①設計角度:存儲引擎的選擇,欄位類型選擇,範式
②功能角度:可以利用mysql自身的特性,如索引,查詢緩存,碎片整理,分區、分表等
③sql語句的優化方面:儘量簡化查詢語句,能查詢欄位少就儘量少查詢欄位,優化分頁語句、分組語句等。
④部署大負載架構體系:資料庫伺服器單獨出來,負載大時可以採用主從複製,讀寫分離機制進行設計
⑤從硬體上升級資料庫伺服器。
16、訂單表用是什麼存儲引擎
答:因為訂單表存在著事務的處理,比如下了訂單,商品的庫存就要減少,這裡就涉及到了事務,所以就用到innodb。
19 、sql語句的優化
答:首先我們得確定哪些sql語句需要優化,一般在一個系統中,查詢語句最多,所以我們主要是針對查詢語句進行優化。主要採用兩種方式來確定要優化的sql語句:
①使用慢查詢日誌,設置需要優化的sql語句的執行時間,記錄下超過該設置時間的語句,即為需要優化的語句。
②使用profiling機制,記錄下每條sql語句的執行時間,找出執行較慢的語句,即為需要優化的語句。
我們主要通過給表欄位添加索引的方式進行優化,加上索引後,sql語句的執行時間顯著提高了,但並不是加上索引了這條sql語句就會用到索引,所以首先看執行慢的語句後面是否有加索引,我們可以使用explain或者desc加在要執行的sql語句前,查看是否使用到索引。有幾個地方需要註意的是:
①為了避免建議索引而造成索引文件過大,有時候我們會使用複合索引,這時候要遵循最左原則。
②like查詢,前%不會用到索引
③如果條件中有or,則要求or的索引欄位都必須有索引,否則不能用到索引。
④如果列類型是字元串,一定要在條件中將數據使用引號引用起來,否則不使用索引。
⑤優化group by 語句
⑥儘量避免模糊匹配,這樣會導致全盤掃描
21、 索引有幾種
答:索引主要有:
主鍵索引:數據記錄裡面不能有null,數據內容不能重覆,在一張表裡面不能有多個主鍵索引。
普通索引:使用欄位關鍵字建立的索引,主要是提高查詢速度
唯一索引:欄位數據是唯一的,數據內容裡面能否為null,在一張表裡面,是可以添加多個唯一索引。
全文索引:在比較老的版本中,只有myisam引擎支持全文索引,在innodb5.6後引擎也支持全文索引,在mysql中全文索引不支持中文。我們一般使用sphinx集合coreseek來實現中文的全文索引。
23 、左前索引原則
答:左前索引主要指的是在複合索引中,給兩個或多個欄位建立了複合索引後,在sql語句後的條件中,只有複合索引前面的欄位在條件的前面時,該索引才起作用,比如創建了個複合索引index (a,b),在使用where或者orderby條件時,如果只有條件b的,該索引不會生效,必須有條件a且必須要在條件b的前面該索引才會生效。
24 、分散式資料庫
答:我所知道的分散式資料庫有memcache,主要是分散式的非關係型資料庫,用於緩存處理。
分散式是指將不同的業務分佈在不同的地方。 而集群指的是將幾台伺服器集中在一起,實現同一業務。
分散式中的每一個節點,都可以做集群。 而集群並不一定就是分散式的。
舉例:就比如新浪網,訪問的人多了,他可以做一個群集,前面放一個響應伺服器,後面幾台伺服器完成同一業務,如果有業務訪問的時候,響應伺服器看哪台伺服器的負載不是很重,就將給哪一臺去完成。
而分散式,從窄意上理解,也跟集群差不多, 但是它的組織比較鬆散,不像集群,有一個組織性,一臺伺服器垮了,其它的伺服器可以頂上來。
memcache的應用場景
1、適用memcached的業務場景?
1)如果網站包含了訪問量很大的動態網頁,因而資料庫的負載將會很高。由於大部分資料庫請求都是讀操作,那麼memcached可以顯著地減小資料庫負載。
2)利用memcached可以緩存session數據、臨時數據以減少對他們的資料庫寫操作。
4)緩存一些很小但是被頻繁訪問的文件。
5)訪問比較頻繁,安全性不高,丟失無所謂,修改比較頻繁的數據,比如一些用戶的線上狀態
2 、不適用memcached的業務場景?
1)緩存對象的大小大於1MB
memcache本身就不是為了處理龐大的多媒體(large media)和巨大的二進位塊(streaming huge blobs)而設計的。
2)key的長度大於250字元
3)應用運行在不安全的環境中
4)業務本身需要的是持久化數據或者說需要的應該是database
25、nginx日誌,怎麼統計每個ip的訪問量
(參考阿銘哥手冊)
stub_status模塊主要用於查看Nginx的一些狀態信息,例如統計nginx的訪問量,首先我們得查看該模塊有沒有安裝,如果沒有安裝,得先安裝,安裝好後,修改nginx的配置文件,開啟該模塊,然後就可以使用以下命令來進行統計,如:
1.根據訪問IP統計UV
awk '{print $1}' access.log|sort | uniq -c |wc -l
2.統計訪問URL統計PV
awk '{print $7}' access.log|wc -l
3.查詢訪問最頻繁的URL
awk '{print $7}' access.log|sort | uniq -c |sort -n -k 1 -r|more
4.查詢訪問最頻繁的IP
awk '{print $1}' access.log|sort | uniq -c |sort -n -k 1 -r|more
統計nginx日誌中訪問最多的100個ip及訪問次數
awk ‘{print $1}’ access.log|sort | uniq -c |sort -n -k 1 -r| head -n 100
26、http協議
HTTP是一個屬於應用層的面向對象的協議,由於其簡捷、快速的方式,適用於分散式超媒體信息系統
HTTP協議的主要特點可概括如下:
1.支持客戶/伺服器模式。
2.簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。請求方法常用 的有GET、HEAD、POST。每種方法規定了客戶與伺服器聯繫的類型不同。由於HTTP協議簡單,使得HTTP伺服器的程式規模小,因而通信速度很快。
3.靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加 以標記。
4.無連接:無連接的含義是限制每次連接只處理一個請求。伺服器處理完客戶的請 求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間。
5.無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。 缺少狀態意味著如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次 連接傳送的數據量增大。另一方面,在伺服器不需要先前信息時它的應答就較快。
27、cookie與session的區別
1、cookie數據存放在客戶的瀏覽器上,session數據放在伺服器上。
2、cookie不是很安全,別人可以分析存放在本地的COOKIE併進行COOKIE欺騙
考慮到安全應當使用session。
3、session會在一定時間內保存在伺服器上。當訪問增多,會比較占用你伺服器的性能
考慮到減輕伺服器性能方面,應當使用COOKIE。
4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
5、所以個人建議:
將登陸信息等重要信息存放為SESSION
其他信息如果需要保留,可以放在COOKIE中
28、php在儲存session以什麼形式存在
PHP為session的存儲提供了三種方式: 文件/ 記憶體/ 自定義存儲,預設是使用文件存儲.在訪問量大的網站上採用這種方式就不大合 適,因為這樣會導致大量的輸入輸出的冗餘.我們可以在php.ini更改配置文件或者php腳本中通過相應的函數來設置session文件的存儲類型來改變session文件的存儲形式
29、xss攻擊怎麼防止
XSS又稱CSS,全稱Cross SiteScript(跨站腳本攻擊), XSS攻擊類似於SQL註入攻擊,是Web程式中常見的漏洞,XSS屬於被動式且用於客戶端的攻擊方式,所以容易被忽略其危害性。其原理是攻擊者向有XSS漏洞的網站中輸入(傳入)惡意的HTML代碼,當用戶瀏覽該網站時,這段HTML代碼會自動執行,從而達到攻擊的目的。如,盜取用戶Cookie信息、破壞頁面結
常見的惡意字元XSS輸入:
1. XSS 輸入通常包含 JavaScript 腳本,如彈出惡意警告框:<script>alert("XSS");</script>
2. XSS 輸入也可能是 HTML 代碼段,譬如:
(1) 網頁不停地刷新 <meta http-equiv="refresh" content="0;">
(2) 嵌入其它網站的鏈接 <iframe src=http://xxxx width=250 height=250></iframe>
構、重定向到其它網站等。
方法:利用php htmlentities()函數
php防止XSS跨站腳本攻擊的方法:是針對非法的HTML代碼包括單雙引號等,使用htmlspecialchars()函數。
在使用htmlspecialchars()函數的時候註意第二個參數, 直接用htmlspecialchars($string)的話,第二個參數預設是ENT_COMPAT,函數預設只是轉化雙引號("),不對單引號(')做轉義。
所以,htmlspecialchars()函數更多的時候要加上第二個參數,應該這樣用: htmlspecialchars($string,ENT_QUOTES)。當然,如果需要不轉化如何的引號,用htmlspecialchars($string,ENT_NOQUOTES)。
另外,儘量少用htmlentities(), 在全部英文的時候htmlentities()和htmlspecialchars()沒有區別,都可以達到目的。但是,中文情況下, htmlentities()卻會轉化所有的html代碼,連同裡面的它無法識別的中文字元也給轉化了。
htmlentities()和htmlspecialchars()這兩個函數對單引號(')之類的字元串支持不好,都不能轉化, 所以用htmlentities()和htmlspecialchars()轉化的字元串只能防止XSS攻擊,不能防止SQL註入攻擊。
所有有列印的語句如echo,print等,在列印前都要使用htmlentities()進行過濾,這樣可以防止XSS,註意中文要寫出htmlentities($name,ENT_NOQUOTES,GB2312)。
30、禁用cookie後,session還能用嗎?
可以,在存儲session的文件中,生成sessionID,通過get傳參的方式將sessionID傳到要實現session共用的頁面,讀取sessionID,從而從session中獲取數據。
31、mongodb基於什麼開發的
MongoDB是一個基於分散式文件存儲的資料庫。由C++語言編寫。旨在為WEB應用提供可擴展的高性能數據存儲解決方案。
32、mongodb是非範式還是範式
數據表示的方式有很多種,其中最重要的問題之一就是在多大程度上對數據進行範式化。範式化(normalization)是將數據分散到多個不同的集合,不同集合之間可以相互引用數據。雖然很多文檔可以引用某一塊數據,但是這塊數據只存儲在一個集合中。所以,如果要修改這塊數據,只需修改保存這塊數據的那一個文檔就行了。但是,MongoDB沒有提供連接(join)工具,所以在不同集合之間執行連接查詢需要進行多次查詢。
反範式化(denormalization)與範式化相反:將每個文檔所需的數據都嵌入在文檔內部。每個文檔都擁有自己的數據副本,而不是所有文檔共同引用同一個數據副本。這意味著,如果信息發生了變化,那麼所有相關文檔都需要進行更新,但是在執行查詢時,只需要一次查詢,就可以得到所有數據。
決定何時採用範式化何時採用反範式化時比較困難的。範式化能夠提高數據寫入速度,反範式化能夠提高數據讀取速度。需要根據自己應用程式的十幾需要仔細權衡。
33、mongodb與mysql區別
MySQL是關係型資料庫。
優勢:
在不同的引擎上有不同 的存儲方式。
查詢語句是使用傳統的sql語句,擁有較為成熟的體系,成熟度很高。
開源資料庫的份額在不斷增加,mysql的份額頁在持續增長。
缺點:
在海量數據處理的時候效率會顯著變慢。
Mongodb是非關係型資料庫(nosql ),屬於文檔型資料庫。文檔是mongoDB中數據的基本單元,類似關係資料庫的行,多個鍵值對有序地放置在一起便是文檔,語法有點類似javascript面向對象的查詢語言,它是一個面向集合的,模式自由的文檔型資料庫。
存儲方式:虛擬記憶體+持久化。
查詢語句:是獨特的Mongodb的查詢方式。
適合場景:事件的記錄,內容管理或者博客平臺等等。
架構特點:可以通過副本集,以及分片來實現高可用。
數據處理:數據是存儲在硬碟上的,只不過需要經常讀取的數據會被載入到記憶體中,將數據存儲在物理記憶體中,從而達到高速讀寫。
成熟度與廣泛度:新興資料庫,成熟度較低,Nosql資料庫中最為接近關係型資料庫,比較完善的DB之一,適用人群不斷在增長。
優點:
快速!在適量級的記憶體的Mongodb的性能是非常迅速的,它將熱數據存儲在物理記憶體中,使得熱數據的讀寫變得十分快。高擴展性,存儲的數據格式是json格式!
缺點:
不支持事務,而且開發文檔不是很完全,完善。
Mysql和Mongodb主要應用場景(簡單瞭解敘述下即可)
1.如果需要將mongodb作為後端db來代替mysql使用,即這裡mysql與mongodb 屬於平行級別,那麼,這樣的使用可能有以下幾種情況的考量: (1)mongodb所負責部分以文檔形式存儲,能夠有較好的代碼親和性,json格式的直接寫入方便。(如日誌之類) (2)從data models設計階段就將原子性考慮於其中,無需事務之類的輔助。開發用如nodejs之類的語言來進行開發,對開發比較方便。 (3)mongodb本身的failover機制,無需使用如MHA之類的方式實現。
2.將mongodb作為類似redis ,memcache來做緩存db,為mysql提供服務,或是後端日誌收集分析。 考慮到mongodb屬於nosql型資料庫,sql語句與數據結構不如mysql那麼親和 ,也會有很多時候將mongodb做為輔助mysql而使用的類redis memcache 之類的緩存db來使用。 亦或是僅作日誌收集分析。
34、寫一個函數統計每一個元素出現的次數
PHP 中的 array_count_values() 函數可以實現 array_count_values() 函數用於統計數組中所有值出現的次數。 本函數返回一個數組,其元素的鍵名是原數組的值,鍵值是該值在原數組中出現的次數。
35、手寫排序
主要從原理方面來說:重點介紹冒泡排序和選擇排序
· // 冒泡排序
function BubbleSort($arr) {
// 獲得數組總長度
$num = count($arr);
// 正向遍曆數組
for ($i = 1; $i < $num; $i++) {
// 反向遍歷
for ($j = $num - 1; $j >= $i ; $j--) {
// 相鄰兩個數比較
if ($arr[$j] < $arr[$j-1]) {
// 暫存較小的數
$iTemp = $arr[$j-1];
// 把較大的放前面
$arr[$j-1] = $arr[$j];
// 較小的放後面
$arr[$j] = $iTemp;
}
}
}
return $arr;
}
· // 交換法排序
function ExchangeSort($arr){
$num = count($arr);
// 遍曆數組
for ($i = 0;$i < $num - 1; $i++) {
// 獲得當前索引的下一個索引
for ($j = $i + 1; $j < $num; $j++) {
// 比較相鄰兩個的值大小
if ($arr[$j] < $arr[$i]) {
// 暫存較小的數
$iTemp = $arr[$i];
// 把較大的放前面
$arr[$i] = $arr[$j];
// 較小的放後面
$arr[$j] = $iTemp;
}
}
}
return $arr;
}
· // 選擇法排序
function SelectSort($arr) {
// 獲得數組總長度
$num = count($arr);
// 遍曆數組
for ($i = 0;$i < $num-1; $i++) {
// 暫存當前值
$iTemp = $arr[$i];
// 暫存當前位置
$iPos = $i;
// 遍歷當前位置以後的數據
for ($j = $i + 1;$j < $num; $j++){
// 如果有小於當前值的
if ($arr[$j] < $iTemp) {
// 暫存最小值
$iTemp = $arr[$j];
// 暫存位置
$iPos = $j;
}
}
// 把當前值放到算好的位置
$arr[$iPos] = $arr[$i];
// 把當前值換成算好的值
$arr[$i] = $iTemp;
}
return $arr;
}
· // 插入法排序
function InsertSort($arr){
$num = count($arr);
// 遍曆數組
for ($i = 1;$i < $num; $i++) {
// 獲得當前值
$iTemp = $arr[$i];
// 獲得當前值的前一個位置
$iPos = $i - 1;
// 如果當前值小於前一個值切未到數組開始位置
while (($iPos >= 0) && ($iTemp < $arr[$iPos])) {
// 把前一個的值往後放一位
$arr[$iPos + 1] = $arr[$iPos];
// 位置遞減
$iPos--;
}
$arr[$iPos+1] = $iTemp;
}
return $arr;
}
· // 快速排序
function QuickSort($arr){
$num = count($arr);
$l = $r = 0;
$left = $right = array();
// 從索引的第二個開始遍曆數組
for ($i = 1;$i < $num; $i++) {
// 如果值小於索引1
if ($arr[$i] < $arr[0]) {
// 裝入左索引數組(小於索引1的數據)
$left[] = $arr[$i];
$l++;
} else {
// 否則裝入右索引中(大於索引1的數據)
$right[] = $arr[$i];
$r++; //
}
}
// 如果左索引有值 則對左索引排序
if($l > 1) {
$left = QuickSort($left);
}
// 排序後的數組
$new_arr = $left;
// 將當前數組第一個放到最後
$new_arr[] = $arr[0];
// 如果又索引有值 則對右索引排序
if ($r > 1) {
$right = QuickSort($right);
}
// 根據右索引的長度再次增加數據
for($i = 0;$i < $r; $i++) {
$new_arr[] = $right[$i];
}
return $new_arr;
}
36、設計模式
在PHP中,我主要使用了以下兩種設計模式
1、單例模式
單例模式顧名思義,就是只有一個實例。作為對象的創建模式, 單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。
單例模式的要點有三個:
一是某個類只能有一個實例;
二是它必須自行創建這個實例;
三是它必須自行向整個系統提供這個實例。
典型的代表如框架中的基類對象。
2、簡單工廠模式
①抽象基類:類中定義抽象一些方法,用以在子類中實現
②繼承自抽象基類的子類:實現基類中的抽象方法
③工廠類:用以實例化所有相對應的子類
這種我們使用最常見,基本所有的MVC框架中都是這樣產生的。
37、用過什麼PHP框架
在開發過程中,我主要使用過了這麼幾種框架。thinkPHP框架、CI框架,laravel框架和yii框架。我接觸到的第一個框架是TP框架,我簡單的說下我對這幾個框架的看法:
ThinkPHP框架
優點:
TP借鑒了Java思想,基於PHP5,充分利用了PHP5的特性,部署簡單隻需一個入口文件,一切搞定,簡單高效,中文文檔齊全,入門超級簡單。自帶模板引擎,具有獨特的數據驗證和自動填充功能,框架更新速度比較迅速。
缺點:一個Model中可以操作多個表,但TP只能一個。
TP預設初始化了很多配置,使用起來很方便,但自然也會影響效率。但是把一些載入配置的時間拿去研究演算法,這些小影響近乎可以忽略了。
CodeIgniter框架
優點:
配置簡單,上手很快,全部的配置使用PHP腳本來配置,沒有使用很多太複雜的設計模式,執行性能和代碼可讀性上都不錯,執行效率比較高,具有基本的MVC功能. 快速簡潔,代碼量少,框架簡單,容易上手,自帶了很多簡單好用的library,框架適合中小型項目,大型項目也不是不可以,只是擴展能力稍差。
缺點:
1. 把Model層簡單的理解為資料庫操作
2. PHP框架略顯簡單,只能夠滿足小型應用,略微不太能夠滿足中型應用需要
laravel框架(目前最新的是5.3,要求PHP版本較高5.6)
優點:
1.Laravel註重代碼的模塊化和可擴展性。
2.artisan: 命令行工具,很多手動的工作都自動了
3.可繼承的模版,簡化view的開發和管理
Laravel一直是PHP開發者最受歡迎的PHP框架。這是一個年輕的框架,但是擁有優雅的語法,可簡單快速開發你的應用。它擁有大多數常見的功能,如:路由,身份驗證,會話,隊列和緩存。
缺點:
laravel的中英文文檔比較少 demo也比較少 有時候一個功能要試好久 甚至要看源碼
YII框架(目前是2.0版本)
優點:
1、快速,敏捷,不拖沓,給程式員飛翔的能力;
2、有gii功能!(創建控制器,model層,crud等操作);
3、具有高度的可重用性和可擴展性,是純粹的面向對象的。開發速度快,完備的文檔,可重用性可高擴展,是最高效的開發框架之一。
缺點:
1、對Model層的指導和考慮較少
2、文檔實例較少
3、英文太多
4、要求PHP技術精通,OOP編程要熟練!
5、要求會bootstrap
38 、代碼管理工具
我使用過的版本控制工具有兩種:早期的時候使用的是SVN,現在主要使用git,我就我個人的觀點,簡單的說下兩者的區別:
1. Git是分散式的,SVN是集中式的,好處是跟其他同事不會有太多的衝突,自己寫的代碼放在自己電腦上,一段時間後再提交、合併,也可以不用聯網在本地提交;
2. Git下載下來後,在本地不必聯網就可以看到所有的log,很方便學習,SVN卻需要聯網;
3. Git鼓勵分Branch(分支),而SVN,說實話,我用Branch的次數還挺少的,SVN自帶的Branch merge我還真沒用過,有merge時用的是Beyond Compare工具合併後再Commit的;
4. SVN在Commit前,我們都建議是先Update一下,跟本地的代碼編譯沒問題,並確保開發的功能正常後再提交
SVN 的主要功能
SVN屬於集中化的版本控制系統,有個不太精確的比喻:SVN = 版本控制+ 備份伺服器
SVN使用起來有點像是檔案倉庫的感覺,支持並行讀寫文件,支持代碼的版本化管理,功能包括取出、導入、更新、分支、改名、還原、合併等。
功能有許多我就不一一列了,SVN大都採用圖形界面操作,直觀,上手快。
Git的主要功能
Git是一個分散式版本控制系統,操作命令包括:clone,pull,push,branch ,merge ,rebas,Git擅長的是程式代碼的版本化管理。
SVN 的優缺點
SVN對中文支持好,操作簡單,使用沒有難度,美工人員,產品人員,測試人員,實施人員都可輕鬆上手。使用界面統一,功能完善,操作方便。
Git的優缺點
對程式源代碼進行差異化的版本管理,代碼庫占極少的空間。易於代碼的分支化管理。不支持中文,圖形界面支持差,使用難度大。不易推廣。
SVN 和 Git 哪個更適用於項目管理?
SVN更適用於項目管理, Git僅適用於代碼管理。
一個研發隊伍的成員正常包括:需求分析、設計、美工、程式員、測試、實施、運維,每個成員在工作中都有產出物, 包括了文檔、設計代碼、程式代碼,這些都需要按項目集中進行管理的。SVN能清楚的按目錄進行分類管理, 使項目組的管理處於有序高效的狀態。
現在越來越多人使用git做為版本控制工具,我以前的公司也是使用git.
39、手寫單例模式怎麼寫
三私一公。
class Example
{
//保存例實例在此屬性中
private static $_instance;
//構造函數聲明為private,防止直接創建對象
private function __construct()
{
echo 'I am Construceted';
}
//單例方法
public static function singleton()
{
if(!isset(self::$_instance))
{
$c=__CLASS__;
self::$_instance=new $c;
}
return self::$_instance;
}
//阻止用戶複製對象實例
public function __clone()
{
trigger_error('Clone is not allow' ,E_USER_ERROR);
}
function test()
{
echo("test");
}
}
// 這個寫法會出錯,因為構造方法被聲明為private
$test = new Example;
// 下麵將得到Example類的單例對象
$test = Example::singleton();
$test->test();
// 複製對象將導致一個E_USER_ERROR.
$test_clone = clone $test;
?>
40、nosql和Mysql的區別
也即非關係型資料庫和關係型資料庫。
目前世界上主流的存儲系統大部分還是採用了關係型資料庫,其主要有一下優點:
1.事務處理—保持數據的一致性;
2.由於以標準化為前提,數據更新的開銷很小(相同的欄位基本上只有一處);
3.可以進行Join等複雜查詢。
nosql在優勢方面,主要體現在下麵這三點:
1. 簡單的擴展:典型例子是Cassandra,由於其架構是類似於經典的P2P,所以能通過輕鬆地添加新的節點來擴展這個集群;
2. 快速的讀寫:主要例子有Redis,由於其邏輯簡單,而且純記憶體操作,使得其性能非常出色,單節點每秒可以處理超過10萬次讀寫操作;
3. 低廉的成本:這是大多數分散式資料庫共有的特點,因為主要都是開源軟體,沒有昂貴的License成本;
4.
但瑕不掩瑜,NoSQL資料庫還存在著很多的不足,常見主要有下麵這幾個:
1. 不提供對SQL的支持:如果不支持SQL這樣的工業標準,將會對用戶產生一定的學習和應用遷移成本;
2. 支持的特性不夠豐富:現有產品所提供的功能都比較有限,大多數NoSQL資料庫都不支持事務,也不像 SQL Server和Oracle那樣能提供各種附加功能,比如BI和報表等;
3. 現有產品的不夠成熟:大多數產品都還處於初創期,和關係型資料庫幾十年的完善不可同日而語;
41、在TP中M方法與D方法的區別
雖然都是實例化模型對象,兩者還是有區別的
D和M的區別主要在於
M方法不需要創建模型類文件,M方法不會讀取模型類,所以預設情況下自動驗證是無效的,但是可以通過動態賦值的方式實現
而D方法必須有創建模型類。
我們可以用下麵兩種方法去創建一個數據表的映射對象
第一種:$Test = D(‘Test’)
第二種:$Test = new Model(‘Test’)
雖然這兩種都可以對數據進行select,insert,delete,udpate操作,在
數據驗證上有很大的不同,
用第一種方式實例一個模型就會有數據檢查功能,如果 title 沒有填寫的話就會提示 “請輸入標題” (這個是tp提供的一個自動驗證功能,當然也需要在相應的model中定義好驗證條件);
如果用第二種就沒有了這個數據驗證功能,需要手動驗證。
D函數實例化的是你當前項目的Lib/Model下麵的模塊。
如果該模塊不存在的話,直接返回實例化Model的對象(意義就與M()函數相同)。
而M只返回,實例化Model的對象。它的$name參數作為資料庫的表名來處理對資料庫的操作。
42、對網站大訪問量的優化方案
提高訪問速度。從硬體,最好從網站程式等等方面考慮。我給出以下幾種方案:
1.儘量使用靜態頁,不要老使用動態信息調用。非常容易出問題
2.圖片內容與網站數據儘量放在同一個伺服器或者機房內。大量外鏈圖片是會有問題的
3.一次又一次,一遍又一遍的分析流量走向,然後縮短瀏覽者瀏覽距離,舉個例子,瀏覽者如果現在在你網站看一個新聞需要點5次滑鼠,你就要縮短這個點擊數。
4.一次又一次,一遍又一遍的分析,修改你的網站資料庫結構,使其更加簡潔。
5.提高網站的安防能力
6.買個好伺服器,托管在一個好的機房!
43、網站高併發大流量訪問的處理及解決方法
第一:確認伺服器硬體是否足夠支持當前的流量。
普通的P4伺服器一般最多能支持每天10萬獨立IP,如果訪問量比這個還要大,那麼必須首先配置一臺更高性能的專用伺服器才能解決問題,否則怎麼優化都不可能徹底解決性能問題。
第二:優化資料庫訪問
前臺實現完全的靜態化當然最好,可以完全不用訪問資料庫,不過對於頻繁更新的網站,靜態化往往不能滿足某些功能。
緩存就是另一個解決方案,就是將動態數據存儲到緩存文件中,動態網頁直接調用這些文件,而不必再訪問資料庫,技術如果確實無法避免對資料庫的訪問,那麼可以嘗試優化資料庫的查詢SQL.避免使用Select * from這樣的語句,每次查詢只返回自己需要的結果,避免短時間內的大量SQL查詢。最好在相同欄位進行比較操作,在建立好的索引欄位上儘量減少函數操作,如果要做到極致的話需要代碼的優化;
第三,禁止外部的盜鏈。
外部網站的或者文件盜鏈往往會帶來大量的負載壓力,因此應該嚴格限制外部對於自身的圖片或者文件盜鏈,好在目前可以簡單地通過refer來控制盜鏈,自己就可以通過配置來禁止盜鏈。當然,偽造refer也可以通過來實現盜鏈,不過目前蓄意偽造refer盜鏈的還不多,可以先不去考慮,或者使用非技術手段來解決,比如在圖片上增加水印。
第四,控制大文件的下載。
大文件的下載會占用很大的流量,並且對於非SCSI硬碟來說,大量文件下載會消耗CPU,使得網站響應能力下降。因此,儘量不要提供超過2M的大文件下載,如果需要提供,建議將大文件放在另外一臺伺服器上。
第五,使用不同主機分流主要流量
將文件放在不同的主機上,提供不同的鏡像供用戶下載。比如如果覺得RSS文件占用流量大,那麼使用FeedBurner或者FeedSky等服務將RSS輸出放在其他主機上,這樣別人訪問的流量壓力就大多集中在FeedBurner的主機上,RSS就不占用太多資源了。
第六,使用流量分析統計軟體。
在網站上一個流量分析統計軟體,可以即時知道哪些地方耗費了大量流量,哪些頁面需要再進行優化,因此,解決流量問題還需要進行精確的統計分析才可以。我推薦使用的流量分析統計軟體是Analytics(Google分析)。
45、主要運用到哪些緩存
一、數據緩存
這裡所說的數據緩存是指資料庫查詢緩存,每次訪問頁面的時候,都會先檢測相應的緩存數據是否存在,如果不存在,就連接資料庫,得到數據,並把查詢結果序列化後保存到文件中,以後同樣的查詢結果就直接從緩存表或文件中獲得。
用的最廣的例子看Discuz的搜索功能,把結果ID緩存到一個表中,下次搜索相同關鍵字時先搜索緩存表。
舉個常用的方法,多表關聯的時候,把附表中的內容生成數組保存到主表的一個欄位中,需要的時候數組分解一下,這樣的好處是只讀一個表,壞處就是兩個數據同步會多不少步驟,資料庫永遠是瓶頸,用硬碟換速度,是這個的關鍵點。
二、頁面緩存
每次訪問頁面的時候,都會先檢測相應的緩存頁面文件是否存在,如果不存在,就連接資料庫,得到數據,顯示頁面並同時生成緩存頁面文件,這樣下次訪問的時候頁面文件就發揮作用了。(模板引擎和網上常見的一些緩存類通常有此功能)。
三、時間觸發緩存
檢查文件是否存在並且時間戳小於設置的過期時間,如果文件修改的時間戳比當前時間戳減去過期時間戳大,那麼就用緩存,否則更新緩存。
四、內容觸發緩存
當插入數據或更新數據時,強制更新緩存。
五、靜態緩存
這裡所說的靜態緩存是指靜態化,直接生成HTML或XML等文本文件,有更新的時候重生成一次,適合於不太變化的頁面,這就不說了。
六、記憶體緩存
Memcached是高性能的,分散式的記憶體對象緩存系統,用於在動態應用中減少資料庫負載,提升訪問速度。redis 也可以做到。
46、php的設計模式
1、單例模式 2、工廠模式 3、觀察者模式 4、命令鏈模式 5、策略模式
單例模式:
一個類在整個應用中,只有一個對象實例的設計模式
類必須自行創建這個實例
必須自行向整個系統提供這個實例
三私:私有靜態成員變數、構造函數、克隆函數
一公:公共的靜態方法
2、工廠模式
可以根據輸入的參數或者應用程式配置的不同一創建一種專門用來實例化並返回其它類的實例的類
3、觀察者模式
觀察者模式提供了組件之間緊密耦合的另一種方法。
該模式:一個對象通過添加一個方法(該方法允許另一個對象,即觀察者註冊自己)全本身變得可觀察。當可觀察的對象更改時,它會將消息發送到已註冊的觀察者。這些觀察者使用該信息執行的操作與可觀察的對象無關。
4、命令鏈模式:
以鬆散耦合主題為基礎,發送消息、命令和請求,或通過一組處理程式發送任意內容。每個處理程式都會自行判斷自己能否處理請求,如果可以,該請求被處理,進程停止。
5、策略模式:
此演算法是從複雜類提取的,因而可以方便地替換。
47.Mysql事務的特性
事務是作為一個邏輯單元執行的一系列操作,一個邏輯工作單元必須有四個屬性,稱為 ACID(原子性、一致性、隔離性和持久性)屬性,只有這樣才能成為一個事務:
原子性
事務必須是原子工作單元;對於其數據修改,要麼全都執行,要麼全都不執行。
一致性
事務在完成時,必須使所有的數據都保持一致狀態。在相關資料庫中,所有規則都必須應用於事務的修改,以保持所有數據的完整性。
事務結束時,所有的內部數據結構(如 B 樹索引或雙向鏈表)都必須是正確的。
隔離性
由併發事務所作的修改必須與任何其它併發事務所作的修改隔離。事務查看數據時數據所處的狀態,要麼是另一併發事務修改它之前的狀態,
要麼是另一事務修改它之後的狀態,事務不會查看中間狀態的數據。這稱為可串列性,因為它能夠重新裝載起始數據,
並且重播一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。
持久性
事務完成之後,它對於系統的影響是永久性的。該修改即使出現系統故障也將一直保持。
begin 開始一個事務
rollback事務回滾
commit事務確認
48、Mysql事務的應運場景
事務處理在各種管理系統中都有著廣泛的應用,比如人員管理系統,很多同步資料庫操作大都需要用到事務處理。比如說,在人員管理系統中,你刪除一個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些資料庫操作語句就構成一個事務!
比如手機充值過程,支付寶金額減少,相應的手機話費增加,只要有一個操作不成功,則另外一個操作也不會成功
49.Include和require的區別
require函數通常放在PHP程式的最前面,在PHP程式執行之前,就會先讀取require指定引入的文件,使它變成PHP程式網頁的一部分。
include函數一般是放在流程式控制制的處理部分中。PHP程式在讀到include的文件時,才將它讀進來,這種方式可以把程式執行時的流程簡單化。
他們兩個的用途是一樣的,不一定非要哪個放在最前面哪個放在中間,他們最根本的區別在於錯誤處理的方式不一樣。
require一個文件存在錯誤的話,那麼程式就會中斷執行,並顯示致命錯誤
而include一個文件存在錯誤的話,那麼程式不會中斷,會繼續執行,並顯示一個警告的錯誤
其它區別:include有返回值,而require沒有。
50、索引的建立與使用
索引就是類似書的目錄,提高檢索數據的效率。
索引是系統按照某個具體的演算法(哈希,散列,二叉樹),將數據從全部數據里進行提取,維護成一個索引文件,然後系統在進行數據查詢的時候,發現如果查詢條件剛好滿足索引條件,就可以從索引文件中快速的定位的數據所在位置。
mysql中有以下幾種索引:
主鍵索引(primary key效率最高的索引)
唯一索引(unique key):不為空的情況下效率最高
普通索引(index)對數據沒有要求,文件很大,效率比較低
全文索引(fulltext),對整個文章內部進行關鍵字索引(mysql5.5以後InnoDB支持全文索引)
英文的全文索引很簡單:英文單詞預設是用空格分離的
中文的全文索引很難:中文的片語成很麻煩,需要利用分詞工具(sphinx)
索引可以在創建表的同時創建索引,也可以在修改表結構時添加索引,索引主要是加在經常做為查詢條件的欄位上,可以使用相應的手段來檢測所執行的sql語句中是否使用到了索引。
51.正則匹配表達式各個符文表達的意義
\ 將下一個字元標記為一個特殊字元、或一個原義字元、或一個向後引用、或一個八進位轉義符。例如,’n’ 匹配字元 “n”。’\n’ 匹配一個換行符。序列 ‘\\’ 匹配 “\” 而 “\(” 則匹配 “(”。
^ 匹配輸入字元串的開始位置。如果設置了 RegExp 對象的 Multiline 屬性,^ 也匹配 ‘\n’ 或 ‘\r’ 之後的位置。
$ 匹配輸入字元串的結束位置。如果設置了RegExp 對象的 Multiline 屬性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。
* 匹配前面的子表達式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等價於{0,}。
+ 匹配前面的子表達式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等價於 {1,}。
? 匹配前面的子表達式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等價於 {0,1}。
{n} n 是一個非負整數。匹配確定的 n 次。
{n,} n 是一個非負整數。至少匹配n 次。
{n,m} m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。
. 匹配除 “\n” 之外的任何單個字元。要匹配包括 ‘\n’ 在內的任何字元,請使用象 ‘[.\n]’ 的模式。
x|y 匹配 x 或 y。
[xyz] 字元集合。匹配所包含的任意一個字元。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。
[^xyz] 負值字元集合。匹配未包含的任意字元。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p'。
[a-z] 字元範圍。匹配指定範圍內的任意字元。例如,’[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 範圍內的任意小寫字母字元。
[^a-z] 負值字元範圍。匹配任何不在指定範圍內的任意字元。例如,’[^a-z]’ 可以匹配任何不在 ‘a’ 到 ‘z’ 範圍內的任意字元。
\b 匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, ‘er\b’ 可以匹配”never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。
\d 匹配一個數字字元。等價於 [0-9]。
\D 匹配一個非數字字元。等價於 [^0-9]。
\f 匹配一個換頁符。等價於 \x0c 和 \cL。
\n 匹配一個換行符。等價於 \x0a 和 \cJ。
\r 匹配一個回車符。等價於 \x0d 和 \cM。
\s 匹配任何空白字元,包括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v]。
\S 匹配任何非空白字元。等價於 [^ \f\n\r\t\v]。
\t 匹配一個製表符。等價於 \x09 和 \cI。
\v 匹配一個垂直製表符。等價於 \x0b 和 \cK。
\w 匹配包括下劃線的任何單詞字元。等價於’[A-Za-z0-9_]’。
\W 匹配任何非單詞字元。等價於 ‘[^A-Za-z0-9_]’。
52.PHP的變數類型
四種標量類型:
boolean (布爾型):這是最簡單的類型,只有兩種取值,可以為 TRUE/true 或 FALSE/false ,不區分大小寫。詳細請查看:PHP布爾類型(boolean)
integer (整型):在32 位操作系統中它的有效範圍是:-2 147 483 648~+2 147 483 647。整型值可以使用十進位,十六進位或八進位表示,前面可以加上可選的符號(- 或者 +)。八進位表示數字前必須加上 0(零),十六進位表示數字前必須加上 0x。
float (浮點型, 也稱作 double)
string (字元串):字元型變數不同於其他編程語言有字元與字元串之分,在PHP 中,統一使用字元型變數來定義字元或者字元串。
兩種複合類型:
array (數組):數組型變數是一種比較特殊的變數類型,將在後續章節中詳細說明。
object (對象):對象也是一種特殊的數據類型。要創建object變數,請使用 new 關鍵字。詳細請查看:PHP對象類型(object)
最後是兩種特殊類型:
resource(資源):源是一種特殊變數,保存了到外部資源的一個引用。資源是通過專門的函數來建立和使用的。詳情請查看:PHP資源類型(resource)
NULL(NULL):表示一個變數沒有值。NULL 類型唯一可能的值就是 NULL。
54.商城秒殺的實現
搶購、秒殺是如今很常見的一個應用場景,主要需要解決的問題有兩個:
1 高併發對資料庫產生的壓力
2 競爭狀態下如何解決庫存的正確減少("超賣"問題)
對於第一個問題,已經很容易想到用緩存來處理搶購,避免直接操作資料庫,例如使用Redis。第二個問題,我們可以使用redis隊列來完成,把要秒殺的商品放入到隊列中,因為pop操作是原子的,即使有很多用戶同時到達,也是依次執行,文件鎖和事務在高併發下性能下降很快,當然還要考慮其他方面的東西,比如搶購頁面做成靜態的,通過ajax調用介面,其中也可能會出現一個用戶搶多次的情況,這時候需要再加上一個排隊隊列和搶購結果隊列及庫存隊列。高併發情況下,將用戶進入排隊隊列,用一個線程迴圈處理從排隊隊列取出一個用戶,判斷用戶是否已在搶購結果隊列,如果在,則已搶購,否則未搶購,庫存減1,寫資料庫,將用戶入結果隊列。
55.購物車的原理
購物車相當於現實中超市的購物車,不同的是一個是實體車,一個是虛擬車而已。用戶可以在購物網站的不同頁面之間跳轉,以選購自己喜愛的商品,點擊購買時,該商品就自動保存到你的購物車中,重覆選購後,最後將選中的所有商品放在購物車中統一到付款台結賬,這也是儘量讓客戶體驗到現實生活中購物的感覺。伺服器通過追蹤每個用戶的行動,以保證在結賬時每件商品都物有其主。
主要涉及以下幾點:
1、把商品添加到購物車,即訂購
2、 刪除購物車中已定購的商品
3、 修改購物車中某一本圖書的訂購數量
4、 清空購物車
5、 顯示購物車中商品清單及數量、價格
實現購物車的關鍵在於伺服器識別每一個用戶並維持與他們的聯繫。但是HTTP協議是一種“無狀態(Stateless)”的協議,因而伺服器不能記住是誰在購買商品,當把商品加入購物車時,伺服器也不知道購物車裡原先有些什麼,使得用戶在不同頁面間跳轉時購物車無法“隨身攜帶”,這都給購物車的實現造成了一定的困難。
目前購物車的實現主要是通過cookie、session或結合資料庫的方式。下麵分析一下它們的機制及作用。
1. cookie
cookie是由伺服器產生,存儲在客戶端的一段信息。它定義了一種Web伺服器在客戶端存儲和返回信息的機制,cookie文件它包含域、路徑、生存期、和由伺服器設置的變數值等內容。當用戶以後訪問同一個Web伺服器時,瀏覽器會把cookie原樣發送給伺服器。通過讓伺服器讀取原先保存到客戶端的信息,網站能夠為瀏覽者提供一系列的方便,例如線上交易過程中標識用戶身份、安全要求不高的場合避免用戶重覆輸入名字和密碼、門戶網站的主頁定製、有針對性地投放廣告等等。利用cookie的特性,大大擴展了WEB應用程式的功能,不僅可以建立伺服器與客戶機的聯繫,因為cookie可以由伺服器定製,因此還可以將購