## PHP
- [手冊筆記]
- [官方文檔](http://php.net/manual/zh/langref.php)
- [數組函數]()
- [字符串函數]()
- [垃圾回收機制]()
- [面向對象]()
- 封裝
- 繼承
- 多態
- [zval結構]()
- [魔術方法]()
- [抽象類和接口]()
- [MVC]()
- [訪問修飾符]()
- [正則表達式]()
- [FPM、FastCGI]()
- [PSR規范](https://github.com/PizzaLiu/PHP-FIG)
- **PSR 1 基本代碼規范**
- **PSR 2 代碼風格指南**
- **PSR 3 日志接口**
- **PSR 4 改進的自動加載**
### Zval 引用計數
在php5中,每個變量都存在一個叫zval的結構中,這個結構包括變量的類型和變量的值。第一個是is_ref,表示是不是引用集合,php通過這個把引用變量和普通變量區分開,還有一個字段叫`ref_count` 表示這個zval容器的個數。
PHP5
```c_cpp
struct _zval_struct {
union {
long lval;
double dval;
struct {
char *val;
int len;
} str;
HashTable *ht;
zend_object_value obj;
zend_ast *ast;
} value;
zend_uint refcount__gc;
zend_uchar type;
zend_uchar is_ref__gc;
};
```
復合類型的變量把他們的成員屬性都存在自己的符號表里。
```pph
<?php
$a = array( 'meaning' => 'life', 'number' => 42 );
xdebug_debug_zval( 'a' );
?>
a: (refcount=1, is_ref=0)=array (
'meaning' => (refcount=1, is_ref=0)='life',
'number' => (refcount=1, is_ref=0)=42
)
```
### 回收周期
我們先要建立一些基本規則,如果一個引用計數增加,它將繼續被使用,當然就不再在垃圾中。如果引用計數減少到零,所在變量容器將被清除(free)。就是說,僅僅在引用計數減少到非零值時,才會產生垃圾周期(garbage cycle)。其次,在一個垃圾周期中,通過檢查引用計數是否減1,并且檢查哪些變量容器的引用次數是零,來發現哪部分是垃圾
### 面向對象
1. 封裝性:
也稱為信息隱藏,就是將一個類的使用和實現分開,只保留部分接口和方法與外部聯系,或者說只公開了一些供開發人員使用的方法。
于是開發人員只需要關注這個類如何使用,而不用去關心其具體的實現過程,這樣就能實現MVC分工合作,也能有效避免程序間相互依賴,
實現代碼模塊間松藕合。
2. 繼承性:
就是子類自動繼承其父級類中的屬性和方法,并可以可以添加新的屬性和方法或者對部分屬性和方法進行重寫。繼承增加了代碼的可重用性。
php只支持單繼承,也就是說一個子類只能有一個父類。
3. 多態性:
子類繼承了來自父級類中的屬性和方法,并對其中部分方法進行重寫。
于是多個子類中雖然都具有同一個方法,但是這些子類實例化的對象調用這些相同的方法后卻可以獲得完全不同的結果,這種技術就是多態性。
多態性增強了軟件的靈活性。
### 訪問權限修飾符
- public 公開的。任何地方都能訪問
- protected 保護的、只能在本類和子類中訪問
- private 私有的。只能在本類調用
- final 最終的。被修飾的方法或者類,不能被繼承或者重寫
- static 靜態
### 接口和抽象類區別
- 接口使用interface聲明,抽象類使用abstract
- 抽象類可以包含屬性方法。接口不能包含成員屬性、
- 接口不能包含非抽象方法
### CSRF XSS
CSRF,跨站請求偽造,攻擊方偽裝用戶身份發送請求從而竊取信息或者破壞系統。
講述基本原理:用戶訪問A網站登陸并生成了cookie,再訪問B網站,如果A網站存在CSRF漏洞,此時B網站給A網站的請求(此時相當于是用戶訪問),A網站會認為是用戶發的請求,從而B網站就成功偽裝了你的身份,因此叫跨站腳本攻擊。
CSRF防范:
1.合理規范api請求方式,GET,POST
2.對POST請求加token令牌驗證,生成一個隨機碼并存入session,表單中帶上這個隨機碼,提交的時候服務端進行驗證隨機碼是否相同。
XSS,跨站腳本攻擊。
防范:不相信任何輸入,過濾輸入。
### CGI、FastCGI、FPM
CGI全稱是“公共網關接口”(Common Gateway Interface),HTTP服務器與你的或其它機器上的程序進行“交談”的一種工具,其程序須運行在網絡服務器上。
CGI是HTTP Server和一個獨立的進程之間的協議,把**HTTP Request的Header設置成進程的環境變量**,HTTP Request的正文設置成進程的標準輸入,而進程的標準輸出就是HTTP Response包括Header和正文。
FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行著,只要激活后,不會每次都要花費時間去fork一次(這是CGI最為人詬病的fork-and-execute 模式)。它還支持分布式的運算,即 FastCGI 程序可以在網站服務器以外的主機上執行并且接受來自其它網站服務器來的請求。
Fpm是一個實現了Fastcgi協議的程序,用來管理Fastcgi起的進程的,即能夠調度php-cgi進程的程序
#### FastCGI特點
1. FastCGI具有語言無關性.
2. FastCGI在進程中的應用程序,獨立于核心web服務器運行,提供了一個比API更安全的環境。APIs把應用程序的代碼與核心的web服務器鏈接在一起,這意味著在一個錯誤的API的應用程序可能會損壞其他應用程序或核心服務器。 惡意的API的應用程序代碼甚至可以竊取另一個應用程序或核心服務器的密鑰。
3. FastCGI技術目前支持語言有:C/C++、Java、Perl、Tcl、Python、SmallTalk、Ruby等。相關模塊在Apache, ISS, Lighttpd等流行的服務器上也是可用的。
4. FastCGI的不依賴于任何Web服務器的內部架構,因此即使服務器技術的變化, FastCGI依然穩定不變。
#### FastCGI的工作原理
1. Web Server啟動時載入FastCGI進程管理器(IIS ISAPI或Apache Module)
2. FastCGI進程管理器自身初始化,啟動多個CGI解釋器進程(可見多個php-cgi)并等待來自Web Server的連接。
3. 當客戶端請求到達Web Server時,FastCGI進程管理器選擇并連接到一個CGI解釋器。Web server將CGI環境變量和標準輸入發送到FastCGI子進程php-cgi。
4. FastCGI子進程完成處理后將標準輸出和錯誤信息從同一連接返回Web Server。當FastCGI子進程關閉連接時,請求便告處理完成。FastCGI子進程接著等待并處理來自FastCGI進程管理器(運行在Web Server中)的下一個連接。 在CGI模式中,php-cgi在此便退出了。
- PC
- IO模型
- Inode介紹
- Linux
- Linux基本操作命令
- Linux網絡相關命令
- Crontab計劃任務
- Shell
- Sed命令
- Awk命令
- LAMP/LNMP
- PHP
- 基本語法
- 面向對象
- 錯誤和異常處理
- 命名空間
- PHP7
- 正則表達式
- Hashtable
- 變量的內部實現
- PHP-FPM
- PHP運行原理
- swoole
- mysql
- SQL標準
- mysql三范式
- 存儲引擎
- Mysql事務
- Mysql索引
- Mysql優化
- Explain
- MySQL索引原理及慢查詢優化
- MongoDb
- 計算機網絡
- IP協議
- TCP(傳輸控制協議)
- UDP(用戶數據報協議)
- HTTP 協議
- HTTPS
- HTTP的基本優化
- Websocket協議
- 版本控制器
- Git
- Svn
- 數據結構
- 數組
- 鏈表
- 算法