你好,歡迎來到js代碼網。

微信登錄

首頁>編程語言> 2019最新整理PHP面試題附答案

2019最新整理PHP面試題附答案

  • 分類:編程語言
  • 時間:02-27
  • 閱讀:15543

1、什么事面向對象?主要特征是什么?
面向對象是程序的一種設計方式,它利于提高程序的重用性,使程序結構更加清晰。主要特征:封裝、繼承、多態。

2、SESSION 與 COOKIE的區別是什么,請從協議,產生的原因與作用說明?
A、http無狀態協議,不能區分用戶是否是從同一個網站上來的,同一個用戶請求不同的頁面不能看做是同一個用戶。
B、SESSION存儲在服務器端,COOKIE保存在客戶端。Session比較安全,cookie用某些手段可以修改,不安全。Session依賴于cookie進行傳遞。
禁用cookie后,session不能正常使用。Session的缺點:保存在服務器端,每次讀取都從服務器進行讀取,對服務器有資源消耗。Session保存在服務器端的文件或數據庫中,默認保存在文件中,文件路徑由php配置文件的session.save_path指定。Session文件是公有的。

3、HTTP 狀態中302、403、 500代碼含義?
一二三四五原則:(即一:消息系列;二:成功系列; 三:重定向系列;四:請求錯誤系列;五:服務器端錯誤系列。)
302:臨時轉移成功,請求的內容已轉移到新位置
403:禁止訪問
500:服務器內部錯誤
401:代表未授權。

4、請寫出數據類型(int char varchar datetime text)的意思;請問 varchar 和 char有什么區別?
Int 整數char 定長字符 Varchar 變長字符 Datetime 日期時間型Text 文本型 Varchar與char的區別 char是固定長度的字符類型,分配多少空間,就占用多長空間。Varchar是可變長度的字符類型,內容有多大就占用多大的空間,能有效節省空間。由于varchar類型是可變的,所以在數據長度改變的時,服務器要進行額外的操作,所以效率比char類型低。

5、MyISAM和 InnoDB 的基本區別?索引結構如何實現?
A、MyISAM類型不支持事務,表鎖,易產生碎片,要經常優化,讀寫速度較快,適合用于頻繁查詢的應用;
B、InnoDB類型支持事務,行鎖,有崩潰恢復能力,讀寫速度比MyISAM慢,適合于插入和更新操作比較多的應用,空間占用大,不支持全文索引等。
創建索引:alert table tablename add index 索引名 (`字段名`)

6、isset() 和 empty() 區別
isset判斷變量是否存在,可以傳入多個變量,若其中一個變量不存在則返回假;empty判斷變量是否為空為假,只可傳一個變量,如果為空為假則返回真。

7、請說明 PHP 中傳值與傳引用的區別。什么時候傳值什么時候傳引用?
按值傳遞:函數范圍內對值的任何改變在函數外部都會被忽略
按引用傳遞:函數范圍內對值的任何改變在函數外部也能反映出這些修改
優缺點:按值傳遞時,php必須復制值。特別是對于大型的字符串和對象來說,這將會是一個代價很大的操作。按引用傳遞則不需要復制值,對于性能提高很有好處。

8、在PHP中error_reporting這個函數有什么作用?
設置PHP的報錯級別并返回當前級別。

9、說說你對緩存技術的了解?
緩存技術是將動態內容緩存到文件中,在一定時間內訪問動態頁面直接調用緩存文件,而不必重新訪問數據庫。

10、現在編程中經常采取MVC三層結構,請問MVC分別指哪三層,有什么優點?
MVC三層分別指:業務模型、視圖、控制器,由控制器層調用模型處理數據,然后將數據映射到視圖層進行顯示,優點是:①可以實現代碼的重用性,避免產生代碼冗余;②M和V的實現代碼分離,從而使同一個程序可以使用不同的表現形式

11、AJAX的優勢是什么?
ajax是異步傳輸技術,可以通過javascript實現,也可以通過JQuery框架實現,實現局部刷新,減輕了服務器的壓力,也提高了用戶體驗。

12、在程序的開發中,如何提高程序的運行效率?
A、優化SQL語句,查詢語句中盡量不使用select *,用哪個字段查哪個字段;少用子查詢可用表連接代替;少用模糊查詢;
B、數據表中創建索引;
C、對程序中經常用到的數據生成緩存。

