1、什麼事面向對象?主要特征是什麼?面向對象是程式的一種設計方式,它利於提高程式的重用性,使程式結構更加清晰。主要特征:封裝、繼承、多態。2、SESSION 與 COOKIE的區別是什麼,請從協議,產生的原因與作用說明?A、http無狀態協議,不能區分用戶是否是從同一個網站上來的,同一個用戶請求不同 ...
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.jsdaima.com");//三秒後跳轉
方法二:利用meta
echo"";
21、如何把一個GB2312格式的字元串裝換成UTF-8格式?
iconv('GB2312','UTF-8','js代碼(www.jsdaima.com)是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:支持事務、外鍵等特性、數據行鎖定。空間占用大,不支持全文索引等。