php面试的作品是看视频做吗,谈谈我在PHP面试时踩过的坑 找工作必看
1.get,post 的區(qū)別
顯示有區(qū)別
get方法是將字符串拼接在地址欄后面可以看見
而post方法看不見
傳遞的大小有區(qū)別
具體大小和瀏覽器有關(guān)系,ie瀏覽器是2k其他瀏覽器的最大值可能不同,但是也比較小。
而post方法傳遞參數(shù)的大小是可以設(shè)定的,原來(lái)是認(rèn)為無(wú)限大。在Php當(dāng)中在php.ini文件是可以設(shè)置參數(shù)的大小的。
安全性
get方法安全性比較低因?yàn)楸┞对谕饷?/p>
而post方法安全性比較高
提交的原理
get方法提交的數(shù)據(jù)都是獨(dú)立的。
而Post方法將所有的提交的數(shù)據(jù)變成一個(gè)整體(將提交的數(shù)據(jù)變成xml格式)
靈活性
get方法很靈活,
post方法不靈活,必須要有表單的參與才能用post提交很不方便
2.require,include 區(qū)別
require是無(wú)條件包含也就是如果一個(gè)流程里加入require,無(wú)論條件成立與否都會(huì)先執(zhí)行require
include有返回值,而require沒有(可能因?yàn)槿绱藃equire的速度比include快)
包含文件不存在或者語(yǔ)法錯(cuò)誤的時(shí)候require是致命的錯(cuò)誤終止執(zhí)行,include不是
3.獲取 URL 后綴名
pathinfo()解析文件路徑,返回其組成部分;
返回關(guān)聯(lián)數(shù)組
dirname 文件路徑
basename 文件名+擴(kuò)展名
extension 最后一個(gè)擴(kuò)展名
filename 文件名
eg: print_r( pathinfo('/ab/cd/e.php') );
Array(
[dirname] => /ab/cd
[basename] => e.php
[extension] => php
[filename] => e
)
擴(kuò)展:
打印解析路徑 var_dump( pathinfo($path) );
打印路徑的父級(jí)路徑 var_dump( pathinfo($path, PATHINFO_DIRNAME) );
打印路徑的尾名 var_dump( pathinfo($path, PATHINFO_BASENAME) );
打印路徑的最后的擴(kuò)展名 var_dump( pathinfo($path, PATHINFO_EXTENSION) );
打印路徑的文件的名字 var_dump( pathinfo($path, PATHINFO_FILENAME) );
4.tcp,udp,http 區(qū)別
5.獲取上級(jí)目錄的方法
echo __FILE__ ; // 獲取當(dāng)前所在文件的絕對(duì)路徑及地址,結(jié)果:D:\aaa\my.php
echo dirname(__FILE__); // 取得當(dāng)前文件所在的絕對(duì)目錄,結(jié)果:D:\aaa\
echo dirname(dirname(__FILE__)); //取得當(dāng)前文件的上一層目錄名,結(jié)果:D:\
6.數(shù)據(jù)庫(kù)主從復(fù)制,讀寫分離
什么是主從復(fù)制
主從復(fù)制,是用來(lái)建立一個(gè)和主數(shù)據(jù)庫(kù)完全一樣的數(shù)據(jù)庫(kù)環(huán)境,稱為從數(shù)據(jù)庫(kù);
主從復(fù)制的原理:
1)數(shù)據(jù)庫(kù)有個(gè)bin-log二進(jìn)制文件,記錄了所有的sql語(yǔ)句。
2)只需要把主數(shù)據(jù)庫(kù)的bin-log文件中的sql語(yǔ)句復(fù)制。
3)讓其從數(shù)據(jù)的relay-log重做日志文件中在執(zhí)行一次這些sql語(yǔ)句即可。
主從復(fù)制的作用
1)做數(shù)據(jù)的熱備份,作為后備數(shù)據(jù)庫(kù),主數(shù)據(jù)庫(kù)服務(wù)器故障后,可切換到從數(shù)據(jù)庫(kù)繼續(xù)工作,避免數(shù)據(jù)丟失。
2)架構(gòu)的擴(kuò)展。業(yè)務(wù)量越來(lái)越大,I/O訪問頻率過高,單機(jī)無(wú)法滿足,此時(shí)做多庫(kù)的存儲(chǔ),降低磁盤I/O訪問頻率,提高單機(jī)的I/O性能
3)主從復(fù)制是讀寫分離的基礎(chǔ),使數(shù)據(jù)庫(kù)能制成更大 的并發(fā)。例如子報(bào)表中,由于部署報(bào)表的sql語(yǔ)句十分慢,導(dǎo)致鎖表,影響前臺(tái)的服務(wù)。如果前臺(tái)服務(wù)使用master,報(bào)表使用slave,那么報(bào)表sql將不會(huì)造成前臺(tái)所,保證了前臺(tái)的訪問速度。
主從復(fù)制的幾種方式:
1)同步復(fù)制:所謂的同步復(fù)制,意思是master的變化,必須等待slave-1,slave-2,...,slave-n完成后才能返回。
2)異步復(fù)制:如同AJAX請(qǐng)求一樣。master只需要完成自己的數(shù)據(jù)庫(kù)操作即可。至于slaves是否收到二進(jìn)制日志,是否完成操作,不用關(guān)心。MYSQL的默認(rèn)設(shè)置。
3)半同步復(fù)制:master只保證slaves中的一個(gè)操作成功,就返回,其他slave不管。
這個(gè)功能,是由google為MYSQL引入的。
關(guān)于讀寫分離
在完成主從復(fù)制時(shí),由于slave是需要同步master的。所以對(duì)于insert/delete/update這些更新數(shù)據(jù)庫(kù)的操作,應(yīng)該在master中完成。而select的查詢操作,則落下到slave中。
7.數(shù)據(jù)庫(kù)索引
什么是索引
索引是對(duì)數(shù)據(jù)庫(kù)表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu),使用索引可快速訪問數(shù)據(jù)庫(kù)表中的特定信息。(摘自百度百科)
索引類型
1)FULLTEXT 全文索引
全文索引,僅MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不過目前只有 CHAR、VARCHAR ,TEXT 列上可以創(chuàng)建全文索引。
2)HASH 哈希索引
HASH索引的唯一性及類似鍵值對(duì)的形式十分適合作為索引,HASH索引可以一次定位,不需要像樹形索引那樣逐層參照,因此具有極高的效率。但是這種高效是有條件的。即只在“=”和“in”條件下高效,對(duì)于范圍查詢,排序及組合索引仍然效率不高。
3)BTREE 樹形索引
BTREE所以是一種將索引按一定算法,存入一個(gè)樹形的數(shù)據(jù)結(jié)構(gòu)中(二叉樹),每次查詢都是從樹的入口root開始,一次遍歷node,獲取leaf。這是MySQL中默認(rèn)也是最常用的索引類型。
4)RTREE
RTREE在MySQL中很少使用,僅支持geometry數(shù)據(jù)類型,支持該存儲(chǔ)引擎只有MyISAM、BDb、InnoDb、NDb、Archive幾種。相對(duì)于BTREE,RTREE的優(yōu)勢(shì)在于范圍查找。
索引種類
普通索引:僅加速查詢
唯一索引:加速查詢+列值唯一(可以有null)
主鍵索引:加速查詢+列值唯一(不可以有null)+表中只有一個(gè)
組合索引:多列值組成一個(gè)索引,專門用于組合搜索,其效率大于索引合并
全文索引:對(duì)文本內(nèi)容進(jìn)行分詞,進(jìn)行搜索
外鍵索引:與主鍵索引形成聯(lián)系,保證數(shù)據(jù)的完整性。
索引使用的注意事項(xiàng)
1)符合索引遵循前綴原則
2)like查詢%不能再前,否則索引失效。如有需要,使用全文索引
3)column is null可以使用索引
4)如果MySQL估計(jì)使用索引比全表掃描慢,則放棄使用索引
5)如果or前的條件中列有索引,后面的沒有,索引不會(huì)生效。
6)列類型是字符串,查詢時(shí),一定要給值加引號(hào),否則索引失效。
7)確定order by 和 group by 中只有一個(gè)表的列,這樣才能使用索引
8.高并發(fā)的解決方案
web服務(wù)器優(yōu)化 :負(fù)載均衡
流量?jī)?yōu)化:防盜鏈處理 將惡意請(qǐng)求屏蔽,
前端優(yōu)化:減少http請(qǐng)求、添加異步請(qǐng)求、啟用瀏覽器緩存和文件壓縮、cdn加速、建立獨(dú)立的圖片服務(wù)器、
服務(wù)端優(yōu)化: 頁(yè)面靜態(tài)化、并發(fā)處理、隊(duì)列處理、
數(shù)據(jù)庫(kù)優(yōu)化: 數(shù)據(jù)庫(kù)緩存、分庫(kù)分表、分區(qū)操作 、讀寫分離、負(fù)載均衡
9.MVC 的理解
1)Model(業(yè)務(wù)模型):應(yīng)用程序中用于處理應(yīng)用程序數(shù)據(jù)邏輯的部分,通常模型對(duì)象負(fù)責(zé)在數(shù)據(jù)庫(kù)中存取數(shù)據(jù)。
2)view(視圖):應(yīng)用程序中處理數(shù)據(jù)顯示的部分。通常視圖是依據(jù)模型數(shù)據(jù)創(chuàng)建的。
3)controller(控制器):應(yīng)用程序中處理用戶交互的部分。通常控制器負(fù)責(zé)從視圖讀取數(shù)據(jù),控制用戶輸入,并向模型發(fā)送數(shù)據(jù)。
10.常用的文件操作函數(shù)
1)獲得文件名:
basename — 返回路徑中的文件名部分
$path = "/home/cate/index/index2.php";\
$file = basename($path);\
echo $file; //結(jié)果index2.php
2)獲得目錄名
dirname — 返回路徑中的目錄部分
$path = "/home/cate/index/index2.php";\
$file = dirname($path);\
echo $file;//結(jié)果/home/cate/index
3)得到路徑關(guān)聯(lián)數(shù)組
pathinfo() 函數(shù)以數(shù)組的形式返回關(guān)于文件路徑的信息。
返回的數(shù)組元素如下:
(1)[dirname]: 目錄路徑
(2)[basename]: 文件名
(3)[extension]: 文件后綴名
(4)[filename]: 不包含后綴的文件名
pathinfo(path,options)
| path | 必需。規(guī)定要檢查的路徑。 |
| options | 可選。規(guī)定要返回的數(shù)組元素。默認(rèn)是 all。
可能的值:
PATHINFO_DIRNAME - 只返回 dirname
PATHINFO_BASENAME - 只返回 basename
PATHINFO_EXTENSION - 只返回 extension
PATHINFO_FILENAME - 只返回 filename
4)filesize取得文件大小
filesize ( string $filename )
返回文件大小的字節(jié)數(shù),如果出錯(cuò)返回 FALSE 并生成一條 E_WARNING 級(jí)的錯(cuò)誤。
判斷目錄是否存在
$lujing = "./nihao/wohao";
if(!is_dir($liujing)){
mkdir(iconv("UTF-8", "GBK", $lujing),0777,true);
}
判斷文件是否存在
file_exists(path);
11.常見的排序算法
1)冒泡排序
思路分析:在要排序的一組數(shù)中,對(duì)當(dāng)前還未排好的序列,從前往后對(duì)相鄰的兩個(gè)數(shù)依次進(jìn)行比較和調(diào)整,讓較大的數(shù)往下沉,較小的往上冒。即,每當(dāng)兩相鄰的數(shù)比較后發(fā)現(xiàn)它們的排序與排序要求相反時(shí),就將它們互換。
代碼實(shí)現(xiàn):
$arr=array(1,43,54,62,21,66,32,78,36,76,39);
function bubbleSort($arr)
{
$len=count($arr);
//該層循環(huán)控制 需要冒泡的輪數(shù)
for($i=1;$i
{ //該層循環(huán)用來(lái)控制每輪 冒出一個(gè)數(shù) 需要比較的次數(shù)
for($k=0;$k
{
if($arr[$k]>$arr[$k+1])
{
$tmp=$arr[$k+1];
$arr[$k+1]=$arr[$k];
$arr[$k]=$tmp;
}
}
}
return $arr;
}
2)選擇排序
思路分析:在要排序的一組數(shù)中,選出最小的一個(gè)數(shù)與第一個(gè)位置的數(shù)交換。然后在剩下的數(shù)當(dāng)中再找最小的與第二個(gè)位置的數(shù)交換,如此循環(huán)到倒數(shù)第二個(gè)數(shù)和最后一個(gè)數(shù)比較為止。
代碼實(shí)現(xiàn):
function selectSort($arr) {
//雙重循環(huán)完成,外層控制輪數(shù),內(nèi)層控制比較次數(shù)
$len=count($arr);
for($i=0; $i
//先假設(shè)最小的值的位置
$p = $i;
for($j=$i+1; $j
//$arr[$p] 是當(dāng)前已知的最小值
if($arr[$p] > $arr[$j]) {
//比較,發(fā)現(xiàn)更小的,記錄下最小值的位置;并且在下次比較時(shí)采用已知的最小值進(jìn)行比較。
$p = $j;
}
}
//已經(jīng)確定了當(dāng)前的最小值的位置,保存到$p中。如果發(fā)現(xiàn)最小值的位置與當(dāng)前假設(shè)的位置$i不同,則位置互換即可。
if($p != $i) {
$tmp = $arr[$p];
$arr[$p] = $arr[$i];
$arr[$i] = $tmp;
}
}
//返回最終結(jié)果
return $arr;
}
3)插入排序
思路分析:在要排序的一組數(shù)中,假設(shè)前面的數(shù)已經(jīng)是排好順序的,現(xiàn)在要把第n個(gè)數(shù)插到前面的有序數(shù)中,使得這n個(gè)數(shù)也是排好順序的。如此反復(fù)循環(huán),直到全部排好順序。
代碼實(shí)現(xiàn):
function insertSort($arr) {
$len=count($arr);
for($i=1, $i
$tmp = $arr[$i];
//內(nèi)層循環(huán)控制,比較并插入
for($j=$i-1;$j>=0;$j--) {
if($tmp < $arr[$j]) {
//發(fā)現(xiàn)插入的元素要小,交換位置,將后邊的元素與前面的元素互換
$arr[$j+1] = $arr[$j];
$arr[$j] = $tmp;
} else {
//如果碰到不需要移動(dòng)的元素,由于是已經(jīng)排序好是數(shù)組,則前面的就不需要再次比較了。
break;
}
}
}
return $arr;
}
4)快速排序
思路分析:選擇一個(gè)基準(zhǔn)元素,通常選擇第一個(gè)元素或者最后一個(gè)元素。通過一趟掃描,將待排序列分成兩部分,一部分比基準(zhǔn)元素小,一部分大于等于基準(zhǔn)元素。此時(shí)基準(zhǔn)元素在其排好序后的正確位置,然后再用同樣的方法遞歸地排序劃分的兩部分。
代碼實(shí)現(xiàn):
function quickSort($arr) {
//先判斷是否需要繼續(xù)進(jìn)行
$length = count($arr);
if($length <= 1) {
return $arr;
}
//選擇第一個(gè)元素作為基準(zhǔn)
$base_num = $arr[0];
//遍歷除了標(biāo)尺外的所有元素,按照大小關(guān)系放入兩個(gè)數(shù)組內(nèi)
//初始化兩個(gè)數(shù)組
$left_array = array(); //小于基準(zhǔn)的
$right_array = array(); //大于基準(zhǔn)的
for($i=1; $i
if($base_num > $arr[$i]) {
//放入左邊數(shù)組
$left_array[] = $arr[$i];
} else {
//放入右邊
$right_array[] = $arr[$i];
}
}
//再分別對(duì)左邊和右邊的數(shù)組進(jìn)行相同的排序處理方式遞歸調(diào)用這個(gè)函數(shù)
$left_array = quick_sort($left_array);
$right_array = quick_sort($right_array);
//合并
return array_merge($left_array, array($base_num), $right_array);
}
12.接口與抽象類的區(qū)別
1)接口
(1)對(duì)接口的使用是通過關(guān)鍵字implements
(2)接口不能定義成員變量(包括類靜態(tài)變量),能定義常量
(3)子類必須實(shí)現(xiàn)接口定義的所有方法
(4)接口只能定義不能實(shí)現(xiàn)該方法
(5)接口沒有構(gòu)造函數(shù)
(6)接口中的方法和實(shí)現(xiàn)它的類默認(rèn)都是public類型的
2)抽象類
(1)對(duì)抽象類的使用是通過關(guān)鍵字extends
(2)不能被實(shí)例化,可以定義子類必須實(shí)現(xiàn)的方法
(3)子類必須定義父類中的所有抽象方法,這些方法的訪問控制必須和父類中一樣(或者更為寬松)
(4)如一個(gè)類中有一個(gè)抽象方法,則該類必須定義為抽象類
(5)抽象類可以有構(gòu)造函數(shù)
(6)抽象類中的方法可以使用private,protected,public來(lái)修飾。
(7)一個(gè)類可以同時(shí)實(shí)現(xiàn)多個(gè)接口,但一個(gè)類只能繼承于一個(gè)抽象類。
3)Final類/方法
(1)final類不能被繼承
(2)final方法不能被重寫
4)Static類/方法
(1)可以不實(shí)例化類而直接訪問
(2)靜態(tài)屬性不可以由對(duì)象通過->操作符來(lái)訪問,用::方式調(diào)用
13.innoDB,MyISAM 的區(qū)別
MyISAM:
不支持事務(wù);
數(shù)據(jù)存儲(chǔ)在磁盤,可被壓縮,存儲(chǔ)空間較小;
只支持表級(jí)鎖;
支持(FULLTEXT類型的)全文索引。
保存有表的總行數(shù),如果select count(*) from table,會(huì)直接取出該值;
如果執(zhí)行大量的SELECT,MyISAM是更好的選擇;
不支持外鍵;
InnoDB:
支持事務(wù);
存儲(chǔ)在共享空間,需要更多的內(nèi)存和存儲(chǔ);
具有事務(wù)、回滾和崩潰修復(fù)能力;
只支持行級(jí)鎖;
不支持(FULLTEXT類型的)全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好;
支持外鍵;
如果你的數(shù)據(jù)執(zhí)行大量的INSERT或UPDATE,出于性能方面的考慮,應(yīng)該使用InnoDB表。
MyISAM和InnoDB兩者的應(yīng)用場(chǎng)景:\
MyISAM管理非事務(wù)表。它提供高速存儲(chǔ)和檢索,以及全文搜索能力。如果應(yīng)用中需要執(zhí)行大量的SELECT查詢,那么MyISAM是更好的選擇。\
InnoDB用于事務(wù)處理應(yīng)用程序,具有眾多特性,包括ACID事務(wù)支持。如果應(yīng)用中需要執(zhí)行大量的INSERT或UPDATE操作,則應(yīng)該使用InnoDB,這樣可以提高多用戶并發(fā)操作的性能。
14.常見的設(shè)計(jì)模式
策略模式
策略模式是對(duì)象的行為模式,用意是對(duì)一組算法的封裝。動(dòng)態(tài)的選擇需要的算法并使用。
策略模式指的是程序中涉及決策控制的一種模式。策略模式功能非常強(qiáng)大,因?yàn)檫@個(gè)設(shè)計(jì)模式本身的核心思想就是面向?qū)ο缶幊痰亩嘈涡运枷搿?/p>
策略模式的三個(gè)角色:
1)抽象策略角色
2)具體策略角色
3)環(huán)境角色(對(duì)抽象策略角色的引用)
實(shí)現(xiàn)步驟:
1)定義抽象角色類(定義好各個(gè)實(shí)現(xiàn)的共同抽象方法)
2)定義具體策略類(具體實(shí)現(xiàn)父類的共同方法)
3)定義環(huán)境角色類(私有化申明抽象角色變量,重載構(gòu)造方法,執(zhí)行抽象方法)
就在編程領(lǐng)域之外,有許多例子是關(guān)于策略模式的。例如:
如果我需要在早晨從家里出發(fā)去上班,我可以有幾個(gè)策略考慮:我可以乘坐地鐵,乘坐公交車,走路或其它的途徑。每個(gè)策略可以得到相同的結(jié)果,但是使用了不同的資源。
工廠模式
工廠模式是我們最常用的實(shí)例化對(duì)象模式,是用工廠方法代替new操作的一種模式。
使用工廠模式的好處是,如果你想要更改所實(shí)例化的類名等,則只需更改該工廠方法內(nèi)容即可,不需逐一尋找代碼中具體實(shí)例化的地方(new處)修改了。為系統(tǒng)結(jié)構(gòu)提供靈活的動(dòng)態(tài)擴(kuò)展機(jī)制,減少了耦合。
單例模式
單例模式確保某個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。
單例模式是一種常見的設(shè)計(jì)模式,在計(jì)算機(jī)系統(tǒng)中,線程池、緩存、日志對(duì)象、對(duì)話框、打印機(jī)、數(shù)據(jù)庫(kù)操作、顯卡的驅(qū)動(dòng)程序常被設(shè)計(jì)成單例。
單例模式分3種:懶漢式單例、餓漢式單例、登記式單例。
單例模式有以下3個(gè)特點(diǎn):
1)只能有一個(gè)實(shí)例。
2)必須自行創(chuàng)建這個(gè)實(shí)例。
3)必須給其他對(duì)象提供這一實(shí)例。
那么為什么要使用PHP單例模式?
PHP一個(gè)主要應(yīng)用場(chǎng)合就是應(yīng)用程序與數(shù)據(jù)庫(kù)打交道的場(chǎng)景,在一個(gè)應(yīng)用中會(huì)存在大量的數(shù)據(jù)庫(kù)操作,針對(duì)數(shù)據(jù)庫(kù)句柄連接數(shù)據(jù)庫(kù)的行為,使用單例模式可以避免大量的new操作。因?yàn)槊恳淮蝞ew操作都會(huì)消耗系統(tǒng)和內(nèi)存的資源。
注冊(cè)模式
注冊(cè)模式,解決全局共享和交換對(duì)象。已經(jīng)創(chuàng)建好的對(duì)象,掛在到某個(gè)全局可以使用的數(shù)組上,在需要使用的時(shí)候,直接從該數(shù)組上獲取即可。將對(duì)象注冊(cè)到全局的樹上。任何地方直接去訪問。
適配器模式
將各種截然不同的函數(shù)接口封裝成統(tǒng)一的API。 \
PHP中的數(shù)據(jù)庫(kù)操作有MySQL,MySQLi,PDO三種,可以用適配器模式統(tǒng)一成一致,使不同的數(shù)據(jù)庫(kù)操作,統(tǒng)一成一樣的API。類似的場(chǎng)景還有cache適配器,可以將memcache,redis,file,apc等不同的緩存函數(shù),統(tǒng)一成一致。 \
首先定義一個(gè)接口(有幾個(gè)方法,以及相應(yīng)的參數(shù))。然后,有幾種不同的情況,就寫幾個(gè)類實(shí)現(xiàn)該接口。將完成相似功能的函數(shù),統(tǒng)一成一致的方法。
15.寫出乘法表的算法
1)九九乘法表 for 實(shí)現(xiàn):
for($i=1;$i<10;$i++){
for($j=1;$j<=$i;$j++){
echo $i.'*'.$j.'='.$i*$j.' ';
}
echo '
';
}
2)九九乘法表 while 實(shí)現(xiàn):
$m = 1;
while($m<10){
$n = 1;
while($n<=$m){
echo $m.'*'.$n.'='.$m*$n.' ';
$n++;
}
echo '
';
$m++;}
16.echo,print_r ,print,var_dump 區(qū)別
echo是PHP語(yǔ)句, print和print_r是函數(shù),語(yǔ)句沒有返回值,函數(shù)可以有返回值(即便沒有用)
print() 只能打印出簡(jiǎn)單類型變量的值(如int,string)
print_r() 可以打印出復(fù)雜類型變量的值(如數(shù)組,對(duì)象)
echo 輸出一個(gè)或者多個(gè)字符串
echo:語(yǔ)句結(jié)構(gòu);
print:是函數(shù),有返回值
print_r:能打印數(shù)組,對(duì)象
var_dump:能打印對(duì)象數(shù)組,并且?guī)?shù)據(jù)類型
17.session 和 cookie 的區(qū)別
session:儲(chǔ)存用戶訪問的全局唯一變量,存儲(chǔ)在服務(wù)器上的php指定的目錄中的(session_dir)的位置進(jìn)行的存放
cookie:用來(lái)存儲(chǔ)連續(xù)訪問一個(gè)頁(yè)面時(shí)所使用,是存儲(chǔ)在客戶端,對(duì)于Cookie來(lái)說(shuō)是存儲(chǔ)在用戶WIN的Temp目錄中的。
兩者都可通過時(shí)間來(lái)設(shè)置時(shí)間長(zhǎng)短
18.用 PHP 寫出顯示客戶端 IP 與服務(wù)器 IP 的代碼
客戶端:$_SERVER["REMOTE_ADDR"]
服務(wù)器:$_SERVER["SERVER_ADDR"]
19.sql 語(yǔ)句應(yīng)該考慮哪些安全性
(1)防止sql注入,對(duì)特殊字符進(jìn)行轉(zhuǎn)義,過濾或者使用預(yù)編譯sql語(yǔ)句綁定
(2)使用最小權(quán)限原則,特別是不要使用root賬戶,為不同的動(dòng)作或者操作建立不同的賬戶
(3)當(dāng)sql出錯(cuò)時(shí),不要把數(shù)據(jù)庫(kù)出錯(cuò)的信息暴露到客戶端
20.優(yōu)化 mysqi 數(shù)據(jù)庫(kù)的方法
(1)選取適當(dāng)?shù)淖侄?#xff0c;打字段設(shè)置為NOT NULL,在查詢的時(shí)候數(shù)據(jù)庫(kù)不用比較NULL;
(2)使用鏈接(join)代替子查詢;
(3)使用聯(lián)合(UNION)查詢代替手動(dòng)創(chuàng)建臨時(shí)表;
(4)盡量減少使用(LIKE)關(guān)鍵字和通配符
(5)使用事務(wù)和外健
21.對(duì)于大流量的網(wǎng)站,你會(huì)采用什么方法來(lái)解決訪問量?
(1)首先確認(rèn)服務(wù)器硬件是否滿足支持當(dāng)前的流量;
(2)優(yōu)化數(shù)據(jù)庫(kù)的訪問;
(3)禁止外部盜鏈;
(4)控制大文件下載;
(5)使用不同的主機(jī)分流;
(6)使用流量分析統(tǒng)計(jì);
22.isset (),empty () 的區(qū)別
isset():
若變量不存在則返回 FALSE
若變量存在且其值為NULL,也返回 FALSE
若變量存在且值不為NULL,則返回 TURE
同時(shí)檢查多個(gè)變量時(shí),每個(gè)單項(xiàng)都符合上一條要求時(shí)才返回 TRUE,否則結(jié)果為 FALSE
empty():
若變量不存在則返回 TRUE
若變量存在且其值為""、0、"0"、NULL、、FALSE、array()、var $var; 以及沒有任何屬性的對(duì)象,則返回 TURE\
若變量存在且值不為""、0、"0"、NULL、、FALSE、array()、var $var; 以及沒有任何屬性的對(duì)象,則返回 FALSE
23.六大設(shè)計(jì)原則(接 14 點(diǎn)設(shè)計(jì)模式)
1)單一職責(zé)原則:一個(gè)類只負(fù)責(zé)一個(gè)職責(zé)。
2)開閉原則:一個(gè)軟件實(shí)體比如類-模塊-函數(shù),應(yīng)該對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。
3)里氏替換原則:所有引用基類的地方必須透明地使用其子類的對(duì)象,子類必須完全實(shí)現(xiàn)父類的方法,可以拓展自己的方法和屬性,即子類可以擴(kuò)展父類的功能,但是不能改變父類的原有功能。
4)迪米特法則:一個(gè)對(duì)象應(yīng)該對(duì)其他對(duì)象保持最少的了解。
5)接口隔離原則:類間的依賴應(yīng)該建立在最小的接口上。
6)依賴倒置原則:高層模塊不應(yīng)該依賴底層模塊,二者應(yīng)該依賴其抽象;抽象不應(yīng)該依賴細(xì)節(jié);細(xì)節(jié)應(yīng)該依賴抽象;
24.group by 與 distinct 的區(qū)別
25.開發(fā)中應(yīng)該注意哪些安全機(jī)制
1)PHP配置
2)Sql注入,
3)Xss攻擊(cross site script 跨站腳本),
4)盜鏈,
5)CSRF(跨站請(qǐng)求偽造cross site request forgery),
6)CC(是利用不斷對(duì)網(wǎng)站發(fā)送連接請(qǐng)求致使形成拒絕服務(wù)的目的)
26.memcache 和 Redis 的區(qū)別
數(shù)據(jù)結(jié)構(gòu):memcache僅支持簡(jiǎn)單的key-value形式,Redis支持的數(shù)據(jù)更多(string字符串,set集合,list列表,hash散列,zset有序集合);
多線程:memcache支持多線程,Redis支持單線程
持久化:Redis支持持久化,memcache不支持持久化
分布式:Redis做主從結(jié)構(gòu),memcache服務(wù)器需要通過hash一致化來(lái)支撐主從結(jié)構(gòu)
1)Redis中,并不是所有的數(shù)據(jù)都一直存儲(chǔ)在內(nèi)存中的,這是和Memcache相比一個(gè)最大的區(qū)別。
2)Redis在很多方面具備數(shù)據(jù)庫(kù)的特征,或者說(shuō)就是一個(gè)數(shù)據(jù)庫(kù)系統(tǒng),而Memcache只是簡(jiǎn)單的K/V緩存。
3)他們的擴(kuò)展都需要做集群;實(shí)現(xiàn)方式:master-slave、Hash。
4)在100k以上的數(shù)據(jù)中,Memcache性能要高于Redis。
5)如果要說(shuō)內(nèi)存使用效率,使用簡(jiǎn)單的key-value存儲(chǔ)的話,Memcached的內(nèi)存利用率更高,而如果Redis采用hash結(jié)構(gòu)來(lái)做key-value存儲(chǔ),由于其組合式的壓縮,其內(nèi)存利用率會(huì)高于Memcache。當(dāng)然,這和你的應(yīng)用場(chǎng)景和數(shù)據(jù)特性有關(guān)。
6)如果你對(duì)數(shù)據(jù)持久化和數(shù)據(jù)同步有所要求,那么推薦你選擇Redis,因?yàn)檫@兩個(gè)特性Memcache都不具備。即使你只是希望在升級(jí)或者重啟系統(tǒng)后緩存數(shù)據(jù)不會(huì)丟失,選擇Redis也是明智的。
7)Redis和Memcache在寫入性能上面差別不大,讀取性能上面尤其是批量讀取性能上面Memcache更強(qiáng)
27.常用的數(shù)組函數(shù)
數(shù)組的鍵名和值:
array_values($arr); 獲得數(shù)組的值
array_keys($arr); 獲得數(shù)組的鍵名
array_flip($arr); 數(shù)組中的值與鍵名互換(如果有重復(fù)前面的會(huì)被后面的覆蓋)
in_array("apple",$arr); 在數(shù)組中檢索apple
array_search("apple",$arr); 在數(shù)組中檢索apple ,如果存在返回鍵名
array_key_exists("apple",$arr); 檢索給定的鍵名是否存在數(shù)組中
isset($arr[apple]): 檢索給定的鍵名是否存在數(shù)組中
數(shù)組的內(nèi)部指針:
current($arr); 返回?cái)?shù)組中的當(dāng)前單元\
pos($arr); 返回?cái)?shù)組中的當(dāng)前單元\
key($arr); 返回?cái)?shù)組中當(dāng)前單元的鍵名\
prev($arr); 將數(shù)組中的內(nèi)部指針倒回一位\
next($arr); 將數(shù)組中的內(nèi)部指針向前移動(dòng)一位\
end($arr); 將數(shù)組中的內(nèi)部指針指向最后一個(gè)單元\
reset($arr; 將數(shù)組中的內(nèi)部指針指向第一個(gè)單元\
each($arr); 將返回?cái)?shù)組當(dāng)前元素的一個(gè)鍵名/值的構(gòu)造數(shù)組,并使數(shù)組指針向前移動(dòng)一位\
list(
value)=each($arr); 獲得數(shù)組當(dāng)前元素的鍵名和值
數(shù)組的排序:
1)通過元素值對(duì)數(shù)組排序:
sort($arr); 由小到大的順序排序(第二個(gè)參數(shù)為按什么方式排序)忽略鍵名的數(shù)組排序\
rsort($arr); 由大到小的順序排序(第二個(gè)參數(shù)為按什么方式排序)忽略鍵名的數(shù)組排序\
usort($arr,"function"); 使用用戶自定義的比較函數(shù)對(duì)數(shù)組中的值進(jìn)行排序(function中有兩個(gè)參數(shù),0表示相等,正數(shù)表示第一個(gè)大于第二個(gè),負(fù)數(shù)表示第一個(gè)小于第二個(gè))忽略鍵名的數(shù)組排序\
asort($arr); 由小到大的順序排序(第二個(gè)參數(shù)為按什么方式排序)保留鍵名的數(shù)組排序\
arsort($arr); 由大到小的順序排序(第二個(gè)參數(shù)為按什么方式排序)保留鍵名的數(shù)組排序\
uasort($arr,"function"); 使用用戶自定義的比較函數(shù)對(duì)數(shù)組中的值進(jìn)行排序(function中有兩個(gè)參數(shù),0表示相等,正數(shù)表示第一個(gè)大于第二個(gè),負(fù)數(shù)表示第一個(gè)小于第二個(gè))保留鍵名的數(shù)組排序
2)通過鍵名對(duì)數(shù)組排序
ksort($arr); 按照鍵名正序排序\
krsort($arr); 按照鍵名逆序排序\
uksort($arr,"function"); 使用用戶自定義的比較函數(shù)對(duì)數(shù)組中的鍵名進(jìn)行排序(function中有兩個(gè)參數(shù),0表示相等,正數(shù)表示第一個(gè)大于第二個(gè),負(fù)數(shù)表示第一個(gè)小于第二個(gè))
數(shù)組的合并:
array_merge(
arr2); 合并兩個(gè)或多個(gè)數(shù)組(相同的字符串鍵名,后面的覆蓋前面的,相同的數(shù)字鍵名,后面的不會(huì)做覆蓋操作,而是附加到后面)
array_merge_recursive(
arr2); 遞歸合并操作,如果數(shù)組中有相同的字符串鍵名,這些值將被合并到一個(gè)數(shù)組中去。如果一個(gè)值本身是一個(gè)數(shù)組,將按照相應(yīng)的鍵名把它合并為另一個(gè)數(shù)組。當(dāng)數(shù)組 具有相同的數(shù)組鍵名時(shí),后一個(gè)值將不會(huì)覆蓋原來(lái)的值,而是附加到后面
數(shù)組的差集
array_diff(
arr2); 返回差集結(jié)果數(shù)組\
array_diff_assoc(
arr2,$arr3); 返回差集結(jié)果數(shù)組,鍵名也做比較
數(shù)組的交集
array_intersect(
arr2); 返回交集結(jié)果數(shù)組\
array_intersect_assoc(
arr2); 返回交集結(jié)果數(shù)組,鍵名也做比較
其他:
extract($arr);用于把數(shù)組中的元素轉(zhuǎn)換成變量導(dǎo)入到當(dāng)前文件中,鍵名當(dāng)作變量名,值作為變量值
compact(var1,var2,var3);compact() 函數(shù)創(chuàng)建包含變量名和它們的值的數(shù)組。
array_slice($arr,0,3); 可以將數(shù)組中的一段取出,此函數(shù)忽略鍵名
array_push($arr,"apple","pear"); 將一個(gè)或多個(gè)元素壓入數(shù)組棧的末尾(入棧),返回入棧元素的個(gè)數(shù)\
array_pop($arr); 將數(shù)組棧的最后一個(gè)元素彈出(出棧)
28.瀏覽器通過 URL 訪問的原理
1)鍵盤或觸屏輸入U(xiǎn)RL并回車確認(rèn)
2)URL解析/DNS解析查找域名IP地址
3)網(wǎng)絡(luò)連接發(fā)起HTTP請(qǐng)求
4)HTTP報(bào)文傳輸過程
5)服務(wù)器接收數(shù)據(jù)
6)服務(wù)器響應(yīng)請(qǐng)求/MVC
7)服務(wù)器返回?cái)?shù)據(jù)
8)客戶端接收數(shù)據(jù)
9)瀏覽器加載/渲染頁(yè)面
10)打印繪制輸出
29.常見的負(fù)載均衡方案
1)基于DNS的負(fù)載均衡
2)基于四層交換技術(shù)的負(fù)載均衡
3)基于七層交換技術(shù)的負(fù)載均衡
4)四層+七層負(fù)載結(jié)合方案
30.mysql_fetch_row () 和 mysql_fetch_array () 的區(qū)別
mysql_fetch_row() 從和結(jié)果標(biāo)識(shí) data 關(guān)聯(lián)的結(jié)果集中取得一行數(shù)據(jù)并作為數(shù)組返回。每個(gè)結(jié)果的列儲(chǔ)存在一個(gè)數(shù)組的單元中,偏移量從 0 開始。依次調(diào)用 mysql_fetch_row() 將返回結(jié)果集中的下一行,如果沒有更多行則返回 FALSE。
mysql_fetch_array() 函數(shù)從結(jié)果集中取得一行作為關(guān)聯(lián)數(shù)組,或數(shù)字?jǐn)?shù)組,或二者兼有。
解釋:
(1)如果你的表里面有字段a,b,c那么你用mysql_fetch_row() 就返回array(1=>a的值,2=>b的值,3=>c的值)這個(gè)時(shí)候你讀數(shù)組的話,只能這樣寫
array[2]才能得到a的值;
(2)要是用mysql_fetch_array() 就返回array(a=>a的值,b=>b的值,c=>c的值)和 array(1=>a的值,2=>b的值,3=>c的值)這個(gè)時(shí)候你讀數(shù)組的話
array[a]都能得到a的值
31.如何保障代碼在多個(gè) PHP 版本中可以正常運(yùn)行
通過修改nginx配置文件的fastCGI,監(jiān)聽不同端口,從而選擇不一樣的版本。
32.分析 MySQL 查詢慢的原因
1)查看慢查詢?nèi)罩?/p>
2)通過pt-query-digest工具分析
3)設(shè)置set profiling = 1;開啟服務(wù),執(zhí)行show profile。查看所有語(yǔ)句會(huì)監(jiān)測(cè)消耗時(shí)間存到臨時(shí)表
4)找到消耗時(shí)間大的ID,執(zhí)行show profile for query 臨時(shí)表ID
5)使用show status,show processlist 等命令查看
6)使用explain分析單條SQL語(yǔ)句
33.如何不借助第三變量交換兩個(gè)變量的值
字符串交換:
1)substr,strlen兩個(gè)方法實(shí)現(xiàn):
$a="abc";
$b="bcd";
echo '交換前 $a:'.$a.',$b:'.$b.'
';
$a.=$b;//將字符串合并為一條
//利用切割字符串的方法交換
$b=substr($a,0,(strlen($a)-strlen($b)));
$a=substr($a, strlen($b));
echo '交換后$a:'.$a.',$b:'.$b.'
';
2)使用str_replace方法實(shí)現(xiàn):
$a="abc";\
$b="bcd";\
echo '交換前 $a:'.$a.',$b:'.$b.'
';\
$a.=$b;\
$b=str_replace($b, "", $a);\
$a=str_replace($b, "", $a);\
echo '交換后$a:'.$a.',$b:'.$b.'
';\
3)結(jié)合使用list方法和array實(shí)現(xiàn):
$a="abc";\
$b="bcd";\
echo '交換前 $a:'.$a.',$b:'.$b.'
';\
list($b,$a)=array($a,$b);\
echo '交換后$a:'.$a.',$b:'.$b.'
';
PS:list()用法:把數(shù)組中的值賦給list中的變量中:
$my_array = array("Dog","Cat","Horse");
list($a, $b, $c) = $my_array;
則 $a = "Dog",$b = "Cat" , $c = "Horse";
字符串和數(shù)字都適用 使用異或運(yùn)算:
$a="abc";\
$b="bcd";\
echo '交換前 $a:'.$a.',$b:'.$b.'
';\
$a=$a^$b;\
$b=$b^$a;\
$a=$a^$b;\
echo '交換后$a:'.$a.',$b:'.$b.'
';
只適用于數(shù)字:
$a=3;\
$b=5;\
echo '交換前 $a:'.$a.',$b:'.$b.'
';\
$a=$a+$b;\
$b=$a-$b;\
$a=$a-$b;\
echo '交換后$a:'.$a.',$b:'.$b.'
';
34.char 和 varchar 的區(qū)別
1)varchar用于存儲(chǔ)可變長(zhǎng)度,char用于存儲(chǔ)定長(zhǎng)
2)對(duì)于經(jīng)常變更的數(shù)據(jù)char比varchar更好,不容易產(chǎn)生碎片
3)對(duì)于非常短的列,char比varcahr在存儲(chǔ)空間上更有效率
4)char對(duì)于未達(dá)到長(zhǎng)度的數(shù)據(jù)會(huì)自動(dòng)補(bǔ)空格
35.MySQL 事務(wù)的四大特性
一般來(lái)說(shuō),事務(wù)是必須滿足4個(gè)條件(ACID)::原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨(dú)立性)、持久性(Durability)。
原子性:一個(gè)事務(wù)(transaction)中的所有操作,要么全部完成,要么全部不完成,不會(huì)結(jié)束在中間某個(gè)環(huán)節(jié)。事務(wù)在執(zhí)行過程中發(fā)生錯(cuò)誤,會(huì)被回滾(Rollback)到事務(wù)開始前的狀態(tài),就像這個(gè)事務(wù)從來(lái)沒有執(zhí)行過一樣。
一致性:在事務(wù)開始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫(kù)的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預(yù)設(shè)規(guī)則,這包含資料的精確度、串聯(lián)性以及后續(xù)數(shù)據(jù)庫(kù)可以自發(fā)性地完成預(yù)定的工作。
隔離性:數(shù)據(jù)庫(kù)允許多個(gè)并發(fā)事務(wù)同時(shí)對(duì)其數(shù)據(jù)進(jìn)行讀寫和修改的能力,隔離性可以防止多個(gè)事務(wù)并發(fā)執(zhí)行時(shí)由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致。事務(wù)隔離分為不同級(jí)別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復(fù)讀(repeatable read)和串行化(Serializable)。
持久性:事務(wù)處理結(jié)束后,對(duì)數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會(huì)丟失。
36.線程和進(jìn)程
進(jìn)程:是并發(fā)執(zhí)行的程序在執(zhí)行過程中分配和管理資源的基本單位,是一個(gè)動(dòng)態(tài)概念,競(jìng)爭(zhēng)計(jì)算機(jī)系統(tǒng)資源的基本單位。
線程:是進(jìn)程的一個(gè)執(zhí)行單元,是進(jìn)程內(nèi)科調(diào)度實(shí)體。比進(jìn)程更小的獨(dú)立運(yùn)行的基本單位。線程也被稱為輕量級(jí)進(jìn)程。一個(gè)程序至少一個(gè)進(jìn)程,一個(gè)進(jìn)程至少一個(gè)線程。
進(jìn)程線程的區(qū)別:
地址空間:同一進(jìn)程的線程共享本進(jìn)程的地址空間,而進(jìn)程之間則是獨(dú)立的地址空間。
資源擁有:同一進(jìn)程內(nèi)的線程共享本進(jìn)程的資源如內(nèi)存、I/O、cpu等,但是進(jìn)程之間的資源是獨(dú)立的。
一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其他進(jìn)程產(chǎn)生影響,但是一個(gè)線程崩潰整個(gè)進(jìn)程都死掉。所以多進(jìn)程要比多線程健壯。
進(jìn)程切換時(shí),消耗的資源大,效率高。所以涉及到頻繁的切換時(shí),使用線程要好于進(jìn)程。同樣如果要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程不能用進(jìn)程
執(zhí)行過程:每個(gè)獨(dú)立的進(jìn)程程有一個(gè)程序運(yùn)行的入口、順序執(zhí)行序列和程序入口。但是線程不能獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制。
線程是處理器調(diào)度的基本單位,但是進(jìn)程不是。
兩者均可并發(fā)執(zhí)行。
優(yōu)缺點(diǎn):
線程執(zhí)行開銷小,但是不利于資源的管理和保護(hù)。線程適合在SMP機(jī)器(雙CPU系統(tǒng))上運(yùn)行。
進(jìn)程執(zhí)行開銷大,但是能夠很好的進(jìn)行資源管理和保護(hù)。進(jìn)程可以跨機(jī)器前移。
何時(shí)使用多進(jìn)程,何時(shí)使用多線程?
對(duì)資源的管理和保護(hù)要求高,不限制開銷和效率時(shí),使用多進(jìn)程。
要求效率高,頻繁切換時(shí),資源的保護(hù)管理要求不是很高時(shí),使用多線程。
37.HTTP 狀態(tài)碼
1**
信息,服務(wù)器收到請(qǐng)求,需要請(qǐng)求者繼續(xù)執(zhí)行操作
2**
成功,操作被成功接收并處理
3**
重定向,需要進(jìn)一步的操作以完成請(qǐng)求
4**
客戶端錯(cuò)誤,請(qǐng)求包含語(yǔ)法錯(cuò)誤或無(wú)法完成請(qǐng)求
5**
服務(wù)器錯(cuò)誤,服務(wù)器在處理請(qǐng)求的過程中發(fā)生了錯(cuò)誤
詳細(xì)參照:https://www.runoob.com/http/http-status-codes.html
38.Linux 服務(wù)器 CPU 負(fù)載過高的排查方法
39.常見的查找算法
40.PHP 中布爾值為 false 的情況
JS:
1)undefined(未定義,找不到值時(shí)出現(xiàn))
2)null(代表空值)
3)false(布爾值的false,字符串"false"布爾值為true)
4)0(數(shù)字0,字符串"0"布爾值為true)
5)NaN(無(wú)法計(jì)算結(jié)果時(shí)出現(xiàn),表示"非數(shù)值";但是tapeof NaN==="number")
6)""(雙引號(hào))或''(單引號(hào)) (空字符串,中間有空格時(shí)也是true)
PHP:
1)null(代表空值)為false
2)false(布爾值的false,字符串"false"布爾值為true)
3)0(數(shù)字0,字符串"0"布爾值都為false)
4)""(雙引號(hào))或''(單引號(hào))為false (中間有空格時(shí)是true)
41.php 實(shí)現(xiàn)重定向的三種方式
1.header()函數(shù);
header('location:http://www.baidu.com');
2.meta標(biāo)簽
echo '';
3.script標(biāo)簽;
echo '';
點(diǎn)關(guān)注,不迷路
好了各位,以上就是這篇文章的全部?jī)?nèi)容了,能看到這里的人呀,都是人才。之前說(shuō)過,PHP方面的技術(shù)點(diǎn)很多,也是因?yàn)樘嗔?#xff0c;實(shí)在是寫不過來(lái),寫過來(lái)了大家也不會(huì)看的太多,所以我這里把它整理成了PDF和文檔,如果有需要的可以
在這里插入圖片描述
在這里插入圖片描述
以上內(nèi)容希望幫助到大家,很多PHPer在進(jìn)階的時(shí)候總會(huì)遇到一些問題和瓶頸,業(yè)務(wù)代碼寫多了沒有方向感,不知道該從那里入手去提升,對(duì)此我整理了一些資料,包括但不限于:分布式架構(gòu)、高可擴(kuò)展、高性能、高并發(fā)、服務(wù)器性能調(diào)優(yōu)、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優(yōu)化、shell腳本、Docker、微服務(wù)、Nginx等多個(gè)知識(shí)點(diǎn)高級(jí)進(jìn)階干貨需要的可以免費(fèi)分享給大家,需要的可以加入我的
總結(jié)
以上是生活随笔為你收集整理的php面试的作品是看视频做吗,谈谈我在PHP面试时踩过的坑 找工作必看的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3淘宝商品目录_Python
- 下一篇: php销售清单录入,Netsuite S