13、對于大流量的網站,您采用什么樣的方法來解決訪問量問題?
A、有效使用緩存,增加緩存命中率
B、使用負載均衡
C、對靜態文件使用cdn進行存儲和加速
D、想法減少數據庫的使用
E、查看出現統計的瓶頸在哪里
F、反向代理

14、語句include和require的區別是什么?為避免多次包含同一文件,可用什么語句代替它們?
區別:
在失敗的時候:
include產生一個warning,而require產生直接產生錯誤中斷
require在運行前載入
include在運行時載入
代替:
require_once
include_once

15、foo()和@foo()之間有什么區別?
@代表所有warning忽略

16、簡述php的垃圾收集機制。
答案:php中的變量存儲在變量容器zval中,zval中除了存儲變量類型和值外,還有is_ref和refcount字段。refcount表示指向變量的元素個數,is_ref表示變量是否有別名。如果refcount為0時,就回收該變量容器。如果一個zval的refcount減1之后大于0,它就會進入垃圾緩沖區。當緩沖區達到最大值后,回收算法會循環遍歷zval,判斷其是否為垃圾,并進行釋放處理。

17、如何實現PHP的安全最大化?怎樣避免SQL注入漏洞和XSS跨站腳本攻擊漏洞?
答:基本原則:不對外界展示服務器或程序設計細節(屏蔽錯誤),不相信任何用戶提交的數據(過濾用戶提交)。

18、echo、print_r、print、var_dump區別
echo:語句結構;
print:是函數,有返回值
print_r:能打印數組,對象
var_dump:能打印對象數組,并且帶數據類型

19、寫出smarty模板的特點
速度快,編譯型,緩存技術,插件機制,強大的表現邏輯

20、PHP如何實現頁面跳轉
方法一:php函數跳轉,缺點,header頭之前不能有輸出,跳轉后的程序繼續執行,可用exit中斷執行后面的程序。
header("Location:網址");//直接跳轉
header("refresh:3;url=http://www.hkiufo.live");//三秒后跳轉
方法二:利用meta
echo"";

21、如何把一個GB2312格式的字符串裝換成UTF-8格式?
iconv('GB2312','UTF-8','js代碼(www.hkiufo.live)是IT資源下載與IT技能學習平臺。');
?>

22、如果需要原樣輸出用戶輸入的內容,在數據入庫前,要用哪個函數處理?
htmlspecialchars或者htmlentities

23、什么是 CSRF 攻擊 ?XSS 攻擊?如何防范?
CSRF,跨站請求偽造,攻擊方偽裝用戶身份發送請求從而竊取信息或者破壞系統。
講述基本原理:用戶訪問A網站登陸并生成了cookie,再訪問B網站,如果A網站存在CSRF漏洞,此時B網站給A網站的請求(此時相當于是用戶訪問),A網站會認為是用戶發的請求,從而B網站就成功偽裝了你的身份,因此叫跨站腳本攻擊。

CSRF防范:
A、合理規范api請求方式,GET,POST
B、對POST請求加token令牌驗證,生成一個隨機碼并存入session,表單中帶上這個隨機碼,提交的時候服務端進行驗證隨機碼是否相同。

XSS,跨站腳本攻擊。

防范:不相信任何輸入,過濾輸入。


24、安全對一套程序來說至關重要,請說說在開發中應該注意哪些安全機制?
A、防遠程提交;
B、防SQL注入,對特殊代碼進行過濾;
C、防止注冊機灌水,使用驗證碼。

25、對json數據格式的理解?
JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,json數據格式固定,可以被多種語言用作數據的傳遞。

26、什么是事務?及其特性?
答:事務:是一系列的數據庫操作,是數據庫應用的基本邏輯單位。

事務特性:
A、原子性:即不可分割性,事務要么全部被執行,要么就全部不被執行。
B、一致性或可串性。事務的執行使得數據庫從一種正確狀態轉換成另一種正確狀態
C、隔離性。在事務正確提交之前,不允許把該事務對數據的任何改變提供給任何其他事務,
D、持久性。事務正確提交后,其結果將永久保存在數據庫中,即使在事務提交后有了其他故障,事務的處理結果也會得到保存。

