最近一直在面試,因此總結了下常見的 PHP 面試題.php
安全對一套程序來講相當重要,請說說在開發中應該注意哪些安全機制?
①防遠程提交;
②防SQL注入,對特殊代碼進行過濾;
③防止註冊機灌水,使用驗證碼;html
在程序的開發中,如何提升程序的運行效率?
①優化SQL語句,查詢語句中儘可能不使用select *,用哪一個字段查哪一個字段;少用子查詢可用錶鏈接代替;少用模糊查詢
②數據表中建立索引
③對程序中常常用到的數據生成緩存mysql
如今編程中常常採起MVC三層結構,請問MVC分別指哪三層,有什麼優勢?
MVC三層分別指:業務模型、視圖、控制器,由控制器層調用模型處理數據,而後將數據映射到視圖層進行顯示,優勢是:
①能夠實現代碼的重用性,避免產生代碼冗餘
②M和V的實現代碼分離,從而使同一個程序可使用不一樣的表現形式ios
對json數據格式的理解?
JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,json數據格式固定,能夠被多種語言用做數據的傳遞
PHP中處理json格式的函數爲json_decode( string $json [, bool $assoc ] ) ,接受一個 JSON格式的字符串而且把它轉換爲PHP變量,參數json待解碼的json string格式的字符串。assoc當該參數爲TRUE時,將返回array而非object;
Json_encode:將PHP變量轉換成json格式nginx
Print、echo、print_r有什麼區別?
① echo和print均可以作輸出,不一樣的是,echo不是函數,沒有返回值,而print是一個函數有返回值,因此相對而言若是隻是輸出echo會更快,而print_r一般用於打印變量的相關信息,一般在調試中使用。
② print 是打印字符串
③ print_r 則是打印複合類型 如數組 對象git
SESSION與COOKIE的區別?
①COOKIE保存在客戶端,而SESSION則保存在服務器端
②從安全性來說,SESSION的安全性更高
③從保存內容的類型的角度來說,COOKIE只保存字符串(及可以自動轉換成字符串)
④從保存內容的大小來看,COOKIE保存的內容是有限的,比較小,而SESSION基本上沒有這個限制
⑤從性能的角度來說,用SESSION的話,對服務器的壓力會更大一些
⑥SEEION依賴於COOKIE,但若是禁用COOKIE,也能夠經過url傳遞github
PHP處理數組的經常使用函數?
①array()建立數組;
②count()返回數組中元素的數目;
③array_push()將一個或多個元素插入數組的末尾(入棧);
④array_column()返回輸入數組中某個單一列的值;
⑤array_combine()經過合併兩個數組來建立一個新數組;
⑥array_reverse()以相反的順序返回數組;
⑦array_unique()刪除數組中的重複值;
⑧in_array()檢查數組中是否存在指定的值;面試
PHP處理字符串的經常使用函數?
①trim()移除字符串兩側的空白字符和其餘字符;
②substr_replace()把字符串的一部分替換爲另外一個字符串;
③substr_count()計算子串在字符串中出現的次數;
④substr()返回字符串的一部分;
⑤strtolower()把字符串轉換爲小寫字母;
⑥strtoupper()把字符串轉換爲大寫字母;
⑦strtr()轉換字符串中特定的字符;
⑧strrchr()查找字符串在另外一個字符串中最後一次出現;
⑨strstr()查找字符串在另外一字符串中的第一次出現(對大小寫敏感);strrev()反轉字符串;strlen()返回字符串的長度;str_replace()替換字符串中的一些字符(對大小寫敏感);print()輸出一個或多個字符串;explode()把字符串打散爲數組;is_string()檢測變量是不是字符串;strip_tags()從一個字符串中去除HTML標籤;mb_substr()用來截中文與英文的函數算法
PHP處理時間的經常使用函數?
date_default_timezone_get()返回默認時區。
date_default_timezone_set()設置默認時區。
date()格式化本地時間/日期。
getdate()返回日期/時間信息。
gettimeofday()返回當前時間信息。
microtime()返回當前時間的微秒數。
mktime()返回一個日期的 Unix時間戳。
strtotime()將任何英文文本的日期或時間描述解析爲 Unix時間戳。
time()返回當前時間的 Unix時間戳。sql
PHP操做文件的經常使用函數?
①打開文件;
②刪除文件;
③讀取文件;
④寫入文件;
⑤修改文件;
⑥關閉文件;
⑦建立文件等等
PHP操做目錄(文件夾)的經常使用函數?
①打開目錄;
②刪除目錄;
③讀取目錄;
④建立目錄;
⑤修改目錄;
⑥關閉目錄
SQL語言包括哪幾部分?每部分都有哪些操做關鍵字?
答:SQL語言包括數據定義(DDL)、數據操縱(DML),數據控制(DCL)和數據查詢(DQL)四個部分。
數據定義:Create Table,Alter Table,Drop Table, Craete/Drop Index等
數據操縱:Select ,insert,update,delete,
數據控制:grant,revoke
數據查詢:select
完整性約束包括哪些?
答:數據完整性(Data Integrity)是指數據的精確(Accuracy)和可靠性(Reliability)。
分爲如下四類:
什麼是事務?及其特性?
答:事務:是一系列的數據庫操做,是數據庫應用的基本邏輯單位。
事務特性:
(1)原子性:即不可分割性,事務要麼所有被執行,要麼就所有不被執行。
(2)一致性或可串性。事務的執行使得數據庫從一種正確狀態轉換成另外一種正確狀態
(3)隔離性。在事務正確提交以前,不容許把該事務對數據的任何改變提供給任何其餘事務,
(4) 持久性。事務正確提交後,其結果將永久保存在數據庫中,即便在事務提交後有了其餘故障,事務的處理結果也會獲得保存。
或者這樣理解:
事務就是被綁定在一塊兒做爲一個邏輯工做單元的SQL語句分組,若是任何一個語句操做失敗那麼整個操做就被失敗,之後操做就會回滾到操做前狀態,或者是上有個節點。爲了確保要麼執行,要麼不執行,就可使用事務。要將有組語句做爲事務考慮,就須要經過ACID測試,即原子性,一致性,隔離性和持久性。
什麼是鎖?
答:
數據庫是一個多用戶使用的共享資源。當多個用戶併發地存取數據時,在數據庫中就會產生多個事務同時存取同一數據的狀況。若對併發操做不加控制就可能會讀取和存儲不正確的數據,破壞數據庫的一致性。
加鎖是實現數據庫併發控制的一個很是重要的技術。當事務在對某個數據對象進行操做前,先向系統發出請求,對其加鎖。加鎖後事務就對該數據對象有了必定的控制,在該事務釋放鎖以前,其餘的事務不能對此數據對象進行更新操做。
基本鎖類型:鎖包括行級鎖和表級鎖
什麼叫視圖?遊標是什麼?
答:視圖是一種虛擬的表,具備和物理表相同的功能。能夠對視圖進行增,改,查,操做,視圖一般是有一個表或者多個表的行或列的子集。對視圖的修改不影響基本表。它使得咱們獲取數據更容易,相比多表查詢。
遊標:是對查詢出來的結果集做爲一個單元來有效的處理。遊標能夠定在該單元中的特定行,從結果集的當前行檢索一行或多行。能夠對結果集當前行作修改。通常不使用遊標,可是須要逐條處理數據的時候,遊標顯得十分重要。
什麼是存儲過程?用什麼來調用?
答:存儲過程是一個預編譯的SQL語句,優勢是容許模塊化的設計,就是說只需建立一次,之後在該程序中就能夠調用屢次。若是某次操做須要執行屢次SQL,使用存儲過程比單純SQL語句執行要快。能夠用一個命令對象來調用存儲過程。
索引的做用?和它的優勢缺點是什麼?
答:索引就一種特殊的查詢表,數據庫的搜索引擎能夠利用它加速對數據的檢索。它很相似與現實生活中書的目錄,不須要查詢整本書內容就能夠找到想要的數據。索引能夠是惟一的,建立索引容許指定單個列或者是多個列。缺點是它減慢了數據錄入的速度,同時也增長了數據庫的尺寸大小。
如何通俗地理解三個範式?
第一範式:1NF是對屬性的原子性約束,要求屬性具備原子性,不可再分解
第二範式:2NF是對記錄的唯一性約束,要求記錄有唯一標識,即實體的唯一性
第三範式:3NF是對字段冗餘性的約束,即任何字段不能由其餘字段派生出來,它要求字段沒有冗餘
什麼是基本表?什麼是視圖?
答:基本表是自己獨立存在的表,在 SQL 中一個關係就對應一個表。 視圖是從一個或幾個基本表導出的表。視圖自己不獨立存儲在數據庫中,是一個虛表
試述視圖的優勢?
答:(1) 視圖可以簡化用戶的操做 (2) 視圖使用戶能以多種角度看待同一數據; (3) 視圖爲數據庫提供了必定程度的邏輯獨立性; (4) 視圖可以對機密數據提供安全保護。
NULL是什麼意思
答:NULL這個值表示UNKNOWN(未知):它不表示「」(空字符串)。對NULL這個值的任何比較都會生產一個NULL值。您不能把任何值與一個 NULL值進行比較,並在邏輯上但願得到一個答案。
使用IS NULL來進行NULL判斷
主鍵、外鍵和索引的區別?
主鍵、外鍵和索引的區別
定義:
主鍵--惟一標識一條記錄,不能有重複的,不容許爲空
外鍵--表的外鍵是另外一表的主鍵, 外鍵能夠有重複的, 能夠是空值
索引--該字段沒有重複值,但能夠有一個空值
做用:
主鍵--用來保證數據完整性
外鍵--用來和其餘表創建聯繫用的
索引--是提升查詢排序的速度
個數:
主鍵--主鍵只能有一個
外鍵--一個表能夠有多個外鍵
索引--一個表能夠有多個惟一索引
說說對SQL語句優化有哪些方法?(選擇幾條)
(1)Where子句中:where表之間的鏈接必須寫在其餘Where條件以前,那些能夠過濾掉最大數量記錄的條件必須寫在Where子句的末尾.HAVING最後。
(2)用EXISTS替代IN、用NOT EXISTS替代NOT IN。
(3) 避免在索引列上使用計算
(4)避免在索引列上使用IS NULL和IS NOT NULL
(5)對查詢進行優化,應儘可能避免全表掃描,首先應考慮在 where 及 order by 涉及的列上創建索引。
(6)應儘可能避免在 where 子句中對字段進行 null 值判斷,不然將致使引擎放棄使用索引而進行全表掃描
(7)應儘可能避免在 where 子句中對字段進行表達式操做,這將致使引擎放棄使用索引而進行全表掃描
SQL語句中‘相關子查詢’與‘非相關子查詢’有什麼區別?
答:子查詢:嵌套在其餘查詢中的查詢稱之。
子查詢又稱內部,而包含子查詢的語句稱以外部查詢(又稱主查詢)。
全部的子查詢能夠分爲兩類,即相關子查詢和非相關子查詢
(1)非相關子查詢是獨立於外部查詢的子查詢,子查詢總共執行一次,執行完畢後將值傳遞給外部查詢。
(2)相關子查詢的執行依賴於外部查詢的數據,外部查詢執行一行,子查詢就執行一次。
故非相關子查詢比相關子查詢效率高
char和varchar的區別?
答:是一種固定長度的類型,varchar則是一種可變長度的類型,它們的區別是:
char(M)類型的數據列裏,每一個值都佔用M個字節,若是某個長度小於M,MySQL就會在它的右邊用空格字符補足.(在檢索操做中那些填補出來的空格字符將被去掉)在varchar(M)類型的數據列裏,每一個值只佔用恰好夠用的字節再加上一個用來記錄其長度的字節(即總長度爲L+1字節).
Mysql 的存儲引擎,myisam和innodb的區別。
答:簡單的表達:
MyISAM 是非事務的存儲引擎;適合用於頻繁查詢的應用;表鎖,不會出現死鎖;適合小數據,小併發
innodb是支持事務的存儲引擎;合於插入和更新操做比較多的應用;設計合理的話是行鎖(最大區別就在鎖的級別上);適合大數據,大併發。
數據表類型有哪些
答:MyISAM、InnoDB、HEAP、BOB,ARCHIVE,CSV等。
MyISAM:成熟、穩定、易於管理,快速讀取。一些功能不支持(事務等),表級鎖。
InnoDB:支持事務、外鍵等特性、數據行鎖定。空間佔用大,不支持全文索引等。
MySQL數據庫做發佈系統的存儲,一天五萬條以上的增量,預計運維三年,怎麼優化?
a. 設計良好的數據庫結構,容許部分數據冗餘,儘可能避免join查詢,提升效率。
b. 選擇合適的表字段數據類型和存儲引擎,適當的添加索引。
c. mysql庫主從讀寫分離。
d. 找規律分表,減小單表中的數據量提升查詢速度。
e.添加緩存機制,好比memcached,apc等。
f. 不常常改動的頁面,生成靜態頁面。
g. 書寫高效率的SQL。好比 SELECT * FROM TABEL 改成 SELECT field_1, field_2, field_3 FROM TABLE.
對於大流量的網站,您採用什麼樣的方法來解決各頁面訪問量統計問題?
答:
a. 確認服務器是否能支撐當前訪問量。
b. 優化數據庫訪問。
c. 禁止外部訪問連接(盜鏈), 好比圖片盜鏈。
d. 控制文件下載。
e. 使用不一樣主機分流。
f. 使用瀏覽統計軟件,瞭解訪問量,有針對性的進行優化。
什麼是面向對象?
答:面向對象OO = 面向對象的分析OOA + 面向對象的設計OOD + 面向對象的編程OOP;通俗的解釋就是「萬物皆對象」,把全部的事物都看做一個個能夠獨立的對象(單元),它們能夠本身完成本身的功能,而不是像C那樣分紅一個個函數。
如今純正的OO語言主要是Java和C#,PHP、C++也支持OO,C是面向過程的。
簡述 private、 protected、 public修飾符的訪問權限。
private : 私有成員, 在類的內部才能夠訪問。
protected : 保護成員,該類內部和繼承類中能夠訪問。
public : 公共成員,徹底公開,沒有訪問限制
堆和棧的區別?
答:棧是編譯期間就分配好的內存空間,所以你的代碼中必須就棧的大小有明確的定義;
堆是程序運行期間動態分配的內存空間,你能夠根據程序的運行狀況肯定要分配的堆內存的大小。
面向對象的特徵有哪些方面?
答:主要有封裝,繼承,多態。若是是4個方面則加上:抽象。
下面的解釋爲理解:
封裝:
封裝是保證軟件部件具備優良的模塊性的基礎,封裝的目標就是要實現軟件部件的高內聚,低耦合,防止程序相互依賴性而帶來的變更影響.
繼承:
在定義和實現一個類的時候,能夠在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容做爲本身的內容,並能夠加入若干新的內容,或修改原來的方法使之更適合特殊的須要,這就是繼承。繼承是子類自動共享父類數據和方法的機制,這是類之間的一種關係,提升了軟件的可重用性和可擴展性。
多態:
多態是指程序中定義的引用變量所指向的具體類型和經過該引用變量發出的方法調用在編程時並不肯定,而是在程序運行期間才肯定,即一個引用變量倒底會指向哪一個類的實例對象,該引用變量發出的方法調用究竟是哪一個類中實現的方法,必須在由程序運行期間才能決定。
抽象:
抽象就是找出一些事物的類似和共性之處,而後將這些事物歸爲一個類,這個類只考慮這些事物的類似和共性之處,而且會忽略與當前主題和目標無關的那些方面,將注意力集中在與當前目標有關的方面。例如,看到一隻螞蟻和大象,你可以想象出它們的相同之處,那就是抽象。
抽象類和接口的概念以及區別?
答:抽象類:它是一種特殊的,不能被實例化的類,只能做爲其餘類的父類使用。使用abstract關鍵字聲明。
它是一種特殊的抽象類,也是一個特殊的類,使用interface聲明。
(1)抽象類的操做經過繼承關鍵字extends實現,而接口的使用是經過implements關鍵字來實現。
(2)抽象類中有數據成員,能夠實現數據的封裝,可是接口沒有數據成員。
(3)抽象類中能夠有構造方法,可是接口沒有構造方法。
(4)抽象類的方法能夠經過private、protected、public關鍵字修飾(抽象方法不能是private),而接口中的方法只能使用public關鍵字修飾。
(5)一個類只能繼承於一個抽象類,而一個類能夠同時實現多個接口。
(6)抽象類中能夠有成員方法的實現代碼,而接口中不能夠有成員方法的實現代碼。
什麼是構造函數,什麼是析構函數,做用是什麼?
答:構造函數(方法)是對象建立完成後第一個被對象自動調用的方法。它存在於每一個聲明的類中,是一個特殊的成員方法。做用是執行一些初始化的任務。Php中使用__construct()聲明構造方法,而且只能聲明一個。
析構函數(方法)做用和構造方法正好相反,是對象被銷燬以前最後一個被對象自動調用的方法。是PHP5中新添加的內容做用是用於實如今銷燬一個對象以前執行一些特定的操做,諸如關閉文件和釋放內存等。
如何重載父類的方法,舉例說明
答:重載,即覆蓋父類的方法,也就是使用子類中的方法替換從父類中繼承的方法,也叫方法的重寫。
覆蓋父類方法的關鍵是在子類中建立於父類中相同的方法包括方法的名稱、參數和返回值類型。PHP中只要求方法的名稱相同便可。
經常使用的魔術方法有哪些?舉例說明
答:php規定以兩個下劃線(__)開頭的方法都保留爲魔術方法,因此建議你們函數名最好不用__開頭,除非是爲了重載已有的魔術方法。
__construct() 實例化類時自動調用。
__destruct() 類對象使用結束時自動調用。
__set() 在給未定義的屬性賦值的時候調用。
__get() 調用未定義的屬性時候調用。
__isset() 使用isset()或empty()函數時候會調用。
__unset() 使用unset()時候會調用。
__sleep() 使用serialize序列化時候調用。
__wakeup() 使用unserialize反序列化的時候調用。
__call() 調用一個不存在的方法的時候調用。
__callStatic()調用一個不存在的靜態方法是調用。
__toString() 把對象轉換成字符串的時候會調用。好比 echo。
__invoke() 當嘗試把對象當方法調用時調用。
__set_state() 當使用var_export()函數時候調用。接受一個數組參數。
__clone() 當使用clone複製一個對象時候調用。
$this和self、parent這三個關鍵詞分別表明什麼?在哪些場合下使用?
答:$this 當前對象
self 當前類
parent 當前類的父類
$this在當前類中使用,使用->調用屬性和方法。
self也在當前類中使用,不過須要使用::調用。
parent在類中使用。
類中如何定義常量、如何類中調用常量、如何在類外調用常量。
答:類中的常量也就是成員常量,常量就是不會改變的量,是一個恆值。
定義常量使用關鍵字const.
例如:const PI = 3.1415326;
不管是類內仍是類外,常量的訪問和變量是不同的,常量不須要實例化對象,
訪問常量的格式都是類名加做用域操做符號(雙冒號)來調用。
即:類名 :: 類常量名;
做用域操做符::如何使用?都在哪些場合下使用?
答:調用類常量
調用靜態方法
__autoload()方法的工做原理是什麼?
答:使用這個魔術函數的基本條件是類文件的文件名要和類的名字保持一致。
當程序執行到實例化某個類的時候,若是在實例化前沒有引入這個類文件,那麼就自動執行__autoload()函數。
這個函數會根據實例化的類的名稱來查找這個類文件的路徑,當判斷這個類文件路徑下確實存在這個類文件後
就執行include或者require來載入該類,而後程序繼續執行,若是這個路徑下不存在該文件時就提示錯誤。
使用自動載入的魔術函數能夠沒必要要寫不少個include或者require函數
如何進行SQL優化?(關於後邊的解釋同窗們能夠進行理解,到時根據本身的理解把大致意思說出來便可)
答:(1)選擇正確的存儲引擎
以 MySQL爲例,包括有兩個存儲引擎 MyISAM 和 InnoDB,每一個引擎都有利有弊。
MyISAM 適合於一些須要大量查詢的應用,但其對於有大量寫操做並非很好。甚至你只是須要update一個字段,整個表都會被鎖起來,而別的進程,就算是讀進程都沒法操做直到讀操做完成。另外,MyISAM 對於 SELECT COUNT(*) 這類的計算是超快無比的。
InnoDB 的趨勢會是一個很是複雜的存儲引擎,對於一些小的應用,它會比 MyISAM 還慢。可是它支持「行鎖」 ,因而在寫操做比較多的時候,會更優秀。而且,他還支持更多的高級應用,好比:事務。
(2)優化字段的數據類型
記住一個原則,越小的列會越快。若是一個表只會有幾列罷了(好比說字典表,配置表),那麼,咱們就沒有理由使用 INT 來作主鍵,使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 會更經濟一些。若是你不須要記錄時間,使用 DATE 要比 DATETIME 好得多。固然,你也須要留夠足夠的擴展空間。
(3)爲搜索字段添加索引
索引並不必定就是給主鍵或是惟一的字段。若是在你的表中,有某個字段你總要會常常用來作搜索,那麼最好是爲其創建索引,除非你要搜索的字段是大的文本字段,那應該創建全文索引。
(4)避免使用Select 從數據庫裏讀出越多的數據,那麼查詢就會變得越慢。而且,若是你的數據庫服務器和WEB服務器是兩臺獨立的服務器的話,這還會增長網絡傳輸的負載。即便你要查詢數據表的全部字段,也儘可能不要用通配符,善用內置提供的字段排除定義也許能給帶來更多的便利。
(5)使用 ENUM 而不是 VARCHAR
ENUM 類型是很是快和緊湊的。在實際上,其保存的是 TINYINT,但其外表上顯示爲字符串。這樣一來,用這個字段來作一些選項列表變得至關的完美。例如,性別、民族、部門和狀態之類的這些字段的取值是有限並且固定的,那麼,你應該使用 ENUM 而不是 VARCHAR。
(6)儘量的使用 NOT NULL
除非你有一個很特別的緣由去使用 NULL 值,你應該老是讓你的字段保持 NOT NULL。 NULL其實須要額外的空間,而且,在你進行比較的時候,你的程序會更復雜。 固然,這裏並非說你就不能使用NULL了,現實狀況是很複雜的,依然會有些狀況下,你須要使用NULL值。
(7)固定長度的表會更快
若是表中的全部字段都是「固定長度」的,整個表會被認爲是 「static」 或 「fixed-length」。 例如,表中沒有以下類型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一個這些字段,那麼這個表就不是「固定長度靜態表」了,這樣,MySQL 引擎會用另外一種方法來處理。
固定長度的表會提升性能,由於MySQL搜尋得會更快一些,由於這些固定的長度是很容易計算下一個數據的偏移量的,因此讀取的天然也會很快。而若是字段不是定長的,那麼,每一次要找下一條的話,須要程序找到主鍵。
而且,固定長度的表也更容易被緩存和重建。不過,惟一的反作用是,固定長度的字段會浪費一些空間,由於定長的字段不管你用不用,他都是要分配那麼多的空間。
統計某一天網站的訪問量
推薦篇文章,講awk實際使用的shell在手分析服務器日誌不愁
如何修改文件爲當前用戶只讀
chmod u=r 文件名
fastcgi經過端口監聽和經過文件監聽的區別
監聽方式 | 形式 | nginx連接fastcgi方式 |
---|---|---|
端口監聽 | fastcgi_pass 127.0.0.1:9000 | TCP連接 |
文件監聽 | fastcgi_pass /tmp/php_cgi.sock | Unix domain Socket |
Redis主從是怎樣同步數據的?(即複製功能)
不管是初次鏈接仍是從新鏈接,當創建一個從服務器時,從服務器都將從主服務器發送一個SYNC命令。接到SYNC命令的主服務器將開始執行BGSAVE,並在保存操做執行期間,將全部新執行的命令都保存到一個緩衝區裏面,當BGSAVE執行完畢後,主服務器將執行保存操做所獲得的.rdb文件發送給從服務器,從服務器接收這個.rdb文件,並將文件中的數據載入到內存中。以後主服務器會以Redis命令協議的格式,將寫命令緩衝區中積累的全部內容都發送給從服務器。
Memcache與Redis的區別
執行SQL語句:select count(*) from articles 時,MyISAM和InnoDB哪一個快
MyISAM快,由於MyISAM自己就記錄了數量,而InnoDB要掃描數據
隱式轉換
最左前綴原則
有一個複合索引:INDEX(a
, b
, c
)
使用方式 | 可否用上索引 |
---|---|
select * from users where a = 1 and b = 2 | 能用上a、b |
select * from users where b = 2 and a = 1 | 能用上a、b(有MySQL查詢優化器) |
select * from users where a = 2 and c = 1 | 能用上a |
select * from users where b = 2 and c = 1 | 不能 |
聚簇索引的葉節點就是數據節點,而非聚簇索引的頁節點仍然是索引檢點,並保留一個連接指向對應數據塊。
Session可不能夠設置失效時間,好比30分鐘過時
PHP進程間通訊的幾種方式
php類的靜態調用和實例化調用各自的利弊
靜態方法是類中的一個成員方法,屬於整個類,即便不用建立任何對象也能夠直接調用!靜態方法效率上要比實例化高,靜態方法的缺點是不自動銷燬,而實例化的則能夠作銷燬。
php7新特性
php7卓越性能背後的優化
21.列出一些防範SQL注入、XSS攻擊、CSRF攻擊的方法
mysql_real_escape_string mysql_escape_string有什麼本質的區別,有什麼用處,爲何被棄用?
什麼是閉包,跟原型鏈、做用域鏈有什麼關聯
什麼是內存泄漏,js內存泄漏是怎麼產生的?
ip地址能被僞造嗎?
一臺電腦配置無限好,能夠同時打開多少個網頁
有100萬個獎品,每一個人能夠中獎3次,先到先得,怎麼控制併發,不能發超,並保證徹底的先到先得模式
設置獎品機率,分三張表,都使用innodb引擎,一張存中獎記錄(預先插入一行),一張存獎品發放概況,一張存用戶抽獎狀況(uin惟一索引),大併發狀況下,利用mysql的排他鎖進行併發控制。流程以下:
begin
查詢用戶抽獎次數,加排他鎖
對用戶抽獎次數的更新/插入
鎖行查詢發放狀況
得到抽獎結果(某些獎品發完以後,動態變動機率)
更新發放表
插入中獎記錄
commit
7.遇到髒讀怎麼辦?
8.innodb的master線程在什麼狀況下fork其餘子線程?
9.數據鏈路層的數據是怎麼校驗的,有哪些校驗方式?
10.b+樹的查詢時間複雜度是多少,哈希表是多少,爲何數據庫索引用b+樹存儲,而不是哈希表,數據庫索引存儲還有其餘數據結構嗎?
11.apache是怎麼跟php通信的,sapi是什麼
12.php的垃圾回收機制?
13.一個網頁從輸入地址回車,到完整展現網頁內容這段時間裏,作了哪些工做,越詳細越好。
14.設計一箇中繼服務器,轉發客戶A->客戶B的請求;
15.myisam跟innodb有什麼區別;
16.php進程死鎖產生的緣由是什麼?怎麼自動排查與自動恢復?
17.有class A { public function b($a, $b, $c){}};
怎麼使用['b' => 2, 'a' => 1, 'c' => 3],對進行A::b進行調用,並順利賦值?
php5.2->php7.1的各版本演進歷史,新增特性?
18. 畫一個tcp三次握手圖
1.排序
冒泡排序
介紹:
冒泡排序(Bubble Sort,臺灣譯爲:泡沫排序或氣泡排序)是一種簡單的排序算法。它重複地走訪過要排序的數列,依次比較兩個元素,若是他們的順序錯誤就把他們交換過來。走訪數列的工做是重複地進行直到沒有再須要交換,也就是說該數列已經排序完成。這個算法的名字由來是由於越小的元素會經由交換慢慢「浮」到數列的頂端。
步驟:
比較相鄰的元素。若是第一個比第二個大,就交換他們兩個。
對每一對相鄰元素做一樣的工做,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
針對全部的元素重複以上的步驟,除了最後一個。
持續每次對愈來愈少的元素重複上面的步驟,直到沒有任何一對數字須要比較。
具體代碼:
$arr=array(1,43,54,62,21,66,32,78,36,76,39);
function bubbleSort ($arr) {
$len = count($arr);
//該層循環控制 須要冒泡的輪數
for ($i=1; $i<$len; $i++) {
//該層循環用來控制每輪 冒出一個數 須要比較的次數
for ($k=0; $k<$len-$i; $k++) {
if($arr[$k] > $arr[$k+1]) {
$tmp = $arr[$k+1]; // 聲明一個臨時變量
$arr[$k+1] = $arr[$k];
$arr[$k] = $tmp;
}
}
}
return $arr;
}
選擇排序
介紹:
選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工做原理以下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,而後,再從剩餘未排序元素中繼續尋找最小元素,而後放到排序序列末尾。以此類推,直到全部元素均排序完畢。
具體代碼:
//實現思路 雙重循環完成,外層控制輪數,當前的最小值。內層 控制的比較次數
function select_sort($arr) {
//$i 當前最小值的位置, 須要參與比較的元素
for($i=0, $len=count($arr); $i<$len-1; $i++) {
//先假設最小的值的位置
$p = $i;
//$j 當前都須要和哪些元素比較,$i 後邊的。
for($j=$i+1; $j<$len; $j++) {
//$arr[$p] 是 當前已知的最小值
if($arr[$p] > $arr[$j]) {
//比較,發現更小的,記錄下最小值的位置;而且在下次比較時,應該採用已知的最小值進行比較。
$p = $j;
}
}
//已經肯定了當前的最小值的位置,保存到$p中。
//若是發現 最小值的位置與當前假設的位置$i不一樣,則位置互換便可
if($p != $i) {
$tmp = $arr[$p];
$arr[$p] = $arr[$i];
$arr[$i] = $tmp;
}
}
//返回最終結果
return $arr;
}
插入排序
介紹:
插入排序(Insertion Sort)的算法描述是一種簡單直觀的排序算法。它的工做原理是經過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,一般採用in-place排序(即只需用到O(1)的額外空間的排序),於是在從後向前掃描過程當中,須要反覆把已排序元素逐步向後挪位,爲最新元素提供插入空間。
步驟:
從第一個元素開始,該元素能夠認爲已經被排序
取出下一個元素,在已經排序的元素序列中從後向前掃描
若是該元素(已排序)大於新元素,將該元素移到下一位置
重複步驟3,直到找到已排序的元素小於或者等於新元素的位置
將新元素插入到該位置中
重複步驟2
具體代碼:
function insert_sort($arr) {
$len=count($arr);
for($i=1; $i<$len; $i++) {
//得到當前須要比較的元素值。
$tmp = $arr[$i];
//內層循環控制 比較 並 插入
for($j=$i-1; $j>=0; $j--) {
//$arr[$i];//須要插入的元素; $arr[$j];//須要比較的元素
if($tmp < $arr[$j]) {
//發現插入的元素要小,交換位置
//將後邊的元素與前面的元素互換
$arr[$j+1] = $arr[$j];
//將前面的數設置爲 當前須要交換的數
$arr[$j] = $tmp;
} else {
//若是碰到不須要移動的元素
//因爲是已經排序好是數組,則前面的就不須要再次比較了。
break;
}
}
}
//將這個元素 插入到已經排序好的序列內。
//返回
return $arr;
}
快速排序
介紹:
快速排序是由東尼·霍爾所發展的一種排序算法。在平均情況下,排序 n 個項目要Ο(n log n)次比較。在最壞情況下則須要Ο(n2)次比較,但這種情況並不常見。事實上,快速排序一般明顯比其餘Ο(n log n) 算法更快,由於它的內部循環(inner loop)能夠在大部分的架構上頗有效率地被實現出來,且在大部分真實世界的數據,能夠決定設計的選擇,減小所需時間的二次方項之可能性。
步驟:
從數列中挑出一個元素,稱爲 「基準」(pivot),
從新排序數列,全部元素比基準值小的擺放在基準前面,全部元素比基準值大的擺在基準的後面(相同的數能夠到任一邊)。在這個分區退出以後,該基準就處於數列的中間位置。這個稱爲分區(partition)操做。
遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
具體代碼:
function quick_sort($arr) {
//判斷參數是不是一個數組
if(!is_array($arr)) return false;
//遞歸出口:數組長度爲1,直接返回數組
$length = count($arr);
if($length<=1) return $arr;
//數組元素有多個,則定義兩個空數組
$left = $right = array();
//使用for循環進行遍歷,把第一個元素當作比較的對象
for($i=1; $i<$length; $i++)
{
//判斷當前元素的大小
if($arr[$i]<$arr[0]){
$left[]=$arr[$i];
}else{
$right[]=$arr[$i];
}
}
//遞歸調用
$left=quick_sort($left);
$right=quick_sort($right);
//將全部的結果合併
return array_merge($left,array($arr[0]),$right);
}
參考:
1.3年PHPer的面試總結
2.八年phper的高級工程師面試之路
3.PHP四種基礎算法詳解