【精選】Mysql B-Tree和B+Tree的結(jié)構(gòu)?
1.(int)'0xff'為什么是0?
0xff是字符串 字符串轉(zhuǎn)int 第一個(gè)是0 可以轉(zhuǎn)換成功 xff轉(zhuǎn)換失敗
2. PHP中10進(jìn)制與16進(jìn)制互轉(zhuǎn)
#10轉(zhuǎn)16 dechex(52558);或 gmp_strval(52558,16);
#16轉(zhuǎn)10 hexdec('0xcd4e');
3. 通過(guò)aux命令查詢cup和內(nèi)存前十的記錄
ps -aux --sort -pcpu,-pmem | head -n 10
參數(shù):
pcpu是CPU利用率
pmem是內(nèi)存利用率
--sort -是降序,+是升序
4. 面向?qū)ο蠡驹瓌t?
單一職責(zé)原則SRP(Single Responsibility Principle) :是指一個(gè)類的功能要單一,不能包羅萬(wàn)象。
開(kāi)放封閉原則OCP(Open-Close Principle) 一個(gè)模塊在擴(kuò)展性方面應(yīng)該是開(kāi)放的而在更改性方面應(yīng)該是封閉的。
替換原則(the Liskov Substitution Principle LSP) :子類應(yīng)當(dāng)可以替換父類并出現(xiàn)在父類能夠出現(xiàn)的任何地方。
依賴倒置原則(the Dependency Inversion Principle DIP) 具體依賴抽象,上層依賴下層。
接口分離原則(the Interface Segregation Principle ISP) 模塊間要通過(guò)抽象接口隔離開(kāi),而不是通過(guò)具體的類強(qiáng)耦合起來(lái)。
5. 設(shè)計(jì)模式分類,設(shè)計(jì)原則
創(chuàng)建型模式、結(jié)構(gòu)型模式、行為模式
創(chuàng)建型模式,就是創(chuàng)建對(duì)象的模式,抽象了實(shí)例化的過(guò)程。
簡(jiǎn)單工廠模式(Simple Factory)
工廠方法模式(Factory Method)
抽象工廠模式(Abstract Factory)
創(chuàng)建者模式(Builder)
原型模式(Prototype):利用原型實(shí)例來(lái)“克隆”創(chuàng)建新的對(duì)象。
單例模式(Singleton)
結(jié)構(gòu)型模式:處理類或?qū)ο箝g的組合。是為解決怎樣組裝現(xiàn)有的類,設(shè)計(jì)它們的交互方式,從而達(dá)到實(shí)現(xiàn)一定的功能目的。
外觀模式/門面模式(Facade門面模式)
適配器模式(Adapter)
代理模式(Proxy)
裝飾模式(Decorator)
橋接模式(Bridge)
組合模式(Composite):
享元模式(Flyweight)
行為型模式涉及到算法和對(duì)象間職責(zé)的分配,行為模式描述了對(duì)象和類的模式,以及它們之間的通信模式。
模板方法模式(Template Method)
觀察者模式(Observer)
狀態(tài)模式(State)
策略模式(Strategy)
職責(zé)鏈模式(Chain of Responsibility)
命令模式(Command)
訪問(wèn)者模式(Visitor)
調(diào)停者模式(Mediator)
備忘錄模式(Memento)
迭代器模式(Iterator)
解釋器模式(Interpreter)
6. PHP一次web請(qǐng)求的流程
瀏覽器發(fā)送URL請(qǐng)求
DNS解析域名
獲取到IP后開(kāi)始訪問(wèn)IP和Port
開(kāi)發(fā)發(fā)送TCP請(qǐng)求到Nginx
Nginx解析server name ,然后發(fā)送到 php-fpm管理進(jìn)程
php-fpm把具體的請(qǐng)求交給PHP執(zhí)行
7. PHP靜態(tài)變量有幾種?
靜態(tài)變量屬于靜態(tài)存儲(chǔ)方式,其存儲(chǔ)空間為內(nèi)存中的靜態(tài)數(shù)據(jù)區(qū)(在靜態(tài)存儲(chǔ)區(qū)內(nèi)分配存儲(chǔ)單元)。
靜態(tài)變量可以在任何可以申請(qǐng)的地方申請(qǐng),一旦申請(qǐng)成功后,它將不再接受其他的同樣申請(qǐng)。
靜態(tài)變量的值可變,但不會(huì)隨著函數(shù)的調(diào)用和退出而發(fā)生變化。
靜態(tài)局部變量:static類型的內(nèi)部變量是一種只能在某個(gè)特定函數(shù)中使用,但一直占據(jù)存儲(chǔ)空間的變量。
靜態(tài)變量的初始值為0。
靜態(tài)全局變量:全局變量(外部變量)的聲明之前再冠以static 就構(gòu)成了靜態(tài)的全局變量。
7.局部變量和靜態(tài)局部變量,全局變量和靜態(tài)全局變量的區(qū)別?
把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲(chǔ)方式,即改變了它的生存期。
把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域(靜態(tài)全局變量只在定義該變量的源文件內(nèi)有效),限制了它的使用范圍。
9.array_merge和array+array的區(qū)別?
$a=[0,1,2,3];
$b=[1,2,3,4,5];
$a+=$b;
echo json_encode($a);
//[0,1,2,3,5]
array_merge()不會(huì)覆蓋掉原來(lái)的值
array+array:合并數(shù)組則會(huì)把最先出現(xiàn)的值作為最終結(jié)果返回,拋棄掉后面的數(shù)組擁有相同鍵名的值。
10.foreach引用傳值結(jié)果
<?php
$a=[1,2,3];
foreach($a as &$v){} //$v 仍然引用到最后一項(xiàng) $a[2]
foreach($a as $v){} //$a[2]會(huì)遍歷$a中的值,$v=1,$v=2,$v=2
echo json_encode($a);//[1,2,2]
11.PHP的執(zhí)行過(guò)程?
掃描(scanning) :將index.php內(nèi)容變成一個(gè)個(gè)語(yǔ)言片段(token)
解析(parsing) :將一個(gè)個(gè)語(yǔ)言片段變成有意義的表達(dá)式
編譯(complication):將表達(dá)式編譯成中間碼(opcode)
執(zhí)行(execution):將中間碼一條一條的執(zhí)行
輸出(output buffer):將要輸出的內(nèi)容輸出到緩沖區(qū)
12.PHP的變量存儲(chǔ)
php中變量存在于zval變量容器中。
zval結(jié)構(gòu):變量類型,變量值,is_ref字段,refcount字段。
is_ref:是個(gè)bool值,用來(lái)區(qū)分變量是否屬于引用集合,表示變量是否有一個(gè)以上的別名。
refcount:計(jì)數(shù)器,表示指向這個(gè)zval變量容器的變量個(gè)數(shù)。
當(dāng)refcount值為1時(shí),is_ref的值為false。因?yàn)閞efcount為1,此變量不可能有多個(gè)別名,也就不存在引用了。
將一個(gè)變量 = 賦值給另一個(gè)變量時(shí),不會(huì)立即為新變量分配內(nèi)存空間,而是在原變量的zval中給refcount加1。
有當(dāng)原變量或者發(fā)生改變時(shí),才會(huì)為新變量分配內(nèi)存空間,同時(shí)原變量的refcount減 1 。
如果unset原變量,新變量直接就使用原變量的zval而不是重新分配。
&引用賦值時(shí),原變量的is_ref 變?yōu)?,refcount 加1. 如果給一個(gè)變量&賦值,之前 = 賦值的變量會(huì)分配空間。
13.PHP環(huán)狀引用內(nèi)存泄漏
<?php
$a = array( 'one' );
$a[] = &$a;
xdebug_debug_zval( 'a' );//a:(refcount=2, is_ref=1),
?>
PHP5.2以前,refcount為0,則變量的空間可以被釋放,否則就不釋放
unset($a); //refcount減1變?yōu)?,不會(huì)回收
14.PHP5.3的GC垃圾回收機(jī)制
算法把所有可能根(possible roots 都是zval變量容器),放在根緩沖區(qū)(root buffer)中(稱為疑似垃圾),在根緩沖區(qū)滿了時(shí),對(duì)緩沖區(qū)內(nèi)部所有不同的變量容器執(zhí)行垃圾回收操作。
或者我們?cè)谀_本中使用gc_collect_cycles,強(qiáng)制回收緩沖區(qū)中的垃圾。
如果一個(gè)引用計(jì)數(shù)refcount增加,它將繼續(xù)被使用,當(dāng)然就不再在垃圾中。
如果引用計(jì)數(shù)refcount減少到0,所在變量容器將被清除(free),不會(huì)進(jìn)入緩沖區(qū)。
僅僅在引用計(jì)數(shù)減少到非零值時(shí),才會(huì)產(chǎn)生垃圾周期(garbage cycle),將其放入緩沖區(qū)。在一個(gè)垃圾周期中,通過(guò)檢查引用計(jì)數(shù)是否減1,并且檢查哪些變量容器的引用次數(shù)是零,來(lái)發(fā)現(xiàn)哪部分是垃圾。
或者我們?cè)谀_本中使用gc_collect_cycles()強(qiáng)制回收緩沖區(qū)中的垃圾。
15. PHP開(kāi)啟/關(guān)閉垃圾回收
默認(rèn)的,PHP的垃圾回收機(jī)制是打開(kāi)的,然后有個(gè) php.ini 設(shè)置允許你修改它:zend.enable_gc
在程序中使用gc_enable() 和 gc_disable()開(kāi)啟和關(guān)閉
16. XSS攻擊及防御機(jī)制
Xss(cross-site scripting)跨站腳本攻擊:指攻擊者往Web頁(yè)面里插入惡意html標(biāo)簽或javascript代碼。
防御機(jī)制:
轉(zhuǎn)義標(biāo)簽(htmlspecialchars)
限制字符(reg\_match)
過(guò)濾(preg\_replace)
cookie設(shè)置HTTPOnly(js無(wú)法讀取)
模板引擎
17.CSRF攻擊及防御機(jī)制
CSRF跨站點(diǎn)請(qǐng)求偽造(Cross—Site Request Forgery):
CSRF攻擊攻擊原理及過(guò)程如下:
用戶C打開(kāi)瀏覽器,訪問(wèn)受信任網(wǎng)站A,輸入用戶名和密碼請(qǐng)求登錄網(wǎng)站A;
在用戶信息通過(guò)驗(yàn)證后,網(wǎng)站A產(chǎn)生Cookie信息并返回給瀏覽器,此時(shí)用戶登錄網(wǎng)站A成功,可以正常發(fā)送請(qǐng)求到網(wǎng)站A;
用戶未退出網(wǎng)站A之前,在同一瀏覽器中,打開(kāi)一個(gè)TAB頁(yè)訪問(wèn)網(wǎng)站B;
網(wǎng)站B接收到用戶請(qǐng)求后,返回一些攻擊性代碼,并發(fā)出一個(gè)請(qǐng)求要求訪問(wèn)第三方站點(diǎn)A;
瀏覽器在接收到這些攻擊性代碼后,根據(jù)網(wǎng)站B的請(qǐng)求,在用戶不知情的情況下攜帶Cookie信息,向網(wǎng)站A發(fā)出請(qǐng)求。網(wǎng)站A并不知道該請(qǐng)求其實(shí)是由B發(fā)起的,所以會(huì)根據(jù)用戶C的Cookie信息以C的權(quán)限處理該請(qǐng)求,導(dǎo)致來(lái)自網(wǎng)站B的惡意代碼被執(zhí)行。
防御CSRF攻擊:目前防御 CSRF 攻擊主要有三種策略:驗(yàn)證 HTTP Referer 字段;在請(qǐng)求地址中添加 token 并驗(yàn)證;在 HTTP 頭中自定義屬性并驗(yàn)證。
18. 有一個(gè)文件ip.txt,每行一條ip記錄共若干行,如何統(tǒng)計(jì)出現(xiàn)次數(shù)最多的前3個(gè)ip及其次數(shù)?
sort -nr ip.txt | uniq -c | sort -nr | head -n 3
uniq -c filename用于去除冗余并統(tǒng)計(jì)每一行出現(xiàn)的次數(shù)。
sort -r 指逆序排序 -n指按數(shù)字字符串大小排序
head -n 指定數(shù)量
注:第一次排序,把ip按順序排列,因?yàn)榈诙€(gè)uniq只會(huì)合并相鄰項(xiàng) 第二次排序,才是把ip按出現(xiàn)次序大小從大到小排列 最后取前三項(xiàng)結(jié)果。
19. Mysql B-Tree和B+Tree的結(jié)構(gòu)?
B-Tree:
d>=2,即B-Tree的度(對(duì)于一個(gè)節(jié)點(diǎn),有n個(gè)邊和它相連,就叫做度數(shù)=n);
h為B-Tree的高;
每個(gè)非葉子結(jié)點(diǎn)由n-1個(gè)key和n個(gè)指針組成,其中d<=n<=2d;
每個(gè)葉子結(jié)點(diǎn)至少包含一個(gè)key和兩個(gè)指針,最多包含2d-1個(gè)key和2d個(gè)指針,葉結(jié)點(diǎn)的指針均為NULL;
所有葉結(jié)點(diǎn)都在同一層,深度等于樹(shù)高h(yuǎn);
key和指針相互間隔,結(jié)點(diǎn)兩端是指針;
一個(gè)結(jié)點(diǎn)中的key從左至右遞增排列;
一個(gè)度為d的B-Tree,設(shè)其索引N個(gè)key,則其樹(shù)高h(yuǎn)的上限為logd((N+1)/2),檢索一個(gè)key,其查找結(jié)點(diǎn)個(gè)數(shù)的漸進(jìn)復(fù)雜度為O(logdN)
B+Tree:
每個(gè)結(jié)點(diǎn)的指針上限為2d而不是2d+1(指針個(gè)數(shù)和 key的個(gè)數(shù)相同)。
非葉子結(jié)點(diǎn)不存儲(chǔ)data,只存儲(chǔ)key;
葉子結(jié)點(diǎn)不存儲(chǔ)指針。
作者:碼農(nóng)編程進(jìn)階筆記
歡迎關(guān)注微信公眾號(hào) :碼農(nóng)編程進(jìn)階筆記