【精選】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)階筆記