【精選】Mysql B-Tree和B+Tree的結構?

1.(int)'0xff'為什么是0?
0xff是字符串 字符串轉int 第一個是0 可以轉換成功 xff轉換失敗

2. PHP中10進制與16進制互轉
#10轉16 dechex(52558);或 gmp_strval(52558,16);
#16轉10 hexdec('0xcd4e');
3. 通過aux命令查詢cup和內存前十的記錄
ps -aux --sort -pcpu,-pmem | head -n 10

參數:
 pcpu是CPU利用率
 pmem是內存利用率
 --sort -是降序,+是升序
4. 面向對象基本原則?
單一職責原則SRP(Single Responsibility Principle) :是指一個類的功能要單一,不能包羅萬象。

開放封閉原則OCP(Open-Close Principle) 一個模塊在擴展性方面應該是開放的而在更改性方面應該是封閉的。

替換原則(the Liskov Substitution Principle LSP) :子類應當可以替換父類并出現在父類能夠出現的任何地方。

依賴倒置原則(the Dependency Inversion Principle DIP) 具體依賴抽象,上層依賴下層。

接口分離原則(the Interface Segregation Principle ISP) 模塊間要通過抽象接口隔離開,而不是通過具體的類強耦合起來。

5. 設計模式分類,設計原則
創(chuàng)建型模式、結構型模式、行為模式

創(chuàng)建型模式,就是創(chuàng)建對象的模式,抽象了實例化的過程。

簡單工廠模式(Simple Factory)

工廠方法模式(Factory Method)

抽象工廠模式(Abstract Factory)

創(chuàng)建者模式(Builder)

原型模式(Prototype):利用原型實例來“克隆”創(chuàng)建新的對象。

單例模式(Singleton)

結構型模式:處理類或對象間的組合。是為解決怎樣組裝現有的類,設計它們的交互方式,從而達到實現一定的功能目的。

外觀模式/門面模式(Facade門面模式)

適配器模式(Adapter)

代理模式(Proxy)

裝飾模式(Decorator)

橋接模式(Bridge)

組合模式(Composite):

享元模式(Flyweight)

行為型模式涉及到算法和對象間職責的分配,行為模式描述了對象和類的模式,以及它們之間的通信模式。

模板方法模式(Template Method)

觀察者模式(Observer)

狀態(tài)模式(State)

策略模式(Strategy)

職責鏈模式(Chain of Responsibility)

命令模式(Command)

訪問者模式(Visitor)

調停者模式(Mediator)

備忘錄模式(Memento)

迭代器模式(Iterator)

解釋器模式(Interpreter)

6. PHP一次web請求的流程
瀏覽器發(fā)送URL請求

DNS解析域名

獲取到IP后開始訪問IP和Port

開發(fā)發(fā)送TCP請求到Nginx

Nginx解析server name ,然后發(fā)送到 php-fpm管理進程

php-fpm把具體的請求交給PHP執(zhí)行

7. PHP靜態(tài)變量有幾種?
靜態(tài)變量屬于靜態(tài)存儲方式,其存儲空間為內存中的靜態(tài)數據區(qū)(在靜態(tài)存儲區(qū)內分配存儲單元)。

靜態(tài)變量可以在任何可以申請的地方申請,一旦申請成功后,它將不再接受其他的同樣申請。

靜態(tài)變量的值可變,但不會隨著函數的調用和退出而發(fā)生變化。

靜態(tài)局部變量:static類型的內部變量是一種只能在某個特定函數中使用,但一直占據存儲空間的變量。

靜態(tài)變量的初始值為0。

靜態(tài)全局變量:全局變量(外部變量)的聲明之前再冠以static 就構成了靜態(tài)的全局變量。

7.局部變量和靜態(tài)局部變量,全局變量和靜態(tài)全局變量的區(qū)別?
把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲方式,即改變了它的生存期。

