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