或者這樣理解:
事務就是被綁定在一起作為一個邏輯工作單元的SQL語句分組,如果任何一個語句操作失敗那么整個操作就被失敗,以后操作就會回滾到操作前狀態,或者是上有個節點。為了確保要么執行,要么不執行,就可以使用事務。要將有組語句作為事務考慮,就需要通過ACID測試,即原子性,一致性,隔離性和持久性。

27、什么是鎖?
答:數據庫是一個多用戶使用的共享資源。當多個用戶并發地存取數據時,在數據庫中就會產生多個事務同時存取同一數據的情況。若對并發操作不加控制就可能會讀取和存儲不正確的數據,破壞數據庫的一致性。

加鎖是實現數據庫并發控制的一個非常重要的技術。當事務在對某個數據對象進行操作前,先向系統發出請求,對其加鎖。加鎖后事務就對該數據對象有了一定的控制,在該事務釋放鎖之前,其他的事務不能對此數據對象進行更新操作。

基本鎖類型:鎖包括行級鎖和表級鎖

28、索引的作用?和它的優點缺點是什么?
答:索引就一種特殊的查詢表,數據庫的搜索引擎可以利用它加速對數據的檢索。它很類似與現實生活中書的目錄,不需要查詢整本書內容就可以找到想要的數據。索引可以是唯一的,創建索引允許指定單個列或者是多個列。缺點是它減慢了數據錄入的速度,同時也增加了數據庫的尺寸大小。

29、如何通俗地理解三個范式?
第一范式:1NF是對屬性的原子性約束,要求屬性具有原子性,不可再分解;
第二范式:2NF是對記錄的惟一性約束,要求記錄有惟一標識,即實體的惟一性;
第三范式:3NF是對字段冗余性的約束,即任何字段不能由其他字段派生出來,它要求字段沒有冗余。

30、主鍵、外鍵和索引的區別?
定義:
主鍵--唯一標識一條記錄,不能有重復的,不允許為空
外鍵--表的外鍵是另一表的主鍵, 外鍵可以有重復的, 可以是空值
索引--該字段沒有重復值,但可以有一個空值

作用:
主鍵--用來保證數據完整性
外鍵--用來和其他表建立聯系用的
索引--是提高查詢排序的速度

個數:
主鍵--主鍵只能有一個
外鍵--一個表可以有多個外鍵
索引--一個表可以有多個唯一索引

31、簡述 private、 protected、 public修飾符的訪問權限。
private : 私有成員, 在類的內部才可以訪問。
protected : 保護成員,該類內部和繼承類中可以訪問。
public : 公共成員,完全公開,沒有訪問限制。

32、堆和棧的區別?
A、堆是程序運行期間動態分配的內存空間,你可以根據程序的運行情況確定要分配的堆內存的大小;
B、棧是編譯期間就分配好的內存空間,因此你的代碼中必須就棧的大小有明確的定義。

33、常用的魔術方法有哪些?舉例說明
答: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復制一個對象時候調用。

34、$this和self、parent這三個關鍵詞分別代表什么?在哪些場合下使用?
$this  當前對象
self   當前類
parent 當前類的父類

$this在當前類中使用,使用->調用屬性和方法
self也在當前類中使用,不過需要使用::調用
parent在類中使用

35、作用域操作符::如何使用?都在哪些場合下使用?
調用類常量
調用靜態方法

36、__autoload()方法的工作原理是什么?
答:使用這個魔術函數的基本條件是類文件的文件名要和類的名字保持一致。

當程序執行到實例化某個類的時候,如果在實例化前沒有引入這個類文件,那么就自動執行__autoload()函數。

這個函數會根據實例化的類的名稱來查找這個類文件的路徑,當判斷這個類文件路徑下確實存在這個類文件后

就執行include或者require來載入該類,然后程序繼續執行,如果這個路徑下不存在該文件時就提示錯誤。

使用自動載入的魔術函數可以不必要寫很多個include或者require函數。

37、簡述高并發網站解決方案。
A、前端優化(CND加速、建立獨立圖片服務器)
B、服務端優化(頁面靜態化、并發處理[異步|多線程]、隊列處理)
C、數據庫優化(數據庫緩存[Memcachaed|Redis]、讀寫分離、分庫分表、分區)
D、Web服務器優化(負載均衡、反向代理)


38、PHP遍歷文件夾下所有文件