把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域(靜態(tà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:合并數組則會把最先出現的值作為最終結果返回,拋棄掉后面的數組擁有相同鍵名的值。

10.foreach引用傳值結果
<?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內容變成一個個語言片段(token)

解析(parsing) :將一個個語言片段變成有意義的表達式

編譯(complication):將表達式編譯成中間碼(opcode)

執(zhí)行(execution):將中間碼一條一條的執(zhí)行

輸出(output buffer):將要輸出的內容輸出到緩沖區(qū)






12.PHP的變量存儲
php中變量存在于zval變量容器中。

zval結構:變量類型,變量值,is_ref字段,refcount字段。

is_ref:是個bool值,用來區(qū)分變量是否屬于引用集合,表示變量是否有一個以上的別名。

refcount:計數器,表示指向這個zval變量容器的變量個數。

當refcount值為1時,is_ref的值為false。因為refcount為1,此變量不可能有多個別名,也就不存在引用了。

將一個變量 = 賦值給另一個變量時,不會立即為新變量分配內存空間,而是在原變量的zval中給refcount加1。

有當原變量或者發(fā)生改變時,才會為新變量分配內存空間,同時原變量的refcount減 1 。

如果unset原變量,新變量直接就使用原變量的zval而不是重新分配。

&引用賦值時,原變量的is_ref 變?yōu)?,refcount 加1. 如果給一個變量&賦值,之前 = 賦值的變量會分配空間。

13.PHP環(huán)狀引用內存泄漏
<?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垃圾回收機制
算法把所有可能根(possible roots 都是zval變量容器),放在根緩沖區(qū)(root buffer)中(稱為疑似垃圾),在根緩沖區(qū)滿了時,對緩沖區(qū)內部所有不同的變量容器執(zhí)行垃圾回收操作。

或者我們在腳本中使用gc_collect_cycles,強制回收緩沖區(qū)中的垃圾。

如果一個引用計數refcount增加,它將繼續(xù)被使用,當然就不再在垃圾中。

如果引用計數refcount減少到0,所在變量容器將被清除(free),不會進入緩沖區(qū)。

僅僅在引用計數減少到非零值時,才會產生垃圾周期(garbage cycle),將其放入緩沖區(qū)。在一個垃圾周期中,通過檢查引用計數是否減1,并且檢查哪些變量容器的引用次數是零,來發(fā)現哪部分是垃圾。

或者我們在腳本中使用gc_collect_cycles()強制回收緩沖區(qū)中的垃圾。

15. PHP開啟/關閉垃圾回收
默認的,PHP的垃圾回收機制是打開的,然后有個 php.ini 設置允許你修改它:zend.enable_gc

在程序中使用gc_enable() 和 gc_disable()開啟和關閉

16. XSS攻擊及防御機制
Xss(cross-site scripting)跨站腳本攻擊:指攻擊者往Web頁面里插入惡意html標簽或javascript代碼。

防御機制:

轉義標簽(htmlspecialchars)

限制字符(reg\_match)

過濾(preg\_replace)

cookie設置HTTPOnly(js無法讀取)

模板引擎

17.CSRF攻擊及防御機制
CSRF跨站點請求偽造(Cross—Site Request Forgery):

CSRF攻擊攻擊原理及過程如下:

用戶C打開瀏覽器,訪問受信任網站A,輸入用戶名和密碼請求登錄網站A;

在用戶信息通過驗證后,網站A產生Cookie信息并返回給瀏覽器,此時用戶登錄網站A成功,可以正常發(fā)送請求到網站A;

用戶未退出網站A之前,在同一瀏覽器中,打開一個TAB頁訪問網站B;

網站B接收到用戶請求后,返回一些攻擊性代碼,并發(fā)出一個請求要求訪問第三方站點A;

瀏覽器在接收到這些攻擊性代碼后,根據網站B的請求,在用戶不知情的情況下攜帶Cookie信息,向網站A發(fā)出請求。網站A并不知道該請求其實是由B發(fā)起的,所以會根據用戶C的Cookie信息以C的權限處理該請求,導致來自網站B的惡意代碼被執(zhí)行。

防御CSRF攻擊:目前防御 CSRF 攻擊主要有三種策略:驗證 HTTP Referer 字段;在請求地址中添加 token 并驗證;在 HTTP 頭中自定義屬性并驗證。

18. 有一個文件ip.txt,每行一條ip記錄共若干行,如何統(tǒng)計出現次數最多的前3個ip及其次數?
sort -nr ip.txt | uniq -c | sort -nr | head -n 3

uniq -c filename用于去除冗余并統(tǒng)計每一行出現的次數。
sort -r 指逆序排序 -n指按數字字符串大小排序
head -n 指定數量
注:第一次排序,把ip按順序排列,因為第二個uniq只會合并相鄰項 第二次排序,才是把ip按出現次序大小從大到小排列 最后取前三項結果。

19. Mysql B-Tree和B+Tree的結構?
B-Tree:

d>=2,即B-Tree的度(對于一個節(jié)點,有n個邊和它相連,就叫做度數=n);

h為B-Tree的高;

每個非葉子結點由n-1個key和n個指針組成,其中d<=n<=2d;

每個葉子結點至少包含一個key和兩個指針,最多包含2d-1個key和2d個指針,葉結點的指針均為NULL;

所有葉結點都在同一層,深度等于樹高h;

key和指針相互間隔,結點兩端是指針;

一個結點中的key從左至右遞增排列;

一個度為d的B-Tree,設其索引N個key,則其樹高h的上限為logd((N+1)/2),檢索一個key,其查找結點個數的漸進復雜度為O(logdN)

B+Tree:

每個結點的指針上限為2d而不是2d+1(指針個數和 key的個數相同)。

非葉子結點不存儲data,只存儲key;

葉子結點不存儲指針。

作者:碼農編程進階筆記


歡迎關注微信公眾號 :碼農編程進階筆記