您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)PHP面試題有哪些,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
一 、PHP基礎(chǔ)部分
1、PHP語(yǔ)言的一大優(yōu)勢(shì)是跨平臺(tái),什么是跨平臺(tái)?
PHP的運(yùn)行環(huán)境最優(yōu)搭配為Apache+MySQL+PHP,此運(yùn)行環(huán)境可以在不同操作系統(tǒng)(例如windows、Linux等)上配置,不受操作系統(tǒng)的限制,所以叫跨平臺(tái)
2、WEB開(kāi)發(fā)中數(shù)據(jù)提交方式有幾種?有什么區(qū)別?百度使用哪種方式?
Get與post兩種方式
區(qū)別:
(1)url可見(jiàn)性:get 方式url參數(shù)可見(jiàn),post 不可見(jiàn)
(2)可緩存性:get 方式是可以緩存的,post 方式不可以緩存。
(3)傳輸數(shù)據(jù)大?。篻et一般傳輸數(shù)據(jù)大小不超過(guò)2k-4k(根據(jù)瀏覽器不同,限制不一樣,但相差不大);post 請(qǐng)求傳輸數(shù)據(jù)的大小根據(jù)php.ini 配置文件設(shè)定,也可以無(wú)限大。
(4)數(shù)據(jù)傳輸上:get 方式通過(guò)url地址欄拼接參數(shù)進(jìn)行傳輸,post 方式通過(guò)body體進(jìn)行傳輸。
建議:
1、get式安全性較Post式要差些包含機(jī)密信息建議用Post數(shù)據(jù)提交式;
2、做數(shù)據(jù)查詢(xún)建議用Get式;做數(shù)據(jù)添加、修改或刪除建議用Post方式;
百度使用的get方式,因?yàn)榭梢詮乃腢RL中看出
3、掌握PHP的哪些框架、模板引擎、系統(tǒng)等
框架:框架有很多,例如CI、Yii、Laravel等等,咱們學(xué)過(guò)的是thinkphp
模板引擎:也有很多,在課本中有,咱們學(xué)過(guò)的是smarty
系統(tǒng):有很多,例如:康盛的產(chǎn)品(uchome、supesite、discuzX等),帝國(guó)系統(tǒng)、DEDE(織夢(mèng))、ecshop等,咱們學(xué)過(guò)的是DEDECMS、Ecshop
4、說(shuō)一下你所掌握的網(wǎng)頁(yè)前端技術(shù)有哪些?
熟練掌握p+CSS網(wǎng)頁(yè)布局,JavaScript,jQuery框架、photoshop圖片處理
5、AJAX的優(yōu)勢(shì)是什么?
ajax是異步傳輸技術(shù),可以通過(guò)javascript實(shí)現(xiàn),也可以通過(guò)JQuery框架實(shí)現(xiàn),實(shí)現(xiàn)局部刷新,減輕了服務(wù)器的壓力,也提高了用戶(hù)體驗(yàn)。
6、安全對(duì)一套程序來(lái)說(shuō)至關(guān)重要,請(qǐng)說(shuō)說(shuō)在開(kāi)發(fā)中應(yīng)該注意哪些安全機(jī)制?
(1)使用驗(yàn)證碼防止注冊(cè)機(jī)灌水。
(2)使用預(yù)處理,綁定參數(shù),參數(shù)過(guò)濾轉(zhuǎn)義 防止sql注入
(3)使用token防止遠(yuǎn)程提交,使用token驗(yàn)證登錄狀態(tài)。
7、在程序的開(kāi)發(fā)中,如何提高程序的運(yùn)行效率?
(1)優(yōu)化SQL語(yǔ)句,查詢(xún)語(yǔ)句中盡量不使用select *,用哪個(gè)字段查哪個(gè)字段;少用子查詢(xún)可用表連接代替;少用模糊查詢(xún)。
(2)數(shù)據(jù)表中創(chuàng)建索引。
(3)對(duì)程序中經(jīng)常用到的數(shù)據(jù)生成緩存(比如使用redis緩存數(shù)據(jù),比如使用ob進(jìn)行動(dòng)態(tài)頁(yè)面靜態(tài)化等等)。
(4)對(duì)mysql做主從復(fù)制,讀寫(xiě)分離。(提高mysq執(zhí)行效率和查詢(xún)速度)
(5)使用nginx做負(fù)載均衡。(將訪問(wèn)壓力平均分配到多態(tài)服務(wù)器)
8、PHP可否與其它的數(shù)據(jù)庫(kù)搭配使用?
PHP與MYSQL數(shù)據(jù)庫(kù)是最優(yōu)搭配,當(dāng)然PHP也可以去其它的數(shù)據(jù)庫(kù)搭配使用,例如PostgreSql,SqlServer,Oracle,SqlLite等。
9、現(xiàn)在編程中經(jīng)常采取MVC三層結(jié)構(gòu),請(qǐng)問(wèn)MVC分別指哪三層,有什么優(yōu)點(diǎn)?
MVC三層分別指:業(yè)務(wù)模型、視圖、控制器,由控制器層調(diào)用模型處理數(shù)據(jù),然后將數(shù)據(jù)映射到視圖層進(jìn)行顯示。
優(yōu)點(diǎn)是:
①可以實(shí)現(xiàn)代碼的重用性,避免產(chǎn)生代碼冗余;
②M和V的實(shí)現(xiàn)代碼分離,從而使同一個(gè)程序可以使用不同的表現(xiàn)形式
10、對(duì)json數(shù)據(jù)格式的理解?
JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,json數(shù)據(jù)格式固定,可以被多種語(yǔ)言用作數(shù)據(jù)的傳遞。
PHP中處理json格式的函數(shù)為json_decode( string $json [, bool $assoc ] ) ,接受一個(gè) JSON格式的字符串并且把它轉(zhuǎn)換為PHP變量,參數(shù)json待解碼的json string格式的字符串。assoc當(dāng)該參數(shù)為T(mén)RUE時(shí),將返回array而非object;
Json_encode:將PHP變量轉(zhuǎn)換成json格式。
11、Print、echo、print_r有什么區(qū)別?
(1) echo和print都可以做輸出,不同的是,echo不是函數(shù),沒(méi)有返回值,而print是一個(gè)函數(shù)有返回值,所以相對(duì)而言如果只是輸出echo會(huì)更快,而print_r通常用于打印變量的相關(guān)信息,通常在調(diào)試中使用。
(2) print 是打印字符串
(3)print_r 則是打印復(fù)合類(lèi)型 如數(shù)組 對(duì)象
12、SESSION與COOKIE的區(qū)別?
(1)存儲(chǔ)位置:session存儲(chǔ)于服務(wù)器,cookie存儲(chǔ)于瀏覽器
(2)安全性:session安全性比cookie高
(3)session為‘會(huì)話(huà)服務(wù)’,在使用時(shí)需要開(kāi)啟服務(wù),cookie不需要開(kāi)啟,可以直接用
13、PHP處理數(shù)組的常用函數(shù)?(重點(diǎn)看函數(shù)的‘參數(shù)’和‘返回值’)
(1)array() 創(chuàng)建數(shù)組
(2)in_array() 判斷元素是否在數(shù)組中
(3)count() 返回?cái)?shù)組中元素的數(shù)目
(4)array_merge() 將多個(gè)數(shù)組合并成一個(gè)數(shù)組
(5)array_diff() 比較兩個(gè)或兩個(gè)以上數(shù)組的差異
(6)array_intersect() 獲取兩個(gè)或兩個(gè)數(shù)組以上的交集
(7)array_keys() 獲取數(shù)組的key列表
(8)array_values() 獲取數(shù)組的值列表
(9)array_unique() 刪除數(shù)組中的重復(fù)值
(10)array_push()將一個(gè)或多個(gè)元素插入數(shù)組的末尾(入棧)
(11)array_pop() 彈出并返回 array 數(shù)組的最后一個(gè)單元(出棧)
(12)array_walk() 使用用戶(hù)自定義函數(shù)對(duì)數(shù)組中的每個(gè)元素做回調(diào)處理
14、PHP處理字符串的常用函數(shù)?(重點(diǎn)看函數(shù)的‘參數(shù)’和‘返回值’)
(1)trim() 移除字符串兩側(cè)的空白字符和其他字符;
(2)strlen() 獲取字符串的長(zhǎng)度
(3)mb_strlen() 獲取字符串長(zhǎng)度(可指定字符編碼,對(duì)中文字符串計(jì)算長(zhǎng)度)
(4)substr()返回字符串的一部分;
(5)str_replace() 子字符串替換
(6)str_repeat () 重復(fù)一個(gè)字符串
(7)is_string() 檢測(cè)變量是否是字符串;
(8)str_shuffle () 隨機(jī)打亂一個(gè)字符串
(9)sprintf() 返回根據(jù)格式化字符串生成的字符串(通常用于獲取分表后的數(shù)據(jù)表名)
(10)strstr() 查找字符串的首次出現(xiàn)
(11)addslashes 使用反斜線引用字符串
15、PHP處理時(shí)間的常用函數(shù)?(重點(diǎn)看函數(shù)的‘參數(shù)’和‘返回值’)
(1)date() 格式化一個(gè)本地時(shí)間/日期。
(2)getdate() 取得日期/時(shí)間信息。
(3)date_default_timezone_set() 設(shè)定默認(rèn)時(shí)區(qū)。
(4)date_default_timezone_get() 返回默認(rèn)時(shí)區(qū)。
(5)mktime() 返回一個(gè)日期的 Unix時(shí)間戳。
(6)strtotime() 將任何字符串的日期時(shí)間描述解析為 Unix 時(shí)間戳
(7)strftime() 根據(jù)區(qū)域設(shè)置格式化本地時(shí)間/日期
16、PHP處理數(shù)據(jù)庫(kù)的常用函數(shù)?(重點(diǎn)看函數(shù)的‘參數(shù)’和‘返回值’)
請(qǐng)參照php手冊(cè),認(rèn)真查看,此項(xiàng)非常重要
17、PHP操作文件的常用函數(shù)?(重點(diǎn)看函數(shù)的‘參數(shù)’和‘返回值’)
(1)打開(kāi)文件 fopen()
(2)讀取文件 fgets() ; 注:file_get_contents()也是讀取文件
(3)寫(xiě)入文件fwrite() ; 注:file_put_contents()同樣可以寫(xiě)入文件
(4)關(guān)閉文件句柄 fclose()
(5)移動(dòng) / 重命名文件 rename()
(6)復(fù)制文件 copy()
(7)創(chuàng)建文件 vim 或 touch
(8)刪除文件 unlink()
(9)獲取文件上次訪問(wèn)的時(shí)間 fileatime()
(10)獲取文件上次修改的時(shí)間 filemtime()
(11)獲取文件大小 filesize()
(12)獲取文件類(lèi)型 filetype()
(13)獲取文件詳細(xì)信息 state()
(14)判斷是否是目錄 is_dir()
18、PHP操作目錄(文件夾)的常用函數(shù)?(重點(diǎn)看函數(shù)的‘參數(shù)’和‘返回值’)
(1)打開(kāi)目錄 opendir()
(2)讀取目錄 readdir()
(3)刪除目錄 rmdir()
(4)關(guān)閉目錄句柄 closedir()
(5)創(chuàng)建目錄 mkdir()
(6)返回路徑中的目錄部分 dirname()
(7)取得當(dāng)前工作目錄 getcwd()
(8)列出指定路徑中的文件和目錄 scandir()
二 、數(shù)據(jù)庫(kù)部分
1、常見(jiàn)的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)產(chǎn)品有?
答:Oracle、SQL Server、MySQL、Sybase、DB2、Access等。
2、SQL語(yǔ)言包括哪幾部分?每部分都有哪些操作關(guān)鍵字?
答:SQL語(yǔ)言包括數(shù)據(jù)定義(DDL)、數(shù)據(jù)操縱(DML),數(shù)據(jù)控制(DCL)和數(shù)據(jù)查詢(xún)(DQL)四個(gè)部分。
數(shù)據(jù)定義:Create Table,Alter Table,Drop Table, Craete/Drop Index等
數(shù)據(jù)操縱:Select ,insert,update,delete,
數(shù)據(jù)控制:grant,revoke
數(shù)據(jù)查詢(xún):select
3、完整性約束包括哪些?
數(shù)據(jù)完整性(Data Integrity)是指數(shù)據(jù)的精確(Accuracy) 和 可靠性(Reliability)。
包括:
(1)實(shí)體完整性:規(guī)定表的每一行在表中是惟一的實(shí)體。
(2)域完整性:是指表中的列必須滿(mǎn)足某種特定的數(shù)據(jù)類(lèi)型約束,其中約束又包括取值范圍、精度等規(guī)定。
(3)參照完整性:是指兩個(gè)表的主關(guān)鍵字和外關(guān)鍵字的數(shù)據(jù)應(yīng)一致,保證了表之間的數(shù)據(jù)的一致性,防止了數(shù)據(jù)丟失或無(wú)意義的數(shù)據(jù)在數(shù)據(jù)庫(kù)中擴(kuò)散。
(4) 用戶(hù)定義的完整性:不同的關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)根據(jù)其應(yīng)用環(huán)境的不同,往往還需要一些特殊的約束條件。用戶(hù)定義的完整性即是針對(duì)某個(gè)特定關(guān)系數(shù)據(jù)庫(kù)的約束條件,它反映某一具體應(yīng)用必須滿(mǎn)足的語(yǔ)義要求。
4、什么是事務(wù)?及其特性?
事務(wù):是一系列的數(shù)據(jù)庫(kù)操作,是數(shù)據(jù)庫(kù)應(yīng)用的基本邏輯單位。
特性:
(1)原子性:即不可分割性,事務(wù)要么全部被執(zhí)行,要么就全部不被執(zhí)行。
(2)一致性或可串性。事務(wù)的執(zhí)行使得數(shù)據(jù)庫(kù)從一種正確狀態(tài)轉(zhuǎn)換成另一種正確狀態(tài)
(3)隔離性。在事務(wù)正確提交之前,不允許把該事務(wù)對(duì)數(shù)據(jù)的任何改變提供給任何其他事務(wù),
(4) 持久性。事務(wù)正確提交后,其結(jié)果將永久保存在數(shù)據(jù)庫(kù)中,即使在事務(wù)提交后有了其他故障,事務(wù)的處理結(jié)果也會(huì)得到保存。
簡(jiǎn)單理解:在事務(wù)里的操作,要么全部成功,要么全部失敗。
5、什么是鎖?
數(shù)據(jù)庫(kù)是一個(gè)多用戶(hù)使用的共享資源。當(dāng)多個(gè)用戶(hù)并發(fā)地存取數(shù)據(jù)時(shí),在數(shù)據(jù)庫(kù)中就會(huì)產(chǎn)生多個(gè)事務(wù)同時(shí)存取同一數(shù)據(jù)的情況。若對(duì)并發(fā)操作不加控制就可能會(huì)讀取和存儲(chǔ)不正確的數(shù)據(jù),破壞數(shù)據(jù)庫(kù)的一致性。
加鎖是實(shí)現(xiàn)數(shù)據(jù)庫(kù)并發(fā)控制的一個(gè)非常重要的技術(shù)。當(dāng)事務(wù)在對(duì)某個(gè)數(shù)據(jù)對(duì)象進(jìn)行操作前,先向系統(tǒng)發(fā)出請(qǐng)求,對(duì)其加鎖。加鎖后事務(wù)就對(duì)該數(shù)據(jù)對(duì)象有了一定的控制,在該事務(wù)釋放鎖之前,其他的事務(wù)不能對(duì)此數(shù)據(jù)對(duì)象進(jìn)行更新操作。
基本鎖類(lèi)型:鎖包括行級(jí)鎖和表級(jí)鎖
6、什么叫視圖?游標(biāo)是什么?
視圖是一種虛擬的表,具有和物理表相同的功能??梢詫?duì)視圖進(jìn)行增,改,查,操作,視圖通常是有一個(gè)表或者多個(gè)表的行或列的子集。對(duì)視圖的修改不影響基本表。它使得我們獲取數(shù)據(jù)更容易,相比多表查詢(xún)。
游標(biāo):是對(duì)查詢(xún)出來(lái)的結(jié)果集作為一個(gè)單元來(lái)有效的處理。游標(biāo)可以定在該單元中的特定行,從結(jié)果集的當(dāng)前行檢索一行或多行??梢詫?duì)結(jié)果集當(dāng)前行做修改。一般不使用游標(biāo),但是需要逐條處理數(shù)據(jù)的時(shí)候,游標(biāo)顯得十分重要。
7、什么是存儲(chǔ)過(guò)程?用什么來(lái)調(diào)用?
存儲(chǔ)過(guò)程是一個(gè)預(yù)編譯的SQL語(yǔ)句,優(yōu)點(diǎn)是允許模塊化的設(shè)計(jì),就是說(shuō)只需創(chuàng)建一次,以后在該程序中就可以調(diào)用多次。如果某次操作需要執(zhí)行多次SQL,使用存儲(chǔ)過(guò)程比單純SQL語(yǔ)句執(zhí)行要快??梢杂靡粋€(gè)命令對(duì)象來(lái)調(diào)用存儲(chǔ)過(guò)程。
8、索引的作用?和它的優(yōu)點(diǎn)缺點(diǎn)是什么?
索引就一種特殊的查詢(xún)表,數(shù)據(jù)庫(kù)的搜索引擎可以利用它加速對(duì)數(shù)據(jù)的檢索。它很類(lèi)似與現(xiàn)實(shí)生活中書(shū)的目錄,不需要查詢(xún)整本書(shū)內(nèi)容就可以找到想要的數(shù)據(jù)。索引可以是唯一的,創(chuàng)建索引允許指定單個(gè)列或者是多個(gè)列。
缺點(diǎn)是它減慢了數(shù)據(jù)錄入的速度,同時(shí)也增加了數(shù)據(jù)庫(kù)的尺寸大小。
如何通俗地理解三個(gè)范式?
第一范式:1NF是對(duì)屬性的原子性約束,要求屬性具有原子性,不可再分解;
第二范式:2NF是對(duì)記錄的惟一性約束,要求記錄有惟一標(biāo)識(shí),即實(shí)體的惟一性;
第三范式:3NF是對(duì)字段冗余性的約束,即任何字段不能由其他字段派生出來(lái),它要求字段沒(méi)有冗余。。
什么是基本表?什么是視圖?
基本表是本身獨(dú)立存在的表,在 SQL 中一個(gè)關(guān)系就對(duì)應(yīng)一個(gè)表。
視圖是從一個(gè)或幾個(gè)基本表導(dǎo)出的表。視圖本身不獨(dú)立存儲(chǔ)在數(shù)據(jù)庫(kù)中,是一個(gè)虛表
試述視圖的優(yōu)點(diǎn)?
(1) 視圖能夠簡(jiǎn)化用戶(hù)的操作
(2) 視圖使用戶(hù)能以多種角度看待同一數(shù)據(jù);
(3) 視圖為數(shù)據(jù)庫(kù)提供了一定程度的邏輯獨(dú)立性;
(4) 視圖能夠?qū)C(jī)密數(shù)據(jù)提供安全保護(hù)。
NULL是什么意思
NULL這個(gè)值表示UNKNOWN(未知):它不表示“”(空字符串)。
對(duì)NULL這個(gè)值的任何比較都會(huì)生產(chǎn)一個(gè)NULL值。
您不能把任何值與一個(gè) NULL值進(jìn)行比較,并在邏輯上希望獲得一個(gè)答案。
使用IS NULL來(lái)進(jìn)行NULL判斷
主鍵、外鍵和索引的區(qū)別?
主鍵、外鍵和索引的區(qū)別
定義:
主鍵–唯一標(biāo)識(shí)一條記錄,不能有重復(fù)的,不允許為空
外鍵–表的外鍵是另一表的主鍵, 外鍵可以有重復(fù)的, 可以是空值
索引–該字段沒(méi)有重復(fù)值,但可以有一個(gè)空值
作用:
主鍵–用來(lái)保證數(shù)據(jù)完整性
外鍵–用來(lái)和其他表建立聯(lián)系用的
索引–是提高查詢(xún)排序的速度
個(gè)數(shù):
主鍵–主鍵只能有一個(gè)
外鍵–一個(gè)表可以有多個(gè)外鍵
索引–一個(gè)表可以有多個(gè)唯一索引
你可以用什么來(lái)確保表格里的字段只接受特定范圍里的值?
Check限制,它在數(shù)據(jù)庫(kù)表格里被定義,用來(lái)限制輸入該列的值。
說(shuō)說(shuō)對(duì)SQL語(yǔ)句優(yōu)化有哪些方法?(選擇幾條)
(1)Where子句中:where表之間的連接必須寫(xiě)在其他Where條件之前,那些可以過(guò)濾掉最大數(shù)量記錄的條件必須寫(xiě)在Where子句的末尾.HAVING最后。
(2)用EXISTS替代IN、用NOT EXISTS替代NOT IN。
(3) 避免在索引列上使用計(jì)算
(4)避免在索引列上使用IS NULL和IS NOT NULL
(5)對(duì)查詢(xún)進(jìn)行優(yōu)化,應(yīng)盡量避免全表掃描,首先應(yīng)考慮在 where 及 order by 涉及的列上建立索引。
(6)應(yīng)盡量避免在 where 子句中對(duì)字段進(jìn)行 null 值判斷,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描
(7)應(yīng)盡量避免在 where 子句中對(duì)字段進(jìn)行表達(dá)式操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描
SQL語(yǔ)句中‘相關(guān)子查詢(xún)’與‘非相關(guān)子查詢(xún)’有什么區(qū)別?
(1)非相關(guān)子查詢(xún)是獨(dú)立于外部查詢(xún)的子查詢(xún),子查詢(xún)總共執(zhí)行一次,執(zhí)行完畢后將值傳遞給外部查詢(xún)。
(2)相關(guān)子查詢(xún)的執(zhí)行依賴(lài)于外部查詢(xún)的數(shù)據(jù),外部查詢(xún)執(zhí)行一行,子查詢(xún)就執(zhí)行一次。
因此非相關(guān)子查詢(xún)比相關(guān)子查詢(xún)效率高
char和varchar的區(qū)別?
char是一種固定長(zhǎng)度的類(lèi)型,varchar則是一種可變長(zhǎng)度的類(lèi)型。
區(qū)別:
char(M)類(lèi)型的數(shù)據(jù)列里,每個(gè)值都占用M個(gè)字節(jié),如果某個(gè)長(zhǎng)度小于M,MySQL就會(huì)在它的右邊用空格字符補(bǔ)足。(在檢索操作中那些填補(bǔ)出來(lái)的空格字符將被去掉)。
varchar(M)類(lèi)型的數(shù)據(jù)列里,每個(gè)值只占用剛好夠用的字節(jié)再加上一個(gè)用來(lái)記錄其長(zhǎng)度的字節(jié)(即總長(zhǎng)度為L(zhǎng)+1字節(jié))。
Mysql 的存儲(chǔ)引擎,myisam和innodb的區(qū)別。
MyISAM 是非事務(wù)的存儲(chǔ)引擎;適合用于頻繁查詢(xún)的應(yīng)用;表鎖,不會(huì)出現(xiàn)死鎖;不支持事務(wù)。適合小數(shù)據(jù),小并發(fā)
innodb是支持事務(wù)的存儲(chǔ)引擎;適合于插入和更新操作比較多的應(yīng)用;設(shè)計(jì)合理的話(huà)是行鎖(最大區(qū)別就在鎖的級(jí)別上);適合大數(shù)據(jù),大并發(fā)。
數(shù)據(jù)表類(lèi)型有哪些
MyISAM、InnoDB、HEAP、BOB,ARCHIVE,CSV等。
MyISAM:成熟、穩(wěn)定、易于管理,快速讀取。一些功能不支持(事務(wù)等),表級(jí)鎖。
InnoDB:支持事務(wù)、外鍵等特性、數(shù)據(jù)行鎖定。空間占用大,不支持全文索引等。
MySQL數(shù)據(jù)庫(kù)作發(fā)布系統(tǒng)的存儲(chǔ),一天五萬(wàn)條以上的增量,預(yù)計(jì)運(yùn)維三年,怎么優(yōu)化?
(1)設(shè)計(jì)良好的數(shù)據(jù)庫(kù)結(jié)構(gòu),允許部分?jǐn)?shù)據(jù)冗余,盡量避免join查詢(xún),提高效率。
(2) 選擇合適的表字段數(shù)據(jù)類(lèi)型和存儲(chǔ)引擎,適當(dāng)?shù)奶砑铀饕?/p>
(3) 做mysql主從復(fù)制讀寫(xiě)分離。
(4)對(duì)數(shù)據(jù)表進(jìn)行分表,減少單表中的數(shù)據(jù)量提高查詢(xún)速度。
(5)添加緩存機(jī)制,比如redis,memcached等。
(6)對(duì)不經(jīng)常改動(dòng)的頁(yè)面,生成靜態(tài)頁(yè)面(比如做ob緩存)。
(7)書(shū)寫(xiě)高效率的SQL。比如 SELECT * FROM TABEL 改為 SELECT field_1, field_2, field_3 FROM TABLE.
對(duì)于大流量的網(wǎng)站,您采用什么樣的方法來(lái)解決各頁(yè)面訪問(wèn)量統(tǒng)計(jì)問(wèn)題?
(1) 確認(rèn)服務(wù)器是否能支撐當(dāng)前訪問(wèn)量。
(2) 優(yōu)化數(shù)據(jù)庫(kù)訪問(wèn)。
(3)禁止外部訪問(wèn)鏈接(盜鏈), 比如圖片盜鏈。
(4)控制文件下載。
(5)做負(fù)載均衡,使用不同主機(jī)分流。
(6)使用瀏覽統(tǒng)計(jì)軟件,了解訪問(wèn)量,有針對(duì)性的進(jìn)行優(yōu)化。
三、 面向?qū)ο蟛糠?/strong>
1、什么是面向?qū)ο?(理解著回答)
面向?qū)ο笫且环N思想,是基于面向過(guò)程而言的,就是說(shuō)面向?qū)ο笫菍⒐δ艿韧ㄟ^(guò)對(duì)象來(lái)實(shí)現(xiàn),將功能封裝進(jìn)對(duì)象之中,讓對(duì)象去實(shí)現(xiàn)具體的細(xì)節(jié)。
面向?qū)ο笥腥筇卣鳎悍庋b性、繼承性、多態(tài)性。
現(xiàn)在純正的OO語(yǔ)言主要是 Java 和 C#,PHP、C++也支持OO,C是面向過(guò)程的。
2、簡(jiǎn)述 private、 protected、 public修飾符的訪問(wèn)權(quán)限。
private : 私有成員, 在類(lèi)的內(nèi)部才可以訪問(wèn)。
protected : 保護(hù)成員,該類(lèi)內(nèi)部和繼承類(lèi)中可以訪問(wèn)。
public : 公共成員,完全公開(kāi),沒(méi)有訪問(wèn)限制。
3、堆和棧的區(qū)別?
棧是編譯期間就分配好的內(nèi)存空間,因此你的代碼中必須就棧的大小有明確的定義;
堆是程序運(yùn)行期間動(dòng)態(tài)分配的內(nèi)存空間,你可以根據(jù)程序的運(yùn)行情況確定要分配的堆內(nèi)存的大小。
4、XML 與 HTML 的主要區(qū)別
語(yǔ)法要求不同:
(1)在html中不區(qū)分大小寫(xiě),在xml中嚴(yán)格區(qū)分。
(2)在HTML中,有時(shí)不嚴(yán)格,如果上下文清楚地顯示出段落或者列表鍵在何處結(jié)尾,那么你可以省略
或者之類(lèi)的結(jié)束標(biāo)記。在XML中,是嚴(yán)格的樹(shù)狀結(jié)構(gòu),絕對(duì)不能省略掉結(jié)束標(biāo)記。
(3) 在XML中,擁有單個(gè)標(biāo)記而沒(méi)有匹配的結(jié)束標(biāo)記的元素必須用一個(gè)/ 字符作為結(jié)尾。這樣分析器就知道不用查找結(jié)束標(biāo)記了。
(4)在XML中,屬性值必須分裝在引號(hào)中。在HTML中,引號(hào)是可用可不用的。
(5)在HTML中,可以擁有不帶值的屬性名。在XML中,所有的屬性都必須帶有相應(yīng)的值。
(6) 在XML文檔中,空白部分不會(huì)被解析器自動(dòng)刪除;但是html是過(guò)濾掉空格的。
標(biāo)記不同:
(1)html使用固有的標(biāo)記;而xml沒(méi)有固有的標(biāo)記。
(2)Html標(biāo)簽是預(yù)定義的;XML標(biāo)簽是免費(fèi)的、自定義的、可擴(kuò)展的。
作用不同:
(1)html是用來(lái)顯示數(shù)據(jù)的;xml是用來(lái)描述數(shù)據(jù)、存放數(shù)據(jù)的,所以可以作為持久化的介質(zhì)!Html將數(shù)據(jù)和顯示結(jié)合在一起,在頁(yè)面中把這數(shù)據(jù)顯示出來(lái);xml則將數(shù)據(jù)和顯示分開(kāi)。 XML被設(shè)計(jì)用來(lái)描述數(shù)據(jù),其焦點(diǎn)是數(shù)據(jù)的內(nèi)容。HTML被設(shè)計(jì)用來(lái)顯示數(shù)據(jù),其焦點(diǎn)是數(shù)據(jù)的外觀。
(2)xml不是HTML的替代品,xml和html是兩種不同用途的語(yǔ)言。 XML 不是要替換 HTML;實(shí)際上XML 可以視作對(duì) HTML 的補(bǔ)充。XML 和HTML 的目標(biāo)不同HTML 的設(shè)計(jì)目標(biāo)是顯示數(shù)據(jù)并集中于數(shù)據(jù)外觀,而XML的設(shè)計(jì)目標(biāo)是描述數(shù)據(jù)并集中于數(shù)據(jù)的內(nèi)容。
(3)對(duì)于XML最好的形容可能是: XML是一種跨平臺(tái)的,與軟、硬件無(wú)關(guān)的,處理與傳輸信息的工具。
(4)XML未來(lái)將會(huì)無(wú)所不在。XML將成為最普遍的數(shù)據(jù)處理和數(shù)據(jù)傳輸?shù)墓ぞ摺?/p>
5、面向?qū)ο蟮奶卣饔心男┓矫?
主要有封裝,繼承,多態(tài)。如果是4個(gè)方面則加上:抽象。
封裝:
封裝是保證軟件部件具有優(yōu)良的模塊性的基礎(chǔ),封裝的目標(biāo)就是要實(shí)現(xiàn)軟件部件的高內(nèi)聚,低耦合,防止程序相互依賴(lài)性而帶來(lái)的變動(dòng)影響.
繼承:
在定義和實(shí)現(xiàn)一個(gè)類(lèi)的時(shí)候,可以在一個(gè)已經(jīng)存在的類(lèi)的基礎(chǔ)之上來(lái)進(jìn)行,把這個(gè)已經(jīng)存在的類(lèi)所定義的內(nèi)容作為自己的內(nèi)容,并可以加入若干新的內(nèi)容,或修改原來(lái)的方法使之更適合特殊的需要,這就是繼承。繼承是子類(lèi)自動(dòng)共享父類(lèi)數(shù)據(jù)和方法的機(jī)制,這是類(lèi)之間的一種關(guān)系,提高了軟件的可重用性和可擴(kuò)展性。
多態(tài):
多態(tài)是指程序中定義的引用變量所指向的具體類(lèi)型和通過(guò)該引用變量發(fā)出的方法調(diào)用在編程時(shí)并不確定,而是在程序運(yùn)行期間才確定,即一個(gè)引用變量倒底會(huì)指向哪個(gè)類(lèi)的實(shí)例對(duì)象,該引用變量發(fā)出的方法調(diào)用到底是哪個(gè)類(lèi)中實(shí)現(xiàn)的方法,必須在由程序運(yùn)行期間才能決定。
抽象:
抽象就是找出一些事物的相似和共性之處,然后將這些事物歸為一個(gè)類(lèi),這個(gè)類(lèi)只考慮這些事物的相似和共性之處,并且會(huì)忽略與當(dāng)前主題和目標(biāo)無(wú)關(guān)的那些方面,將注意力集中在與當(dāng)前目標(biāo)有關(guān)的方面。例如,看到一只螞蟻和大象,你能夠想象出它們的相同之處,那就是抽象。
6、抽象類(lèi)和接口的概念以及區(qū)別?
抽象類(lèi):它是一種特殊的,不能被實(shí)例化的類(lèi),只能作為其他類(lèi)的父類(lèi)使用。使用abstract關(guān)鍵字聲明。
接口:它是一種特殊的抽象類(lèi),也是一個(gè)特殊的類(lèi),使用interface聲明。
區(qū)別:
(1)抽象類(lèi)的操作通過(guò)繼承關(guān)鍵字extends實(shí)現(xiàn),而接口的使用是通過(guò)implements關(guān)鍵字來(lái)實(shí)現(xiàn)。
(2)抽象類(lèi)中有數(shù)據(jù)成員,可以實(shí)現(xiàn)數(shù)據(jù)的封裝,但是接口沒(méi)有數(shù)據(jù)成員。
(3)抽象類(lèi)中可以有構(gòu)造方法,但是接口沒(méi)有構(gòu)造方法。
(4)抽象類(lèi)的方法可以通過(guò)private、protected、public關(guān)鍵字修飾(抽象方法不能是private),而接口中的方法只能使用public關(guān)鍵字修飾。
(5)一個(gè)類(lèi)只能繼承于一個(gè)抽象類(lèi),而一個(gè)類(lèi)可以同時(shí)實(shí)現(xiàn)多個(gè)接口。
(6)抽象類(lèi)中可以有成員方法的實(shí)現(xiàn)代碼,而接口中不可以有成員方法的實(shí)現(xiàn)代碼。
7、什么是構(gòu)造函數(shù),什么是析構(gòu)函數(shù),作用是什么?
構(gòu)造函數(shù)(方法)是對(duì)象創(chuàng)建完成后第一個(gè)被對(duì)象自動(dòng)調(diào)用的方法。它存在于每個(gè)聲明的類(lèi)中,是一個(gè)特殊的成員方法。作用是執(zhí)行一些初始化的任務(wù)。Php中使用__construct()聲明構(gòu)造方法,并且只能聲明一個(gè)。
析構(gòu)函數(shù)(方法)作用和構(gòu)造方法正好相反,是對(duì)象被銷(xiāo)毀之前最后一個(gè)被對(duì)象自動(dòng)調(diào)用的方法。是PHP5中新添加的內(nèi)容作用是用于實(shí)現(xiàn)在銷(xiāo)毀一個(gè)對(duì)象之前執(zhí)行一些特定的操作,諸如關(guān)閉文件和釋放內(nèi)存等。
8、如何重載父類(lèi)的方法,舉例說(shuō)明
重載,即覆蓋父類(lèi)的方法,也就是使用子類(lèi)中的方法替換從父類(lèi)中繼承的方法,也叫方法的重寫(xiě)。
覆蓋父類(lèi)方法的關(guān)鍵是在子類(lèi)中創(chuàng)建于父類(lèi)中相同的方法包括方法的名稱(chēng)、參數(shù)和返回值類(lèi)型。PHP中只要求方法的名稱(chēng)相同即可。
9、常用的魔術(shù)方法有哪些?舉例說(shuō)明
php規(guī)定以?xún)蓚€(gè)下劃線(__)開(kāi)頭的方法都保留為魔術(shù)方法,所以建議大家函數(shù)名最好不用__開(kāi)頭,除非是為了重載已有的魔術(shù)方法。
__construct() 實(shí)例化類(lèi)時(shí)自動(dòng)調(diào)用。
__destruct() 類(lèi)對(duì)象使用結(jié)束時(shí)自動(dòng)調(diào)用。
__set() 在給未定義的屬性賦值的時(shí)候調(diào)用。
__get() 調(diào)用未定義的屬性時(shí)候調(diào)用。
__isset() 使用isset()或empty()函數(shù)時(shí)候會(huì)調(diào)用。
__unset() 使用unset()時(shí)候會(huì)調(diào)用。
__sleep() 使用serialize序列化時(shí)候調(diào)用。
__wakeup() 使用unserialize反序列化的時(shí)候調(diào)用。
__call() 調(diào)用一個(gè)不存在的方法的時(shí)候調(diào)用。
__callStatic()調(diào)用一個(gè)不存在的靜態(tài)方法是調(diào)用。
__toString() 把對(duì)象轉(zhuǎn)換成字符串的時(shí)候會(huì)調(diào)用。比如 echo。
__invoke() 當(dāng)嘗試把對(duì)象當(dāng)方法調(diào)用時(shí)調(diào)用。
__set_state() 當(dāng)使用var_export()函數(shù)時(shí)候調(diào)用。接受一個(gè)數(shù)組參數(shù)。
__clone() 當(dāng)使用clone復(fù)制一個(gè)對(duì)象時(shí)候調(diào)用。
10、$this和self、parent這三個(gè)關(guān)鍵詞分別代表什么?在哪些場(chǎng)合下使用?
$this 當(dāng)前對(duì)象
self 當(dāng)前類(lèi)
parent 當(dāng)前類(lèi)的父類(lèi)
$this在當(dāng)前類(lèi)中使用,使用->調(diào)用屬性和方法。
self也在當(dāng)前類(lèi)中使用,不過(guò)需要使用::調(diào)用。
parent在類(lèi)中使用。
11、類(lèi)中如何定義常量、如何類(lèi)中調(diào)用常量、如何在類(lèi)外調(diào)用常量。
類(lèi)中的常量也就是成員常量,常量就是不會(huì)改變的量,是一個(gè)恒值。
定義常量使用關(guān)鍵字const.
例如:const PI = 3.1415326;
無(wú)論是類(lèi)內(nèi)還是類(lèi)外,常量的訪問(wèn)和變量是不一樣的,常量不需要實(shí)例化對(duì)象,
訪問(wèn)常量的格式都是類(lèi)名加作用域操作符號(hào)(雙冒號(hào))來(lái)調(diào)用。
即:類(lèi)名 :: 類(lèi)常量名;
12、作用域操作符::如何使用?都在哪些場(chǎng)合下使用?
(1)調(diào)用類(lèi)常量
(2)調(diào)用靜態(tài)方法(使用static修飾的類(lèi)方法)
13、__autoload()方法的工作原理是什么?
使用這個(gè)魔術(shù)函數(shù)的基本條件是類(lèi)文件的文件名要和類(lèi)的名字保持一致。
當(dāng)程序執(zhí)行到實(shí)例化某個(gè)類(lèi)的時(shí)候,如果在實(shí)例化前沒(méi)有引入這個(gè)類(lèi)文件,那么就自動(dòng)執(zhí)行__autoload()函數(shù)。
這個(gè)函數(shù)會(huì)根據(jù)實(shí)例化的類(lèi)的名稱(chēng)來(lái)查找這個(gè)類(lèi)文件的路徑,當(dāng)判斷這個(gè)類(lèi)文件路徑下確實(shí)存在這個(gè)類(lèi)文件后
就執(zhí)行include或者require來(lái)載入該類(lèi),然后程序繼續(xù)執(zhí)行,如果這個(gè)路徑下不存在該文件時(shí)就提示錯(cuò)誤。
使用自動(dòng)載入的魔術(shù)函數(shù)可以不必要寫(xiě)很多個(gè)include或者require函數(shù)。
四、THINKPHP部分
1、常見(jiàn)的PHP框架
答:thinkPHP、laravel、yii、ci 等。
2、如何理解TP中的單一入口文件?
ThinkPHP采用單一入口模式進(jìn)行項(xiàng)目部署和訪問(wèn),無(wú)論完成什么功能,一個(gè)項(xiàng)目都有一個(gè)統(tǒng)一(但不一定是唯一)的入口。應(yīng)該說(shuō),所有項(xiàng)目都是從入口文件開(kāi)始的,并且所有的項(xiàng)目的入口文件是類(lèi)似的。
入口文件中主要包括:
(1)定義框架路徑、項(xiàng)目路徑和項(xiàng)目名稱(chēng)(可選)
(2)定義調(diào)試模式和運(yùn)行模式的相關(guān)常量(可選)
(3)載入框架入口文件(必須)
3、ThinkPHP中的MVC分層是什么?(理解)
MVC 是一種將應(yīng)用程序的邏輯層和表現(xiàn)層進(jìn)行分離的方法。ThinkPHP 也是基于MVC設(shè)計(jì)模式的。MVC只是一個(gè)抽象的概念,并沒(méi)有特別明確的規(guī)定,ThinkPHP中的MVC分層大致體現(xiàn)在:
模型(M):模型的定義由Model類(lèi)來(lái)完成。
控制器(C):應(yīng)用控制器(核心控制器App類(lèi))和Action控制器都承擔(dān)了控制器的角色,Action控制器完成業(yè)務(wù)過(guò)程控制,而應(yīng)用控制器負(fù)責(zé)調(diào)度控制。
視圖(V):由View類(lèi)和模板文件組成,模板做到了100%分離,可以獨(dú)立預(yù)覽和制作。
但實(shí)際上,ThinkPHP并不依賴(lài)M或者V ,也就是說(shuō)沒(méi)有模型或者視圖也一樣可以工作。甚至也不依賴(lài)C,這是因?yàn)門(mén)hinkPHP在Action之上還有一個(gè)總控制器,即App控制器,負(fù)責(zé)應(yīng)用的總調(diào)度。在沒(méi)有C的情況下,必然存在視圖V,否則就不再是一個(gè)完整的應(yīng)用。
總而言之,ThinkPHP的MVC模式只是提供了一種敏捷開(kāi)發(fā)的手段,而不是拘泥于MVC本身。
4、如何進(jìn)行SQL優(yōu)化?(關(guān)于后邊的解釋同學(xué)們可以進(jìn)行理解,到時(shí)根據(jù)自己的理解把大體意思說(shuō)出來(lái)即可)
(1)選擇正確的存儲(chǔ)引擎
MyISAM 適合于一些需要大量查詢(xún)的應(yīng)用,但其對(duì)于有大量寫(xiě)操作并不是很好。甚至你只是需要update一個(gè)字段,整個(gè)表都會(huì)被鎖起來(lái),而別的進(jìn)程,就算是讀進(jìn)程都無(wú)法操作直到讀操作完成。另外,MyISAM 對(duì)于 SELECT COUNT(*) 這類(lèi)的計(jì)算是超快無(wú)比的。
InnoDB 的趨勢(shì)會(huì)是一個(gè)非常復(fù)雜的存儲(chǔ)引擎,對(duì)于一些小的應(yīng)用,它會(huì)比 MyISAM 還慢。但是它支持“行鎖” ,于是在寫(xiě)操作比較多的時(shí)候,會(huì)更優(yōu)秀。并且,他還支持更多的高級(jí)應(yīng)用,比如:事務(wù)。
(2)優(yōu)化字段的數(shù)據(jù)類(lèi)型
記住一個(gè)原則,越小的列會(huì)越快。如果一個(gè)表只會(huì)有幾列罷了(比如說(shuō)字典表,配置表),那么,我們就沒(méi)有理由使用 INT 來(lái)做主鍵,使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 會(huì)更經(jīng)濟(jì)一些。如果你不需要記錄時(shí)間,使用 DATE 要比 DATETIME 好得多。當(dāng)然,你也需要留夠足夠的擴(kuò)展空間。
(3)為搜索字段添加索引
索引并不一定就是給主鍵或是唯一的字段。如果在你的表中,有某個(gè)字段你總要會(huì)經(jīng)常用來(lái)做搜索,那么最好是為其建立索引,除非你要搜索的字段是大的文本字段,那應(yīng)該建立全文索引。
(4)避免使用Select 從數(shù)據(jù)庫(kù)里讀出越多的數(shù)據(jù),那么查詢(xún)就會(huì)變得越慢。并且,如果你的數(shù)據(jù)庫(kù)服務(wù)器和WEB服務(wù)器是兩臺(tái)獨(dú)立的服務(wù)器的話(huà),這還會(huì)增加網(wǎng)絡(luò)傳輸?shù)呢?fù)載。即使你要查詢(xún)數(shù)據(jù)表的所有字段,也盡量不要用通配符,善用內(nèi)置提供的字段排除定義也許能給帶來(lái)更多的便利。
(5)使用 ENUM 而不是 VARCHAR
ENUM 類(lèi)型是非??旌途o湊的。在實(shí)際上,其保存的是 TINYINT,但其外表上顯示為字符串。這樣一來(lái),用這個(gè)字段來(lái)做一些選項(xiàng)列表變得相當(dāng)?shù)耐昝馈@?,性別、民族、部門(mén)和狀態(tài)之類(lèi)的這些字段的取值是有限而且固定的,那么,你應(yīng)該使用 ENUM 而不是 VARCHAR。
(6)盡可能的使用 NOT NULL
除非你有一個(gè)很特別的原因去使用 NULL 值,你應(yīng)該總是讓你的字段保持 NOT NULL。 NULL其實(shí)需要額外的空間,并且,在你進(jìn)行比較的時(shí)候,你的程序會(huì)更復(fù)雜。 當(dāng)然,這里并不是說(shuō)你就不能使用NULL了,現(xiàn)實(shí)情況是很復(fù)雜的,依然會(huì)有些情況下,你需要使用NULL值。
(7)固定長(zhǎng)度的表會(huì)更快
如果表中的所有字段都是“固定長(zhǎng)度”的,整個(gè)表會(huì)被認(rèn)為是 “static” 或 “fixed-length”。 例如,表中沒(méi)有如下類(lèi)型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一個(gè)這些字段,那么這個(gè)表就不是“固定長(zhǎng)度靜態(tài)表”了,這樣,MySQL 引擎會(huì)用另一種方法來(lái)處理。
固定長(zhǎng)度的表會(huì)提高性能,因?yàn)镸ySQL搜尋得會(huì)更快一些,因?yàn)檫@些固定的長(zhǎng)度是很容易計(jì)算下一個(gè)數(shù)據(jù)的偏移量的,所以讀取的自然也會(huì)很快。而如果字段不是定長(zhǎng)的,那么,每一次要找下一條的話(huà),需要程序找到主鍵。
并且,固定長(zhǎng)度的表也更容易被緩存和重建。不過(guò),唯一的副作用是,固定長(zhǎng)度的字段會(huì)浪費(fèi)一些空間,因?yàn)槎ㄩL(zhǎng)的字段無(wú)論你用不用,他都是要分配那么多的空間。
5、如何理解 ThinkPHP 3.0 架構(gòu)(核心 + 行為 + 驅(qū)動(dòng))中的行為?
(1)核心(Core):就是框架的核心代碼,不可缺少的東西,TP本身是基于MVC思想開(kāi)發(fā)的框架。
(2)行為(Behavior) :行為在新版ThinkPHP的架構(gòu)里面起著舉足輕重的作用,在系統(tǒng)核心之上,設(shè)置了很多標(biāo)簽擴(kuò)展位,而每個(gè)標(biāo)簽位置可以依次執(zhí)行各自的獨(dú)立行為。行為擴(kuò)展就因此而誕生了,而且很多系統(tǒng)功能也是通過(guò)內(nèi)置的行為擴(kuò)展完成的,所有行為擴(kuò)展都是可替換和增加的,由此形成了底層框架可組裝的基礎(chǔ)。
(3)驅(qū)動(dòng)( Driver ):數(shù)據(jù)庫(kù)驅(qū)動(dòng)、緩存驅(qū)動(dòng)、標(biāo)簽庫(kù)驅(qū)動(dòng)和模板引擎驅(qū)動(dòng),以及外置的類(lèi)擴(kuò)展。
6、什么是慣例配置?
所謂的慣例配置,便是框架的自帶的配置文件。該文件在核心框架目錄下的convention.php中,配置內(nèi)容如下。由于該文件屬于框架自帶的配置文件,在實(shí)際的開(kāi)發(fā)過(guò)程中,主要給我們做參考實(shí)例使用,我們很少去修改該文件的配置內(nèi)容,更多的是根據(jù)需求來(lái)按照慣例配置中的字段定義和注釋來(lái)在模塊或者Common中自定義配置內(nèi)容。
7、什么是SQL注入?(理解)
SQL注入攻擊是黑客對(duì)數(shù)據(jù)庫(kù)進(jìn)行攻擊的常用手段之一。
一部分程序員在編寫(xiě)代碼的時(shí)候,沒(méi)有對(duì)用戶(hù)輸入數(shù)據(jù)的合法性進(jìn)行判斷,注入者可以在表單中輸入一段數(shù)據(jù)庫(kù)查詢(xún)代碼并提交,程序?qū)⑻峤坏男畔⑵礈惿梢粋€(gè)完整sql語(yǔ)句,服務(wù)器被欺騙而執(zhí)行該條惡意的SQL命令。注入者根據(jù)程序返回的結(jié)果,成功獲取一些敏感數(shù)據(jù),甚至控制整個(gè)服務(wù)器,這就是SQL注入。
8、ThinkPHP如何防止SQL注入?(理解)
(1)查詢(xún)條件盡量使用數(shù)組方式,這是更為安全的方式;
(2)如果不得已必須使用字符串查詢(xún)條件,使用預(yù)處理機(jī)制;
(3)使用綁定參數(shù)
(4)開(kāi)啟數(shù)據(jù)字段類(lèi)型驗(yàn)證,可以對(duì)數(shù)值數(shù)據(jù)類(lèi)型做強(qiáng)制轉(zhuǎn)換;(3.1版本開(kāi)始已經(jīng)強(qiáng)制進(jìn)行字段類(lèi)型驗(yàn)證了)
(5)使用自動(dòng)驗(yàn)證和自動(dòng)完成機(jī)制進(jìn)行針對(duì)應(yīng)用的自定義過(guò)濾;
(6)使用字段類(lèi)型檢查、自動(dòng)驗(yàn)證和自動(dòng)完成機(jī)制等避免惡意數(shù)據(jù)的輸入。
9、如何開(kāi)啟調(diào)試模式?調(diào)試模式有什么好處?
開(kāi)啟調(diào)試模式很簡(jiǎn)單,只需要在入口文件中增加一行常量定義代碼:
// 開(kāi)啟調(diào)試模式 建議開(kāi)發(fā)階段開(kāi)啟 部署階段注釋或者設(shè)為false
define(‘APP_DEBUG’, true);
調(diào)試模式的優(yōu)勢(shì)在于: 開(kāi)啟日志記錄,任何錯(cuò)誤信息和調(diào)試信息都會(huì)詳細(xì)記錄,便于調(diào)試; 關(guān)閉模板緩存,模板修改可以即時(shí)生效; 記錄SQL日志,方便分析SQL; 關(guān)閉字段緩存,數(shù)據(jù)表字段修改不受緩存影響; 嚴(yán)格檢查文件大小寫(xiě)(即使是Windows平臺(tái)),幫助你提前發(fā)現(xiàn)Linux部署問(wèn)題; 可以方便用于開(kāi)發(fā)過(guò)程的不同階段,包括開(kāi)發(fā)、測(cè)試和演示等任何需要的情況,不同的應(yīng)用模式可以配置獨(dú)立的項(xiàng)目配置文件。
10、TP中支持哪些配置模式??jī)?yōu)先級(jí)?
慣例配置->應(yīng)用配置->模式配置->調(diào)試配置->狀態(tài)配置->模塊配置->擴(kuò)展配置->動(dòng)態(tài)配置
以上是配置文件的加載順序,因?yàn)楹竺娴呐渲脮?huì)覆蓋之前的同名配置(在沒(méi)有生效的前提下),所以?xún)?yōu)先順序從右到左。
11、TP中的URL模式有哪幾種?默認(rèn)是哪種?
ThinkPHP支持四種URL模式,可以通過(guò)設(shè)置URL_MODEL參數(shù)來(lái)定義,包括普通模式、PATHINFO、REWRITE和兼容模式。
默認(rèn)模式為:PATHINFO模式,設(shè)置URL_MODEL 為1
12、TP中系統(tǒng)變量有哪些?如何獲取系統(tǒng)變量?
(1)系統(tǒng)變量:SERVER、_ENV、 $_POST、 $_GET、 REQUEST、_SESSION和 $_COOKIE變量
(2)獲取系統(tǒng)變量:
{KaTeX parse error: Expected 'EOF', got '}' at position 25: …ver.script_name}? // 輸出_SERVER[‘SCRIPT_NAME’]變量
{KaTeX parse error: Expected 'EOF', got '}' at position 22: …session.user_id}? // 輸出_SESSION[‘user_id’]變量
{KaTeX parse error: Expected 'EOF', got '}' at position 21: ….get.pageNumber}? // 輸出_GET[‘pageNumber’]變量
{KaTeX parse error: Expected 'EOF', got '}' at position 18: …ink.cookie.name}? // 輸出_COOKIE[‘name’]變量
13、ThinkPHP框架中D函數(shù)與M函數(shù)的區(qū)別是什么?
M方法實(shí)例化模型無(wú)需用戶(hù)為每個(gè)數(shù)據(jù)表定義模型類(lèi),D方法可以自動(dòng)檢測(cè)模型類(lèi),如果存在自定義的模型類(lèi),則實(shí)例化自定義模型類(lèi),如果不存在,則會(huì)自動(dòng)調(diào)用M方法去實(shí)例化Model基類(lèi)。同時(shí)對(duì)于已實(shí)例化過(guò)的模型,不會(huì)重復(fù)去實(shí)例化(單例模式)。
五、smarty模板引擎
1、編譯和緩存區(qū)別?
smarty的編譯過(guò)程就是把模板拿過(guò)來(lái),把里面的標(biāo)簽替換成相應(yīng)php代碼,這就是smarty的編譯, 其實(shí)就是php和html混合的過(guò)程
smarty的緩存需要手動(dòng)開(kāi)啟,smarty的緩存就是把編譯好的文件執(zhí)行后,同時(shí)生成一份靜態(tài)的html頁(yè)面,再次訪問(wèn)的時(shí)候,你訪問(wèn)的就是是html文件了,所以就效率來(lái)說(shuō),要高一些。
2、什么是smarty? Smarty的優(yōu)點(diǎn)是什么?
Smarty是一個(gè)使用PHP寫(xiě)出來(lái)的PHP模板引擎,目的是要使用PHP程序同美工分離,使的程序員改變程序的邏輯內(nèi)容時(shí)不會(huì)影響到美工的頁(yè)面設(shè)計(jì),美工重新修改頁(yè)面時(shí)不會(huì)影響到程序的程序邏輯,這在多人合作的項(xiàng)目中顯的尤為重要。(也易于程序的多樣式開(kāi)發(fā))
Smarty優(yōu)點(diǎn)
(1)速度快:相對(duì)其他模板引擎。
(2) 編譯型:采用smarty編寫(xiě)的程序在運(yùn)行時(shí)要編譯成一個(gè)非模板技術(shù)的PHP文件
(3)緩存技術(shù):它可以將用戶(hù)最終看到的HTML文件緩存成一個(gè)靜態(tài)的HTML頁(yè)
(4)插件技術(shù):smarty可以自定義插件。
不適合使用smarty的地方
(1)需要實(shí)時(shí)更新的內(nèi)容。例如像股票顯示,它需要經(jīng)常對(duì)數(shù)據(jù)進(jìn)行更新
(2)小項(xiàng)目。小項(xiàng)目因?yàn)轫?xiàng)目簡(jiǎn)單而美工與程序員兼于一人的項(xiàng)目
3、在模板中使用{$smarty}保留變量
{KaTeX parse error: Expected 'EOF', got '}' at position 16: smarty.get.page}? //類(lèi)似在php腳本中訪問(wèn)_GET[page]
{KaTeX parse error: Expected 'EOF', got '}' at position 16: smarty.cookies.}?
{smarty.post.}
{KaTeX parse error: Expected 'EOF', got '}' at position 16: smarty.session.}?
{smarty.server.}
4、在模板中訪問(wèn)php中的變量
5、變量調(diào)解器
2018PHP經(jīng)典面試題大全匯總(更新)-PHP面試題
6、php查詢(xún)mysql數(shù)據(jù)庫(kù)時(shí),查詢(xún)中文結(jié)果時(shí)出現(xiàn)的亂碼。怎么解決?
(1)文件meta(設(shè)置瀏覽器解析的時(shí)候)
(2)連接數(shù)據(jù)庫(kù)時(shí)編碼設(shè)定
(3)PHP文件中使用header函數(shù)確定編碼
7、緩存機(jī)制
如果開(kāi)啟了緩存,smarty同時(shí)生成一份靜態(tài)的html頁(yè)面,如果在設(shè)定的時(shí)間沒(méi)有過(guò)期,再次訪問(wèn)的時(shí)候,你訪問(wèn)的就是是html文件了,減少了讀取數(shù)據(jù)庫(kù),所以就效率來(lái)說(shuō),要高一些。
8、smarty的賦值和載入模板
$Smarty->assign(name,value)
$Smarty->display(‘index.html’)
9、marty模板技術(shù)的用途是什么?
為了php與html分開(kāi),美工和程序員各司其職,互不干擾。
10、smarty配置主要有哪幾項(xiàng)?
(1)引入smarty.class.php;
(2) 實(shí)例化smarty對(duì)象;
(3)重新修改默認(rèn)的模板路徑;
(4)重新修改默認(rèn)的編譯后文件的路徑;
(5)重新修改默認(rèn)的配置文件的路徑;
(6)重新修改默認(rèn)的cache的路徑。
(7) 可以設(shè)置是否開(kāi)啟cache。
(8)可以設(shè)置左側(cè)和右側(cè)定界符。
11、smarty在使用過(guò)程中需要注意哪些細(xì)節(jié)?
Smarty是基于MVC概念的一種模板引擎,它將一個(gè)頁(yè)面程序分成了兩部分來(lái)實(shí)現(xiàn):即視圖層和控制層,
也就是說(shuō)smarty技術(shù)將用戶(hù)UI與php代碼分離開(kāi)。
這樣程序員和美工各司其職,互不干擾。
12、smarty運(yùn)用過(guò)程中要注意以下幾個(gè)問(wèn)題:
(1)正確配置smarty。主要要實(shí)例化smarty對(duì)象,配置smarty模板文件的路徑;
(2)php頁(yè)面中使用assign賦值 和display顯示頁(yè)面;
(3)smarty模板文件中不允許出現(xiàn)php代碼段,所有的注釋?zhuān)兞?,函?shù)都要包含在定界符內(nèi)。
六、二次開(kāi)發(fā)系統(tǒng)(DEDE、ecshop)
1、對(duì)二次開(kāi)發(fā)的理解
二次開(kāi)發(fā),簡(jiǎn)單的說(shuō)就是在現(xiàn)有的軟件上進(jìn)行定制修改,功能的擴(kuò)展,然后達(dá)到自己想要的功能,一般來(lái)說(shuō)都不會(huì)改變?cè)邢到y(tǒng)的內(nèi)核。
2、MVC
Model(模型)數(shù)據(jù)處理。
View(視圖) 模板顯示。
Controller(控制器) 控制流程。
MVC的概念是什么?各層主要做什么工作?
MVC(即模型-視圖-控制器)是一種軟件設(shè)計(jì)模式或者說(shuō)編程思想。
M指Model模型層,V是View視圖層(顯示層或者用戶(hù)界面),C是Controller控制器層。
使用mvc的目的是實(shí)現(xiàn)M和V分離,從而使得一個(gè)程序可以輕松使用不同的用戶(hù)界面。
在網(wǎng)站開(kāi)發(fā)中,
模型層一般負(fù)責(zé)對(duì)數(shù)據(jù)庫(kù)表信息進(jìn)行增刪改查,
視圖層負(fù)責(zé)顯示頁(yè)面內(nèi)容,
控制器層在M和V之間起到調(diào)節(jié)作用,控制器層決定調(diào)用哪個(gè)model類(lèi)的哪個(gè)方法,
執(zhí)行完畢后由控制器層決定將結(jié)果assign到哪個(gè)view層。
3、二次開(kāi)發(fā)程序安裝后訪問(wèn)時(shí)候出現(xiàn)一些警告以及錯(cuò)誤
根據(jù)錯(cuò)誤,來(lái)修改服務(wù)器配置參數(shù)以及百度
4、功能,模板的更換,功能的添加修改
其實(shí)也就是面向?qū)ο蟮膽?yīng)用 用,以及模板的更換類(lèi)似smarty的使用
5、用過(guò)哪些二次開(kāi)發(fā)的東西?
Dedecms phpcms ecshop,基本這些的東西如果基礎(chǔ)好了 學(xué)習(xí)起來(lái)都是沒(méi)問(wèn)題的。
6、像php做一次開(kāi)發(fā)好,還是二次開(kāi)發(fā)好?
一般中小企業(yè)都用cms系統(tǒng)二次開(kāi)發(fā),都是為了效率。當(dāng)然如果想一次開(kāi)發(fā)也行,會(huì)用框架而且時(shí)間充足的話(huà)就可以了,大企業(yè)都是團(tuán)隊(duì)來(lái)開(kāi)發(fā)的,杜絕版權(quán)問(wèn)題。
7、二次開(kāi)發(fā)過(guò)程中很多類(lèi)與類(lèi)之間進(jìn)行之間的方法訪問(wèn),是通過(guò)什么方式傳遞的?
不是類(lèi)繼承而是對(duì)象組合,把實(shí)例化好的對(duì)象通過(guò)global傳遞進(jìn)去
8、dedecms如果更換目錄,后臺(tái)某項(xiàng)就進(jìn)不去了如何解決?
后臺(tái)核心設(shè)置中修改成現(xiàn)在的 項(xiàng)目目錄名稱(chēng)
9、dedecms中自定義模型的理解?
在織夢(mèng)系統(tǒng)中有內(nèi)容模型這個(gè)概念,不同內(nèi)容模型可以用來(lái)構(gòu)建不同內(nèi)容形式的站點(diǎn),在系統(tǒng)中自帶了以下幾種模型:普通文章、圖集、軟件、商品、分類(lèi)信息、專(zhuān)題。
通過(guò)系統(tǒng)自帶的模型,我們可以用來(lái)構(gòu)建不同類(lèi)型的站點(diǎn),例如:使用圖集可以做一個(gè)圖片站,用軟件模型構(gòu)建一個(gè)軟件下載站點(diǎn)。
當(dāng)然以上隨系統(tǒng)附帶的模型被稱(chēng)為系統(tǒng)模型,用戶(hù)可以自己定義一些模型,比如圖書(shū)、音樂(lè)專(zhuān)輯等,自定義了這些模型才可以構(gòu)建更多內(nèi)容形式的站點(diǎn)。
相當(dāng)于我們自動(dòng)添加了表結(jié)構(gòu),適應(yīng)現(xiàn)在當(dāng)前需求的變化
10、dede中概念,設(shè)計(jì)和使用模板,必須要理解下面幾個(gè)概念
(1)板塊(封面)模板:
指網(wǎng)站主頁(yè)或比較重要的欄目封面頻道使用的模板,一般用“index_識(shí)別ID.htm”命名,此外,用戶(hù)單獨(dú)定義的單個(gè)頁(yè)面或自定義標(biāo)記,也可選是否支持板塊模板標(biāo)記,如果支持,系統(tǒng)會(huì)用板塊模板標(biāo)記引擎去解析后才輸出內(nèi)容或生成特定的文件。
(2)列表模板:
指網(wǎng)站某個(gè)欄目的所有文章列表的模板,一般用 “l(fā)ist_識(shí)別ID.htm” 命名。
(3) 檔案模板:
表示文檔查看頁(yè)的模板,如文章模板,一般用 “article_識(shí)別ID.htm” 命名。
(4) 其它模板:
一般系統(tǒng)常規(guī)包含的模板有:主頁(yè)模板、搜索模板、RSS、JS編譯功能模板等,此外用戶(hù)也可以自定義一個(gè)模板創(chuàng)建為任意文件。
11、dede中幾種標(biāo)簽的使用?
列表 內(nèi)容 等標(biāo)簽 只能在其本范圍內(nèi)使用,列表標(biāo)簽只能在列表中使用,內(nèi)容標(biāo)簽只能在內(nèi)容標(biāo)簽中使用。
全局標(biāo)簽?zāi)茉谒许?yè)面中使用
12、熟悉常用類(lèi)庫(kù)
(例如:dedesql.class.php);熟悉系統(tǒng)函數(shù)庫(kù)(common.func.php);熟悉自定義函數(shù)庫(kù)(extend.func.php);熟悉前臺(tái)入口文件(common.inc.php)
七、微信公眾平臺(tái)開(kāi)發(fā)
1、微信運(yùn)行機(jī)制
公眾號(hào)與php之間用什么語(yǔ)言通信:Xml
Weixin.php中是如何接收公眾號(hào)數(shù)據(jù)的:
$postStr = $GLOBALS[“HTTP_RAW_POST_DATA”];//接收數(shù)據(jù) XML數(shù)據(jù)
2、消息類(lèi)型
微信目前提供了7種基本消息類(lèi)型,分別為:
(1)文本消息(text);
(2)圖片消息(image);
(3)語(yǔ)音(voice)
(4)視頻(video)
(5)地理位置(location);
(6)鏈接消息(link);
(7)事件推送(event)
類(lèi)型。掌握不同的消息類(lèi)型發(fā)送時(shí)的數(shù)據(jù)傳遞格式
3、將整個(gè)文件讀入一個(gè)字符串的函數(shù)是
File_get_contents
4、常用函數(shù)
把xml數(shù)據(jù)解析成對(duì)象的函數(shù)是
simplexml_load_string( )
將字符串轉(zhuǎn)換為數(shù)組的函數(shù)是___ explode_________,將數(shù)組轉(zhuǎn)化為字符串的函數(shù)是____implode________.
編碼 URL 字符串的字符串是____urlencode________.
5、Sprintf函數(shù)的作用
這個(gè)都是可以查手冊(cè)的。
6、微信公眾號(hào)出現(xiàn)無(wú)法提供服務(wù)的原因?
(1)網(wǎng)絡(luò)原因 ,數(shù)據(jù)接口原因
(2)代碼錯(cuò)誤,怎么推測(cè)原因
修改的哪里檢查一下,如果代碼沒(méi)錯(cuò)
可以輸出數(shù)據(jù) 看一下。用php操作文件
$myfile = fopen(“newfile.txt”, “w”); txt="aaaaaaaaaa";fwrite(txt ="aaaaaaaaaa"; fwrite(txt="aaaaaaaaaa";fwrite(myfile, txt);fclose(txt); fclose(txt);fclose(myfile);
7、自定義菜單的事件推送
單擊
單擊跳轉(zhuǎn)鏈接
掃碼推事件
掃碼推且彈出
彈出系統(tǒng)拍照發(fā)圖的事件
彈出微信相冊(cè)發(fā)圖器的事件
彈出地理位置選擇器的事件
8、token的作用
安全機(jī)制驗(yàn)證,用于微信服務(wù)器與PHP服務(wù)器之間的安全驗(yàn)證
9、Appid與secrect的作用
請(qǐng)求api接口(例如菜單的操作)時(shí)需要傳appid與secrect兩個(gè)值,用來(lái)獲取應(yīng)用的授權(quán)碼
上述就是小編為大家分享的PHP面試題有哪些了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。