一 、PHP基礎(chǔ)部分
1、PHP語言的一大優(yōu)勢是跨平臺
Get與post兩種方式
區(qū)別:
(1)url可見性:get 方式url參數(shù)可見,post 不可見
(2)可緩存性:get 方式是可以緩存的,post 方式不可以緩存。
(3)傳輸數(shù)據(jù)大小:get一般傳輸數(shù)據(jù)大小不超過2k-4k(根據(jù)瀏覽器不同,限制不一樣,但相差不大);post 請求傳輸數(shù)據(jù)的大小根據(jù)php.ini 配置文件設(shè)定,也可以無限大。
(4)數(shù)據(jù)傳輸上:get 方式通過url地址欄拼接參數(shù)進行傳輸,post 方式通過body體進行傳輸。
3、AJAX的優(yōu)勢是什么?
ajax是異步傳輸技術(shù),可以通過javascript實現(xiàn),也可以通過JQuery框架實現(xiàn),實現(xiàn)局部刷新,減輕了服務器的壓力,也提高了用戶體驗。
4、安全對一套程序來說至關(guān)重要,請說說在開發(fā)中應該注意哪些安全機制?
(1)使用驗證碼防止注冊機灌水。
(2)使用預處理,綁定參數(shù),參數(shù)過濾轉(zhuǎn)義防止sql注入
(3)使用token防止遠程提交,使用token驗證登錄狀態(tài)。
5、在程序的開發(fā)中,如何提高程序的運行效率?
(1)優(yōu)化SQL語句,查詢語句中盡量不使用select *,用哪個字段查哪個字段;少用子查詢可用表連接代替;少用模糊查詢。
(2)數(shù)據(jù)表中創(chuàng)建索引。
(3)對程序中經(jīng)常用到的數(shù)據(jù)生成緩存(比如使用redis緩存數(shù)據(jù),比如使用ob進行動態(tài)頁面靜態(tài)化等等)。
(4)對mysql做主從復制,讀寫分離。(提高mysq執(zhí)行效率和查詢速度)
(5)使用nginx做負載均衡。(將訪問壓力平均分配到多態(tài)服務器)
6、現(xiàn)在編程中經(jīng)常采取MVC三層結(jié)構(gòu),請問MVC分別指哪三層,有什么優(yōu)點?
MVC三層分別指:業(yè)務模型、視圖、控制器,由控制器層調(diào)用模型處理數(shù)據(jù),然后將數(shù)據(jù)映射到視圖層進行顯示。
優(yōu)點是:
①可以實現(xiàn)代碼的重用性,避免產(chǎn)生代碼冗余;
②M和V的實現(xiàn)代碼分離,從而使同一個程序可以使用不同的表現(xiàn)形式
7、對json數(shù)據(jù)格式的理解?
JSON(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)交換格式,json數(shù)據(jù)格式固定,可以被多種語言用作數(shù)據(jù)的傳遞。
8、print、echo、print_r有什么區(qū)別?
(1) echo和print都可以做輸出,不同的是,echo不是函數(shù),沒有返回值,而print是一個函數(shù)有返回值,所以相對而言如果只是輸出echo會更快,而print_r通常用于打印變量的相關(guān)信息,通常在調(diào)試中使用。
(2) print 是打印字符串
(3)print_r 則是打印復合類型 如數(shù)組 對象
9、SESSION與COOKIE的區(qū)別?
(1)存儲位置:session存儲于服務器,cookie存儲于瀏覽器
(2)安全性:session安全性比cookie高
(3)session為‘會話服務’,在使用時需要開啟服務,cookie不需要開啟,可以直接用
10、PHP處理數(shù)組的常用函數(shù)?(重點看函數(shù)的‘參數(shù)’和‘返回值’)
(1)array() 創(chuàng)建數(shù)組
(2)in_array() 判斷元素是否在數(shù)組中
(3)count() 返回數(shù)組中元素的數(shù)目
(4)array_merge() 將多個數(shù)組合并成一個數(shù)組
(5)array_diff() 比較兩個或兩個以上數(shù)組的差異
(6)array_intersect() 獲取兩個或兩個數(shù)組以上的交集
(7)array_keys() 獲取數(shù)組的key列表
(8)array_values() 獲取數(shù)組的值列表
(9)array_unique() 刪除數(shù)組中的重復值
(10)array_push()將一個或多個元素插入數(shù)組的末尾(入棧)
(11)array_pop() 彈出并返回 array 數(shù)組的最后一個單元(出棧)
(12)array_walk() 使用用戶自定義函數(shù)對數(shù)組中的每個元素做回調(diào)處理
11、PHP處理字符串的常用函數(shù)?(重點看函數(shù)的‘參數(shù)’和‘返回值’)
(1)trim() 移除字符串兩側(cè)的空白字符和其他字符;
(2)strlen() 獲取字符串的長度
(3)mb_strlen() 獲取字符串長度(可指定字符編碼,對中文字符串計算長度)
(4)substr()返回字符串的一部分;
(5)str_replace() 子字符串替換
(6)str_repeat () 重復一個字符串
(7)is_string() 檢測變量是否是字符串;
(8)str_shuffle () 隨機打亂一個字符串
(9)sprintf() 返回根據(jù)格式化字符串生成的字符串(通常用于獲取分表后的數(shù)據(jù)表名)
(10)strstr() 查找字符串的首次出現(xiàn)
(11)addslashes 使用反斜線引用字符串
12、PHP處理時間的常用函數(shù)?(重點看函數(shù)的‘參數(shù)’和‘返回值’)
(1)date() 格式化一個本地時間/日期。
(2)getdate() 取得日期/時間信息。
(3)date_default_timezone_set() 設(shè)定默認時區(qū)。
(4)date_default_timezone_get() 返回默認時區(qū)。
(5)mktime() 返回一個日期的 Unix時間戳。
(6)strtotime() 將任何字符串的日期時間描述解析為 Unix 時間戳
(7)strftime() 根據(jù)區(qū)域設(shè)置格式化本地時間/日期
13、PHP操作文件的常用函數(shù)?(重點看函數(shù)的‘參數(shù)’和‘返回值’)
(1)打開文件 fopen()
(2)讀取文件 fgets() ; 注:file_get_contents()也是讀取文件
(3)寫入文件fwrite() ; 注:file_put_contents()同樣可以寫入文件
(4)關(guān)閉文件句柄 fclose()
(5)移動 / 重命名文件 rename()
(6)復制文件 copy()
(7)創(chuàng)建文件 vim 或 touch
(8)刪除文件 unlink()
(9)獲取文件上次訪問的時間 fileatime()
(10)獲取文件上次修改的時間 filemtime()
(11)獲取文件大小 filesize()
(12)獲取文件類型 filetype()
(13)獲取文件詳細信息 state()
(14)判斷是否是目錄 is_dir()
14、PHP操作目錄(文件夾)的常用函數(shù)?(重點看函數(shù)的‘參數(shù)’和‘返回值’)
(1)打開目錄 opendir()
(2)讀取目錄 readdir()
(3)刪除目錄 rmdir()
(4)關(guān)閉目錄句柄 closedir()
(5)創(chuàng)建目錄 mkdir()
(6)返回路徑中的目錄部分 dirname()
(7)取得當前工作目錄 getcwd()
(8)列出指定路徑中的文件和目錄 scandir()
二 、數(shù)據(jù)庫部分
什么是事務?及其特性?
事務:是一系列的數(shù)據(jù)庫操作,是數(shù)據(jù)庫應用的基本邏輯單位。
特性:
(1)原子性:即不可分割性,事務要么全部被執(zhí)行,要么就全部不被執(zhí)行。
(2)一致性或可串性。事務的執(zhí)行使得數(shù)據(jù)庫從一種正確狀態(tài)轉(zhuǎn)換成另一種正確狀態(tài)
(3)隔離性。在事務正確提交之前,不允許把該事務對數(shù)據(jù)的任何改變提供給任何其他事務,
(4) 持久性。事務正確提交后,其結(jié)果將永久保存在數(shù)據(jù)庫中,即使在事務提交后有了其他故障,事務的處理結(jié)果也會得到保存。
簡單理解:在事務里的操作,要么全部成功,要么全部失敗。
什么是鎖?
數(shù)據(jù)庫是一個多用戶使用的共享資源。當多個用戶并發(fā)地存取數(shù)據(jù)時,在數(shù)據(jù)庫中就會產(chǎn)生多個事務同時存取同一數(shù)據(jù)的情況。若對并發(fā)操作不加控制就可能會讀取和存儲不正確的數(shù)據(jù),破壞數(shù)據(jù)庫的一致性。
加鎖是實現(xiàn)數(shù)據(jù)庫并發(fā)控制的一個非常重要的技術(shù)。當事務在對某個數(shù)據(jù)對象進行操作前,先向系統(tǒng)發(fā)出請求,對其加鎖。加鎖后事務就對該數(shù)據(jù)對象有了一定的控制,在該事務釋放鎖之前,其他的事務不能對此數(shù)據(jù)對象進行更新操作。
基本鎖類型:鎖包括行級鎖和表級鎖
什么叫視圖?游標是什么?
視圖是一種虛擬的表,具有和物理表相同的功能。可以對視圖進行增,改,查,操作,視圖通常是有一個表或者多個表的行或列的子集。對視圖的修改不影響基本表。它使得我們獲取數(shù)據(jù)更容易,相比多表查詢。
游標:是對查詢出來的結(jié)果集作為一個單元來有效的處理。游標可以定在該單元中的特定行,從結(jié)果集的當前行檢索一行或多行??梢詫Y(jié)果集當前行做修改。一般不使用游標,但是需要逐條處理數(shù)據(jù)的時候,游標顯得十分重要。
什么是存儲過程?用什么來調(diào)用?
存儲過程是一個預編譯的SQL語句,優(yōu)點是允許模塊化的設(shè)計,就是說只需創(chuàng)建一次,以后在該程序中就可以調(diào)用多次。如果某次操作需要執(zhí)行多次SQL,使用存儲過程比單純SQL語句執(zhí)行要快。可以用一個命令對象來調(diào)用存儲過程。
索引的作用?和它的優(yōu)點缺點是什么?
索引就一種特殊的查詢表,數(shù)據(jù)庫的搜索引擎可以利用它加速對數(shù)據(jù)的檢索。它很類似與現(xiàn)實生活中書的目錄,不需要查詢整本書內(nèi)容就可以找到想要的數(shù)據(jù)。索引可以是唯一的,創(chuàng)建索引允許指定單個列或者是多個列。
缺點是它減慢了數(shù)據(jù)錄入的速度,同時也增加了數(shù)據(jù)庫的尺寸大小。
如何通俗地理解三個范式?
第一范式:1NF是對屬性的原子性約束,要求屬性具有原子性,不可再分解;
第二范式:2NF是對記錄的惟一性約束,要求記錄有惟一標識,即實體的惟一性;
第三范式:3NF是對字段冗余性的約束,即任何字段不能由其他字段派生出來,它要求字段沒有冗余。。
什么是基本表?什么是視圖?
基本表是本身獨立存在的表,在 SQL 中一個關(guān)系就對應一個表。
視圖是從一個或幾個基本表導出的表。視圖本身不獨立存儲在數(shù)據(jù)庫中,是一個虛表
試述視圖的優(yōu)點?
(1) 視圖能夠簡化用戶的操作
(2) 視圖使用戶能以多種角度看待同一數(shù)據(jù);
(3) 視圖為數(shù)據(jù)庫提供了一定程度的邏輯獨立性;
(4) 視圖能夠?qū)C密數(shù)據(jù)提供安全保護。
NULL是什么意思
NULL這個值表示UNKNOWN(未知):它不表示“”(空字符串)。
對NULL這個值的任何比較都會生產(chǎn)一個NULL值。
說說對SQL語句優(yōu)化有哪些方法?(選擇幾條)
(1)Where子句中:where表之間的連接必須寫在其他Where條件之前,那些可以過濾掉最大數(shù)量記錄的條件必須寫在Where子句的末尾.HAVING最后。
(2)用EXISTS替代IN、用NOT EXISTS替代NOT IN。
(3) 避免在索引列上使用計算
(4)避免在索引列上使用IS NULL和IS NOT NULL
(5)對查詢進行優(yōu)化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。
(6)應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描
(7)應盡量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描
SQL語句中‘相關(guān)子查詢’與‘非相關(guān)子查詢’有什么區(qū)別?
(1)非相關(guān)子查詢是獨立于外部查詢的子查詢,子查詢總共執(zhí)行一次,執(zhí)行完畢后將值傳遞給外部查詢。
(2)相關(guān)子查詢的執(zhí)行依賴于外部查詢的數(shù)據(jù),外部查詢執(zhí)行一行,子查詢就執(zhí)行一次。
因此非相關(guān)子查詢比相關(guān)子查詢效率高
char和varchar的區(qū)別?
char是一種固定長度的類型,varchar則是一種可變長度的類型。
區(qū)別:
char(M)類型的數(shù)據(jù)列里,每個值都占用M個字節(jié),如果某個長度小于M,MySQL就會在它的右邊用空格字符補足。(在檢索操作中那些填補出來的空格字符將被去掉)。
varchar(M)類型的數(shù)據(jù)列里,每個值只占用剛好夠用的字節(jié)再加上一個用來記錄其長度的字節(jié)(即總長度為L+1字節(jié))。
Mysql 的存儲引擎,myisam和innodb的區(qū)別。
MyISAM 是非事務的存儲引擎;適合用于頻繁查詢的應用;表鎖,不會出現(xiàn)死鎖;不支持事務。適合小數(shù)據(jù),小并發(fā)
innodb是支持事務的存儲引擎;適合于插入和更新操作比較多的應用;設(shè)計合理的話是行鎖(最大區(qū)別就在鎖的級別上);適合大數(shù)據(jù),大并發(fā)。
MyISAM:成熟、穩(wěn)定、易于管理,快速讀取。一些功能不支持(事務等),表級鎖。
InnoDB:支持事務、外鍵等特性、數(shù)據(jù)行鎖定。空間占用大,不支持全文索引等。
MySQL數(shù)據(jù)庫作發(fā)布系統(tǒng)的存儲,一天五萬條以上的增量,預計運維三年,怎么優(yōu)化?
(1)設(shè)計良好的數(shù)據(jù)庫結(jié)構(gòu),允許部分數(shù)據(jù)冗余,盡量避免join查詢,提高效率。
(2) 選擇合適的表字段數(shù)據(jù)類型和存儲引擎,適當?shù)奶砑铀饕?/p>
(3) 做mysql主從復制讀寫分離。
(4)對數(shù)據(jù)表進行分表,減少單表中的數(shù)據(jù)量提高查詢速度。
(5)添加緩存機制,比如redis,memcached等。
(6)對不經(jīng)常改動的頁面,生成靜態(tài)頁面(比如做ob緩存)。
(7)書寫高效率的SQL。比如 SELECT * FROM TABEL 改為 SELECT field_1, field_2, field_3 FROM TABLE.
對于大流量的網(wǎng)站,您采用什么樣的方法來解決各頁面訪問量統(tǒng)計問題?
(1) 確認服務器是否能支撐當前訪問量。
(2) 優(yōu)化數(shù)據(jù)庫訪問。
(3)禁止外部訪問鏈接(盜鏈), 比如圖片盜鏈。
(4)控制文件下載。
(5)做負載均衡,使用不同主機分流。
(6)使用瀏覽統(tǒng)計軟件,了解訪問量,有針對性的進行優(yōu)化。
三、 面向?qū)ο蟛糠?/p>
1、什么是面向?qū)ο?(理解著回答)
面向?qū)ο笫且环N思想,是基于面向過程而言的,就是說面向?qū)ο笫菍⒐δ艿韧ㄟ^對象來實現(xiàn),將功能封裝進對象之中,讓對象去實現(xiàn)具體的細節(jié)。
面向?qū)ο笥腥筇卣?/strong>:封裝性、繼承性、多態(tài)性。
現(xiàn)在純正的OO語言主要是 Java 和 C#,PHP、C++也支持OO,C是面向過程的。
3、堆和棧的區(qū)別?
棧是編譯期間就分配好的內(nèi)存空間,因此你的代碼中必須就棧的大小有明確的定義;
堆是程序運行期間動態(tài)分配的內(nèi)存空間,你可以根據(jù)程序的運行情況確定要分配的堆內(nèi)存的大小。
5、面向?qū)ο蟮奶卣?/strong>:
主要有封裝,繼承,多態(tài)
6、抽象類和接口的概念以及區(qū)別?
抽象類:它是一種特殊的,不能被實例化的類,只能作為其他類的父類使用。使用abstract關(guān)鍵字聲明。
接口:它是一種特殊的抽象類,也是一個特殊的類,使用interface聲明。
區(qū)別:
(1)抽象類的操作通過繼承關(guān)鍵字extends實現(xiàn),而接口的使用是通過implements關(guān)鍵字來實現(xiàn)。
(2)抽象類中有數(shù)據(jù)成員,可以實現(xiàn)數(shù)據(jù)的封裝,但是接口沒有數(shù)據(jù)成員。
(3)抽象類中可以有構(gòu)造方法,但是接口沒有構(gòu)造方法。
(4)抽象類的方法可以通過private、protected、public關(guān)鍵字修飾(抽象方法不能是private),而接口中的方法只能使用public關(guān)鍵字修飾。
(5)一個類只能繼承于一個抽象類,而一個類可以同時實現(xiàn)多個接口。
(6)抽象類中可以有成員方法的實現(xiàn)代碼,而接口中不可以有成員方法的實現(xiàn)代碼。
7、什么是構(gòu)造函數(shù),什么是析構(gòu)函數(shù),作用是什么?
構(gòu)造函數(shù)(方法)是對象創(chuàng)建完成后第一個被對象自動調(diào)用的方法。它存在于每個聲明的類中,是一個特殊的成員方法。作用是執(zhí)行一些初始化的任務。Php中使用__construct()聲明構(gòu)造方法,并且只能聲明一個。
析構(gòu)函數(shù)(方法)作用和構(gòu)造方法正好相反,是對象被銷毀之前最后一個被對象自動調(diào)用的方法。是PHP5中新添加的內(nèi)容作用是用于實現(xiàn)在銷毀一個對象之前執(zhí)行一些特定的操作,諸如關(guān)閉文件和釋放內(nèi)存等。
8、如何重載父類的方法,舉例說明
重載,即覆蓋父類的方法,也就是使用子類中的方法替換從父類中繼承的方法,也叫方法的重寫。
覆蓋父類方法的關(guān)鍵是在子類中創(chuàng)建于父類中相同的方法包括方法的名稱、參數(shù)和返回值類型。PHP中只要求方法的名稱相同即可。
9、常用的魔術(shù)方法有哪些?舉例說明
php規(guī)定以兩個下劃線(__)開頭的方法都保留為魔術(shù)方法,所以建議大家函數(shù)名最好不用__開頭,除非是為了重載已有的魔術(shù)方法。
__construct() 實例化類時自動調(diào)用。
__destruct() 類對象使用結(jié)束時自動調(diào)用。
__set() 在給未定義的屬性賦值的時候調(diào)用。
__get() 調(diào)用未定義的屬性時候調(diào)用。
__isset() 使用isset()或empty()函數(shù)時候會調(diào)用。
__unset() 使用unset()時候會調(diào)用。
__sleep() 使用serialize序列化時候調(diào)用。
__wakeup() 使用unserialize反序列化的時候調(diào)用。
__call() 調(diào)用一個不存在的方法的時候調(diào)用。
__callStatic()調(diào)用一個不存在的靜態(tài)方法是調(diào)用。
__toString() 把對象轉(zhuǎn)換成字符串的時候會調(diào)用。比如 echo。
__invoke() 當嘗試把對象當方法調(diào)用時調(diào)用。
__set_state() 當使用var_export()函數(shù)時候調(diào)用。接受一個數(shù)組參數(shù)。
__clone() 當使用clone復制一個對象時候調(diào)用。
10、$this和self、parent這三個關(guān)鍵詞分別代表什么?在哪些場合下使用?
$this 當前對象
self 當前類
parent 當前類的父類
$this在當前類中使用,使用->調(diào)用屬性和方法。
self也在當前類中使用,不過需要使用::調(diào)用。
parent在類中使用。
12、作用域操作符::如何使用?都在哪些場合下使用?
(1)調(diào)用類常量
(2)調(diào)用靜態(tài)方法(使用static修飾的類方法)
13、__autoload()方法的工作原理是什么?
使用這個魔術(shù)函數(shù)的基本條件是類文件的文件名要和類的名字保持一致。
當程序執(zhí)行到實例化某個類的時候,如果在實例化前沒有引入這個類文件,那么就自動執(zhí)行__autoload()函數(shù)。
這個函數(shù)會根據(jù)實例化的類的名稱來查找這個類文件的路徑,當判斷這個類文件路徑下確實存在這個類文件后
就執(zhí)行include或者require來載入該類,然后程序繼續(xù)執(zhí)行,如果這個路徑下不存在該文件時就提示錯誤。
使用自動載入的魔術(shù)函數(shù)可以不必要寫很多個include或者require函數(shù)。
4、如何進行SQL優(yōu)化?(關(guān)于后邊的解釋同學們可以進行理解,到時根據(jù)自己的理解把大體意思說出來即可)
(1)選擇正確的存儲引擎
MyISAM 適合于一些需要大量查詢的應用,
InnoDB 它會比 MyISAM 還慢。但是它支持“行鎖 ,于是在寫操作比較多的時候,會更優(yōu)秀。支持事務。
(3)為搜索字段添加索引
索引并不一定就是給主鍵或是唯一的字段。如果在你的表中,有某個字段你總要會經(jīng)常用來做搜索,那么最好是為其建立索引,
(4)避免使用Select 從數(shù)據(jù)庫里讀出越多的數(shù)據(jù),那么查詢就會變得越慢。并且,如果你的數(shù)據(jù)庫服務器和WEB服務器是兩臺獨立的服務器的話,這還會增加網(wǎng)絡傳輸?shù)呢撦d。即使你要查詢數(shù)據(jù)表的所有字段,也盡量不要用通配符,善用內(nèi)置提供的字段排除定義也許能給帶來更多的便利。
8、token的作用
安全機制驗證,用于微信服務器與PHP服務器之間的安全驗證
聯(lián)系客服