大廠最全面試題:分享一波騰訊PHP面試題2021最新大廠PHP面試題(附答案)php面試題之PHP核心技術PHP 2021經典面試題集100 個常見的 PHP 面試題和答案分享面試10家公司,收獲9個offer,2021年PHP 面試問題1. 實現刪除一個數組里面的重復值?
使用鍵值反轉
最全PHP進階架構資料,為打造自己可以在工作中休息時間學習哦!!
array_flip();
$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
$result=array_flip($a1);
print_r($result);
?>
function unique3(array){
var n=[array[0]];//結果數組
//從第二項開始遍歷
for(var i=1; i<array.length; i++){
//如果當前數組的第i項在當前數組中第一次出現的位置不是i;
//那么表示第i項是重復的,忽略掉。否則存入結果數組。
if(array.indexOf(array[i])==i){
n.push(array[i]);
}
}
return n;}2. 什么是 redis?
開源 先進的 key-value 存儲
遠程字典服務器 內存級數據庫 數據結構服務器
一個基於內存的網絡存儲系統
3is 數據類型有哪幾種?
值(value)可以是:字符串 (String),
哈希 (hash),
列表 (list),
集合 (sets)
有序集合 (sorted sets)
4is 持久化是如何操作的?
為了保證效率數據都緩存在內存中,可以周期性寫入磁盤或者把修改操作寫入文件(持久化)。
RDB 持久化,將 redis 在內存中的的狀態保存到硬盤中,相當於備份數據庫狀態。
AOF 持久化(Append-Only-File),AOF 持久化是通過保存 Redis 服務器鎖執行的寫狀態來記錄數據庫的。相當於備份數據庫接收到的命令,所有被寫入 AOF 的命令都是以 redis 的協議格式來保存的。
社區福利安排PHP進階架構資料,免費獲取5is 適應的一些場景
1、取最新 N 個數據的操作
2、排行榜應用,取 TOP N 操作
3、需要精准設定過期時間的應用
4、計數器應用
5、Uniq 操作,獲取某段時間所有數據排重值
6、實時系統,反垃圾系統
7、Pub/Sub 構建實時消息系統
8、構建隊列系統
9、緩存
6is 的三個特點?
- Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
- Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
- Redis支持數據的備份,即master-slave模式的數據備份。
7.ECS 與虛擬主機的區別介紹
一個是服務器
一個相當於是服務器里的文件夾
雲主機是在集群服務器上划分出來的獨立的內存.硬盤.帶寬等資源搭建而成的 一個虛擬服務器.有獨立的IP和帶寬,可以根據需求安裝各版本操作系統以及 配置各種網站運行環境,有遠程桌面連接東西.是完全獨立的.
而虛擬主機是在服務器硬盤上划分出來的一部分存儲空間,它共享的是服務器 的IP和帶寬.沒有獨立的資源和獨立的操作系統.沒有遠程桌面功能,通常虛擬主機所支持的網站程序也是默認分配好的.沒有辦法由用戶自己配置環境.功能相對單一.
8. 重啟 redis
service redis-server restart
9. 有序集合是怎么排序的?
? 它給集合中的每一個元素設置分數,按照其分數進行排序,也不允許有重復值
10. 談談你對 memcache 的理解
免費並且開源,高性能的,分布式的內存對象緩存系統
數據形態以key->value結構
用於從數據庫調用、API調用或頁面呈現的結果中獲得少量任意數據(字符串、對象)。
11. 談談你對 redis 的理解
- 開源 先進的key-value存儲
- 遠程字典服務器 內存級數據庫 數據結構服務器
- 一個基於內存的網絡存儲系統
五種數據類型 字符串(String), 哈希(hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)
三個特點: Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存 儲。
Redis支持數據的備份,即master-slave模式的數據備份。
應用場景:
1、取最新 N 個數據的操作
2、排行榜應用,取 TOP N 操作
3、需要精准設定過期時間的應用
4、計數器應用
5、Uniq 操作,獲取某段時間所有數據排重值
6、實時系統,反垃圾系統
7、Pub/Sub 構建實時消息系統
8、構建隊列系統
9、緩存
12. memcached 與 redis 的區別
兩者對比:
redis提供數據持久化功能,memcached無持久化;redis的數據結構比memcached要豐富,能完成場景以外的事情;memcached的單個key限制在250B,value限制在1MB;redis的K、V都為512MB;當然這些值可以在源碼中修改;memcached數據回收基於LRU算法,Redis提供了多種回收策略(包含LRU),但是redis的回收策的過期邏輯不可依賴,沒法根據是否存在一個key判斷是否過期。但是可根據ttl返回值判斷是否過期;memcached使用多線程,而redis使用單線程,基於IO多路復用實現高速訪問。所以可以理解為在極端情況下memcached的吞吐大於redis。
結論:
普通KV場景:memcached、redis都可以。
從功能模塊單一這個角度考慮的話,推薦memcached,只做cache一件事。
在KV長度偏大、數據結構復雜(比如取某個value的一段數據)、需要持久化的情況下,用redis更適合:但是在使用redis的時候單個請求的阻塞會導致后續請求的積壓,需要注意
13. 緩存的原理
? 有緩存則讀緩存,沒緩存則讀數據庫然后做緩存
14. memcache 和 memcached 的區別
memcached是php連接memcached服務器的php擴展它的名字就叫memcached
以前有個叫memcache也是php連接memcached服務器的擴展,它的名字叫memcache
php的memcache和memcached擴展都是作為客戶端去連接memcached服務器
但memcached作為客戶端比memcache性能更好功能更強大,而且memcache已經停止更新了,因此現在使用擴展的 話就用memcached
15. 存放 session 的三種方法
1、如果你能修改到服務器配置文件,那就打開打開php.ini
修改下面兩項:
session.save_handler=memcache
session.save_path="tcp://127.0.0.1:11211"
2、修改網站根目錄下的.htaccess文件
php_value session.save_handler "memcache"
php_value session.save_path "tcp://127.0.0.1:11211"
3、最常用的方法 在程序代碼中修改(推薦)
ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://127.0.0.1:11211");
16. mysql 優化的一般步驟?
1. sql及索引
索引優化
開啟慢查詢日志 分析sql語句 分析是否加上索引 分析是否用上索引
2. 數據庫表結構
3.系統配置
4. 優化計算機硬件
17. 對 mysql 事物的理解?
是多個步驟為一個過程的事務(整體)
1. 事務使用 INNODB 數據庫引擎
如果你不是INNODB ,開啟事務,刪除那就真的刪除了.
2. 要么成批的sql全部執行,要么不執行
3. 事務用來管理 insert update delete 的語句
事務條件:
原子性 一組事務,要么成功,要么撤回.
穩定性 有非法數據(外鍵約束),事務撤回
隔離性 事務獨立運行. 一個事務,處理后的結果影響到了其他事務,則事務撤回!
可靠性 軟件或者硬件崩潰,Innodb 表驅動,會利用日志文件,重構修改. 可靠 性 高速度 不可兼得
關鍵字:
Commit 提交 當一個事務完成后,發出commit 命令使所有的參與表 完成更改.
Rollback 回滾 如果發送故障,發出rollback命令 使事務返回到 所有表以前的狀態.
語句:
set autocommit=0;
sql操作
savepoint p1;
sql操作
savepoint p2;
sql操作
ROLLBACK to p2;
commit;
18. mysql 觸發器是什么?
? 監視某種事件,並觸發某種操作 (商品的添加,訂單的刪除 等等 連貫操作時候使用)
###觸發四要素
1. 監視地點 table
2. 觸發時間 (after/ before)
3. 監視事件 (insert/update/delete)
4. 觸發事件 (insert/update/delete)
1、創建一個名為tg1的觸發器,當向t1表中插入數據前,就向a表中插入一條數據
delimiter // mysql中可以轉換結束符
mysql>create trigger tg1 before insert on t1 for each row #固定寫法
->begin
-> insert into a values (4);
->end//
19. 什么是組合索引,及使用情況?
將兩個字段共同添加一條索引
例子:當前組合索引是這樣一個順序 ind_status_email(status,email)
單獨查詢status時,可以用到這個索引,單獨查詢email時,卻用不到
再問: id name password 建立組合索引 怎么建立?為什么?
name,password
因為先到先得, name查詢是多!!! 很少會通過password來查
先到先得 如何設置我索引?
根據字段的辨識度來做
20. 為什么 like 在 % 第一個字符用不到索引?
like % 校 會查處當前所有的姓,再去查名中有沒有校 所以 會進行全表掃描,浪費性能
21. 測試分析 sql 語句
普通查詢分析:
desc select * from users 或 explain select * from users 效果一樣
關鍵字段: table:輸出結果集的表名
key:表示實際使用的索引
keys_possible (可能用到的索引)
rows:掃描行的數量
22. 為什么不分開加索引?而非要加組合索引?
1. 索引不是越多越好. 浪費資源 索引暫用資源,影響插入性能