1、冒泡排序,面試前一定要記住哦!
function maopao($arr)
{
$len = count($arr);
$n = count($arr) - 1;
for ($i = 0; $i < $len; $i++) {
for ($j = 0; $j < $n; $j++) {
if ($arr[$j] > $arr[$j + 1]) {
$tmp = $arr[$j];
$arr[$j] = $arr[$j + 1];
$arr[$j + 1] = $tmp;
}
}
}
return $arr;
}
Github
2、快速排序,面試前一定要記住哦!
function quick_sort($array) {
if (count($array) <= 1) return $array;
$key = $array[0];
$left_arr = array();
$right_arr = array();
for ($i=1; $i
if ($array[$i] <= $key)
$left_arr[] = $array[$i];
else
$right_arr[] = $array[$i];
}
$left_arr = quick_sort($left_arr);
$right_arr = quick_sort($right_arr);
return array_merge($left_arr, array($key), $right_arr);
}
3、請說明 PHP 中傳值與傳參考的區別,什么時候傳值什么時候傳參考?
按值傳遞:函式范圍內對值的任何改變在函式外部都會被忽略
按參考傳遞:函式范圍內對值的任何改變在函式外部也能反映出這些修改
優缺點:按值傳遞時,php必須復制值,特別是對于大型的字串和物件來說,這將會是一個代價很大的操作,按參考傳遞則不需要復制值,對于性能提高很有好處,(優缺點會考到)
4、MySQL資料庫中的欄位型別varchar和char的主要區別是什么?
Varchar是變長,節省存盤空間,char是固定長度,查找效率要char型快,因為varchar是非定長,必須先查找長度,然后進行資料的提取,比char定長型別多了一個步驟,所以效率低一些,
5、MySQL資料庫的常用存盤引擎以及它們的區別?
MyISAM:不支持事務,表鎖,易產生碎片,要經常優化,讀寫速度較快,支持全文索引,
InnoDB:支持事務,行鎖,有崩潰恢復能力,讀寫速度比MyISAM慢,5.6之后支持全文索引,
存盤引擎是基于表的,而不是資料庫
(這道題還能更詳細點就詳細點)
6、對于大流量的網站,采用什么樣的方法來解決訪問量問題?
首先,確認服務器硬體是否足夠支持當前的流量
其次,優化資料庫訪問,
第三,禁止外部的盜鏈,
第四,控制大檔案的下載,
第五,使用不同主機分流主要流量
第六,使用流量分析統計軟體
第七,盡量使用靜態頁,快取
7、什么是面向物件?主要特征是什么?
面向物件是程式的一種設計方式,它利于提高程式的重用性,使程式結構更加清晰,主要特征:封裝、繼承、多型,
8、SESSION 與 COOKIE的區別是什么?這是重點
SESSION存盤在服務器端,COOKIE保存在客戶端,Session比較安全,cookie用某些手段可以修改,不安全,Session依賴于cookie進行傳遞,禁用cookie后,session還可以使用,在存盤session的檔案中,生成sessionID,通過get傳參的方式將sessionID傳到要實作session共享的頁面,讀取sessionID,從而從session中獲取資料,
建議查找session與cookie這方面的詳細教程
9、對快取技術的了解?redis是個考點
(1)快取技術是將動態內容快取到檔案中,在一定時間內訪問動態頁面直接呼叫快取檔案,而不必重新訪問資料庫,
(2)使用memcache可以做快取,
10、表單中get和post提交方式的區別
get是顯式的,資料從url中可以看到,傳輸的資料量小,安全性低;
post是隱式的,傳送的資料量較大,安全性較高
11、優化資料庫的方法
- 選取最適用的欄位屬性,盡可能減少定義欄位寬度,盡量把欄位設定NOTNULL
- 使用連接(JOIN)來代替子查詢
- 適用聯合(UNION)來代替手動創建的臨時表
- 事務處理
- 鎖定表、優化事務處理
- 使用外鍵,優化鎖定表
- 使用索引
- 優化查詢陳述句
12、陳述句include和require的區別是什么?陳述句include和require的區別是什么?
require是無條件包含,也就是如果一個流程里加入require,無論條件成立與否都會先執行require,當檔案不存在或者無法打開的時候,會提示錯誤,并且會終止程式執行
include有回傳值,而require沒有(可能因為如此require的速度比include快),如果被包含的檔案不存在的化,那么會提示一個錯誤,但是程式會繼續執行下去
13、redis和memcacahe、mongoDB的區別?
都是非關系型資料庫,性能都非常高,但是mongoDB和memcache、redis是不同的兩種型別,后兩者主要用于資料的快取,前者主要用在查詢和儲存大資料方面,是最接近資料庫的檔案型的非關系資料庫,
從資料存盤位置上來分,memcache的資料存在記憶體中,而redis既可以存盤在記憶體中,也可以存盤的到磁盤中,達到持久化存盤的功能,memcache一旦斷電,資料全部丟失,redis可以利用快照和AOF把資料存到磁盤中,當恢復時又從磁盤中讀取到記憶體中,當物理記憶體使用完畢后,可以把資料寫入到磁盤中,
從存盤資料的型別上來分,memcache和redis存盤的方式都是鍵值對,只不過redis值的型別比較豐富,有string(字串),hash(哈希),list(串列),set(集合)zset(有序集合),而memcache主要存盤的是字串,
14、PHP的基本變數型別
四種標量型別:boolean (布爾型)、integer (整型)、float (浮點型, 也稱作 double)、string (字串)
兩種復合型別:array (陣列)、object (物件)
最后是兩種特殊型別:resource(資源)、NULL(NULL)
15、靜態化如何實作的?偽靜態如何實作?
(1) 靜態化指的是頁面靜態化,也即生成實實在在的靜態檔案,也即不需要查詢資料庫就可以直接從檔案中獲取資料,指的是真靜態,
實作方式主要有兩種:
一種是我們在添加資訊入庫的時候就生成的靜態檔案,也稱為模板替換技術,
一種是用戶在訪問我們的頁面時先判斷是否有對應的快取檔案存在,如果存在就讀快取,不存在就讀資料庫,同時生成快取檔案,
(2)偽靜態不是真正意義上的靜態化,之所以使用偽靜態,主要是為了SEO推廣,搜索引擎對動態的檔案獲取難度大,不利于網站的推廣,實習原理是基于Apache或Nginx的rewrite機智
主要有兩種方式:
- 一種是直接在配置虛擬機的位置配置偽靜態,這個每次修改完成后需要重啟web服務器,
- 另一種采用分布式的,可以在網站的根目錄上創建.htaccess的檔案,在里面配置相應的重寫規則來實作偽靜態,這種每次重寫時不需要重啟web服務器,且結構上比較清晰,
16、Mysql的讀寫分離?(進階的會遇到)
讀寫分離的實作原理就是在執行SQL陳述句的時候,判斷到底是讀操作還是寫操作,把讀的操作轉向到讀服務器上(從服務器,一般是多臺),寫的操作轉到寫的服務器上(主服務器,一般是一臺,視資料量來看),當然為了保證多臺資料庫資料的一致性,需要主從復制,
17、如何處理負載,高并發?
(1)HTML靜態化
效率最高、消耗最小的就是純靜態化的html頁面,所以我們盡可能使我們的 網站上的頁面采用靜態頁面來實作,這個最簡單的方法其實也是最有效的方法,
(2)圖片服務器分離
把圖片單獨存盤,盡量減少圖片等大流量的開銷,可以放在一些相關的平臺上,如七牛等
(3)資料庫集群和庫表散列及快取
資料庫的并發連接為100,一臺資料庫遠遠不夠,可以從讀寫分離、主從復制,資料庫集群方面來著手,另外盡量減少資料庫的訪問,可以使用快取資料庫如memcache、redis,
(4)鏡像:
盡量減少下載,可以把不同的請求分發到多個鏡像端,
(5)負載均衡:
Apache的最大并發連接為1500,只能增加服務器,可以從硬體上著手,如F5服務器,當然硬體的成本比較高,我們往往從軟體方面著手,
18、說一下單引號雙引號?(基礎考點)
單引號內部的變數不會執行, 雙引號會執行
單引號決議速度比雙引號快,
單引號只能決議部分特殊字符,雙引號可以決議所有特殊字符,
19、PHP7的新特性?重點
- 標量型別宣告:PHP 7 中的函式的形參型別宣告可以是標量了,在 PHP 5 中只能是類名、介面、array 或者 callable (PHP 5.4,即可以是函式,包括匿名函式),現在也可以使用 string、int、float和 bool 了,
- 回傳值型別宣告:增加了對回傳型別宣告的支持, 類似于引數型別宣告,回傳型別宣告指明了函式回傳值的型別,可用的型別與引數宣告中可用的型別相同,
- NULL 合并運算子:由于日常使用中存在大量同時使用三元運算式和 isset()的情況,NULL 合并運算子使得變數存在且值不為NULL, 它就會回傳自身的值,否則回傳它的第二個運算元,
- use 加強:從同一 namespace 匯入的類、函式和常量現在可以通過單個 use 陳述句 一次性匯入了
- 匿名類:現在支持通過new class 來實體化一個匿名類
20、PHP 陣列排序
- sort() - 以升序對陣列排序
- rsort() - 以降序對陣列排序
- asort() - 根據值,以升序對關聯陣列進行排序
- ksort() - 根據鍵,以升序對關聯陣列進行排序
- arsort() - 根據值,以降序對關聯陣列進行排序
- krsort() - 根據鍵,以降序對關聯陣列進行排序
21、建立索引
(普通索引)->
創建:CREATE INDEX <索引名> ON tablename (索引欄位)
修改:ALTER TABLE tablename ADD INDEX [索引名] (索引欄位)
創表指定索引:CREATE TABLE tablename([...],INDEX[索引名](索引欄位))
(唯一索引)->
創建:CREATE UNIQUE <索引名> ON tablename (索引欄位)
修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引欄位)
創表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引欄位))
(主鍵)->
它是唯一索引,一般在創建表是建立,格式為:
CREATA TABLE tablename ([...],PRIMARY KEY[索引欄位])
22、PHP支持多繼承嗎?
不支持,PHP中只允許單繼承,父類可以被一個子類用關鍵字“extends”繼承,
23、使用過Memcache快取嗎,如果使用過,能夠簡單的描述一下它的作業原理嗎?
Memcahce是把所有的資料保存在記憶體當中,采用hash表的方式,每條資料又key和value組成,每個key是獨一無二的,當要訪問某個值的時候先按照找到值,然后回傳結果,
Memcahce采用LRU演算法來逐漸把過期資料清除掉,
24、優化MYSQL資料庫的方法
(1)選擇最有效率的表名順序
(2)WHERE子句中的連接順序
(3)SELECT子句中避免使用‘*’
(4)用Where子句替換HAVING子句
(5)通過內部函式提高SQL效率
(6)避免在索引列上使用計算,
(7)提高GROUP BY 陳述句的效率, 可以通過將不需要的記錄在GROUP BY 之前過濾掉,
(1).選取最適用的欄位屬性,應該盡量把欄位設定為NOT NULL
(2).使用連接(JOIN)來代替子查詢(Sub-Queries)
(3).使用聯合(UNION)來代替手動創建的臨時表
(4).盡量少使用 LIKE 關鍵字和通配符
(5).使用事務和外鍵
25、MySQL主從備份的原理?
mysql支持單向、異步復制,復制程序中一個服務器充當主服務器,而一個或多個其它服務器充當從服務器,
26、error_reporting() 的作用?
設定 PHP 的報錯級別并回傳當前級別,
27、如何修改session的生存時間
在php.ini 中設定 session.gc_maxlifetime = 1440 //默認時
代碼實作
$lifeTime = 24 * 3600; // 保存一天
session_set_cookie_params($lifeTime);
session_start();
28、常見的 PHP 安全性攻擊
SQL注入:用戶利用在表單欄位輸入SQL陳述句的方式來影響正常的SQL執行,
防止:
使用mysql_real_escape_string()過濾資料
手動檢查每一資料是否為正確的資料型別
使用預處理陳述句并系結變數
引數化SQL:是指在設計與資料庫鏈接并訪問資料時,在需要填入數值或資料的地方,使用引數 (Parameter) 來給值,用@或?來表示引數,
XSS攻擊 :跨站點腳本攻擊,由用戶輸入一些資料到你的網站,其中包括客戶端腳本(通常JavaScript),如果你沒有過濾就輸出資料到另一個web頁面,這個腳本將被執行,
防止:為了防止XSS攻擊,使用PHP的htmlentities()函式過濾再輸出到瀏覽器,
CSRF:跨站點請求偽造,是指一個頁面發出的請求,看起來就像是網站的信任用戶,但是是偽造的
防止:一般來說,確保用戶來自你的表單,并且匹配每一個你發送出去的表單,有兩點一定要記住:
對用戶會話采用適當的安全措施,例如:給每一個會話更新id和用戶使用SSL,
生成另一個一次性的令牌并將其嵌入表單,保存在會話中(一個會話變數),在提交時檢查它, 如laravel中的 _token
代碼注入:代碼注入是利用計算機漏洞通過處理無效資料造成的,問題出在,當你不小心執行任意代碼,通常通過檔案包含,寫得很糟糕的代碼可以允許一個遠程檔案包含并執行,如許多PHP函式,如require可以包含URL或檔案名,
防止代碼注入
過濾用戶輸入
在php.ini中設定禁用allow_url_fopen和allow_url_include,這將禁用require/include/fopen的遠程檔案
點關注,不迷路
好了各位,以上就是這篇文章的全部內容了,能看到這里的人呀,都是人才,之前說過,PHP方面的技術點很多,也是因為太多了,實在是寫不過來,寫過來了大家也不會看的太多,所以我這里把它整理成了PDF和檔案,如果有需要的可以
點擊進入暗號: 博客園


更多學習內容可以訪問【對標大廠】精品PHP架構師教程目錄大全,只要你能看完保證薪資上升一個臺階(持續更新)
以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那里入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴展、高性能、高并發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家,需要的可以加入我的PHP技術交流群953224940
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/378.html
標籤:PHP
下一篇:最簡單的自定義類的徹底理解