<?php
function read_all($dir){
    if(!is_dir($dir)) return false;
    $handle = opendir($dir);
    if($handle){
        while(($fl = readdir($handle)) !== false){
            $temp = $dir.$fl;
            //$fl !='.' && $fl != '..' 排除當前目錄及父級目錄
            if(is_dir($temp) && $fl!='.' && $fl != '..'){
                echo '目錄:'.$temp.'<br>';
                read_all($temp);
            }else{
                if($fl !='.' && $fl != '..'){
                    echo '文件:'.$temp.'<br>';
                }
            }
        }
    }
}
read_all("./dir/");
?>


39、在命令行中運行php程序
php indx.php
A、從命令行運行php非常簡單。但有些注意事項需要各位了解下,諸如$_SESSION之類的服務器變量是無法在命令行中使用的,其他代碼的運行則和web服務器中完全一樣;
B、在命令行中執行php文件的好處之一就是可以通過腳本實現一些計劃任務(crontab)的執行,而無須通過web服務器。

延伸1:
php -v 顯示當前PHP版本
php -m 顯示當前php加載的有效模塊
php -i 輸出無html格式的phpinfo
php --rf function

延伸2:向php腳本傳遞參數:
提示:命令行下執行php,是不走Apache/Nginx等這類東西的,沒有什么http協議,所以get,post傳參數根本不起作用,并且還會報錯。有些時候需要在shell命令下把PHP當作腳本執行,比如定時任務。這就涉及到在shell命令下如何給php傳參的問題,通常有三種方式傳參。

A、使用$argv or $argc參數接收
echo "接收到{$argc}個參數";
print_r($argv);
?>

B、使用getopt函數
$param_arr = getopt('a:b:');
print_r($param_arr);
?>

C、提示用戶輸入
fwrite(STDOUT,'Please enter your name:');
echo 'Your name is:'.fgets(STDIN);
?>

40、你用什么方法檢查PHP腳本的執行效率(通常是腳本執行時間)和數據庫SQL的效率(通常是數據庫Query時間),并定位和分析腳本執行和數據庫查詢的瓶頸所在?
A、PHP腳本的執行效率
a、代碼腳本里計時;
b、xdebug統計函數執行次數和具體時間進行分析,最好使用工具winCacheGrind分析;
c、在線系統用strace跟蹤相關進程的具體系統調用。

B、數據庫SQL的效率
a、sql的explain(mysql),啟用slow query log記錄慢查詢;
b、通常還要看數據庫設計是否合理,需求是否合理等。

41、對于大流量的網站,您采用什么樣的方法來解決各頁面訪問量統計問題。
A、確認服務器是否能支撐當前訪問量;
B、優化數據庫訪問;
C、禁止外部訪問鏈接(盜鏈), 比如圖片防盜鏈;
D、控制文件下載,尤其是大文件;
E、使用不同主機分流(負載均衡);
F、使用瀏覽統計軟件,了解訪問量,有針對性的進行優化。

42、 MySQL數據庫作發布系統的存儲,一天五萬條以上的增量,預計運維三年,怎么優化?
A、設計良好的數據庫結構,允許部分數據冗余,盡量避免join查詢,提高效率;
B、選擇合適的表字段數據類型和存儲引擎,適當的添加索引;
C、mysql庫主從讀寫分離;
D、找規律分表,減少單表中的數據量提高查詢速度;
E、添加緩存機制,比如memcached,redis等;
F、不經常改動的頁面,生成靜態頁面;
G、書寫高效率的SQL。比如 SELECT * FROM TABEL 改為 SELECT field_1, field_2, field_3 FROM TABLE。

43、Mysql的存儲引擎,myisam和innodb的區別。
A、MyISAM類型不支持事務處理等高級處理,而InnoDB類型支持;
B、MyISAM類型的表強調的是性能,其執行速度比InnoDB類型更快;
C、InnoDB不支持FULLTEXT類型的索引;
D、InnoDB中不保存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可;
E、對于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯合索引;
F、DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除;
G、LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導入數據后再改成InnoDB表,但是對于使用的額外的InnoDB特性(例如外鍵)的表不適用;
H、MyISAM支持表鎖,InnoDB支持行鎖。

MyISAM:成熟、穩定、易于管理,快速讀取。一些功能不支持(事務等),表級鎖。
InnoDB:支持事務、外鍵等特性、數據行鎖定。空間占用大,不支持全文索引等。

相關文章

北京 28开奖走势图