PHP知識總結

目錄

  • PHP的認知php

  • PHP的語言參考mysql

  • PHP安全考慮web

  • PHP的特性算法

  • PHP實用性考慮sql

 

1.PHP的認知

1.1 PHP是什麼

PHP(「PHP: Hypertext Preprocessor」,超文本預處理器的字母縮寫)是一種被普遍應用的開放源代碼的多用途腳本語言,它可嵌入到 HTML中,尤爲適合 web 開發。數據庫

 

1.2 PHP的主要用途

  • 服務端腳本。開展這項工做須要具有如下三點:PHP 解析器(CGI 或者服務器模塊)、web 服務器和 web 瀏覽器。數組

  • 命令行腳本。僅僅只須要 PHP 解析器來執行。這種用法對於依賴 cron(Unix 或者 Linux 環境)或者 Task Scheduler(Windows 環境)的平常運行的腳原本說是理想的選擇。瀏覽器

  • 編寫桌面應用程序,利用 PHP-GTK 來編寫這些程序。緩存

 

2.PHP語言參考

2.1 基礎語法

  • PHP標記:安全

    • <?php 和 ?>,或者short_open_tag開啓後容許使用短標記 <? 和 ?>

    • 分隔符爲分號,註釋有://, /* * /, / * * */。

  • 數據類型

    • 布爾類型:true或false。整型值0、浮點型值0.0、空字符串,以及字符串 "0"、不包括任何元素的數組、特殊類型NULL、從空標記生成的SimpleXML對象都會當從false。

    • 數據類型包括:整型、浮點型、字符串、數組、對象、資源類型、NULL、callback類型。

  • 變量

    • 預約義變量:$GLOBALS、$SERVER、$GET、$POST、$FILES、$REQUEST、$SESSION、$ENV、$COOKIE、$HTTP_RAW_POST_DATA、$http_response_header、$argc、$argv。

    • 變量的範圍:變量有局部變量和全局變量之分,全局變量用global定義。

    • 變量類型:變量類型有可變變量和靜態變量,靜態變量只會初始化一次而且變量在整個生命過程當中有效。

  • 常量

    • 常量的定義方式:define("FOO", "something");

    • 魔術常量:LINEFILEDIRFUNCTIONCLASSTRAITMETHODNAMESPACE

  • 表達式:複製表達式、比較表達式、三目運算表達式。

  • 運算符:

    • 運算符優先級:遞增/遞減, 類型轉換, !, * / %, + - ., 比較運算符, 引用符, &&, ||, ? :, 賦值運算符, and, or。

    • 錯誤忽略符號@,若是用 set_error_handler() 設定了自定義的錯誤處理函數,仍然會被調用。

  • 流程控制

    • 判斷控制:if, elseif/else if, else。

    • 循環控制:while、do-while、for、foreach、break、continue、switch、return、goto。

    • 引入控制:include、include_once、require、require_once。include產生E_COMPILE_ERROR錯誤時報警告,require產生致命錯誤。

 

2.2 函數

  • 字符串函數:

    • 字符串查找:strrpos()最後一次位置、strripos()最後一次位置、strrchr()返回最後一次位置的剩餘部分、stristr()返回第一次位置的剩餘部分、stripos()第一次出現的位置、strpos()第一次出現的位置。

    • 字符串增減:chop()刪除指定字符、chunk_split()分割更小部分、explode()分割數組、implode()數組組合字符串、trim移除空格、str_replace()字符串替換、str_split()分割字符塊、substr()截取字符串。

    • 字符串屬性:strlen()字符串長度、strrev()反轉字符串、strtolower()字符串小寫、strtoupper()字符串大寫、ucfirst()首字符大寫、lcfirst()首字符小寫。

  • 數組函數:

    • 數組比較:array_diff()返回差集(只比較鍵值)、array_diff_assoc()返回差集(比較鍵名和鍵值)、array_diff_key()返回差集(只比較鍵名)、array_intersect()返回交集(只比較鍵值)、array_intersect_assoc()返回交集(比較鍵名和鍵值)、array_intersect_key()返回交集(只比較鍵名。

    • 數組排序:array_multisort()對多個數組或多維數組進行排序、arsort()按照鍵值進行降序排序、asort()按照鍵值進行升序排序、krsort()按照鍵名逆向排序、ksort()按照鍵名排序、rsort()數組逆向排序、sort()對數組排序、uasort()使用用戶自定義的比較函數對數組中的鍵值進行排序。

    • 數組改變:array_change_key_case()把數組中全部鍵更改成小寫或大寫、array_chunk()把一個數組分割爲新的數組塊、array_column()返回輸入數組中某個單一列的值、array_combine()經過合併兩個數組來建立一個新數組、array_fill()用給定的鍵值填充數組、array_filter()用回調函數過濾數組中的元素、array_flip()交換數組中的鍵和值、array_keys()返回數組中全部的鍵名、array_pop()出棧、array_push()入棧、array_replace()使用後面數組的值替換第一個數組的值、array_reverse()以相反的順序返回數組、array_shift()刪除數組中首個元素、array_unshift()在數組開頭插入一個或多個元素等。

 

2.3 類與對象

  • 命名空間

    • 用戶編寫的代碼與PHP內部的類/函數/常量或第三方類/函數/常量之間的名字衝突。

    • 爲很長的標識符名稱(一般是爲了緩解第一類問題而定義的)建立一個別名(或簡短)的名稱,提升源代碼的可讀性。

  • 類的屬性

    • 類常量:const,常量的值必須是一個定值,不能是變量,類屬性,數學運算的結果或函數調用。

    • 訪問控制:public(公有),protected(受保護)或 private(私有) 。

    • 類自動加載:spl_autoload_register() 函數能夠註冊任意數量的自動加載器,當使用還沒有被定義的類(class)和接口(interface)時自動去加載。

    • 構造函數和析構函數:construct、destruct。

    • 對象繼承:extends,子類就會繼承父類全部公有的和受保護的方法。除非子類覆蓋了父類的方法,被繼承的方法都會保留其原有功能。

    • 抽象類:abstract,被定義爲抽象的方法只是聲明瞭其調用方式,繼承一個抽象類的時候,子類必須定義父類中的全部抽象方法,訪問控制只能同樣或者更輕鬆。

    • 對象接口:接口是經過 interface 關鍵字來定義的,就像定義一個標準的類同樣,但其中定義全部的方法都是空的。

    • trait:PHP 實現了一種代碼複用的方法,稱爲 trait。Trait 是爲相似 PHP 的單繼承語言而準備的一種代碼複用機制。

    • 重載:PHP所提供的重載(overloading)是指動態地建立類屬性和方法。咱們是經過魔術方法(magic methods)來實現的。

    • 魔術方法:construct(), destruct(), call(), callStatic(), get(), set(), isset(), unset(), sleep(), wakeup(), toString(), invoke(), set_state(), clone() 和 __debugInfo() 等方法在 PHP 中被稱爲魔術方法(Magic methods)。

    • final: 若是父類中的方法被聲明爲 final,則子類沒法覆蓋該方法。若是一個類被聲明爲 final,則不能被繼承。

 

2.4 異常處理

  • PHP 7 改變了大多數錯誤的報告方式。不一樣於傳統(PHP 5)的錯誤報告機制,如今大多數錯誤被做爲 Error 異常拋出。

  • 這種 Error 異常能夠像 Exception 異常同樣被第一個匹配的 try / catch 塊所捕獲。若是沒有匹配的 catch 塊,則調用異常處理函數(事先經過 set_exception_handler() 註冊)進行處理。 若是還沒有註冊異常處理函數,則按照傳統方式處理:被報告爲一個致命錯誤(Fatal Error)。

 

2.5 生成器

  • 生成器提供了一種更容易的方法來實現簡單的對象迭代,相比較定義類實現 Iterator 接口的方式,性能開銷和複雜性大大下降。

  • 生成器容許你在 foreach 代碼塊中寫代碼來迭代一組數據而不須要在內存中建立一個數組, 那會使你的內存達到上限,或者會佔據可觀的處理時間。相反,你能夠寫一個生成器函數,就像一個普通的自定義函數同樣, 和普通函數只返回一次不一樣的是, 生成器能夠根據須要 yield 屢次,以便生成須要迭代的值。

 

3.PHP安全考慮

3.1 會話安全

  • 會話管理基礎

    • 安全說明:會話模塊沒法保證你存儲在會話中的信息只能被建立會話的用戶本人可見。一般須要付出必定的代價,同時會下降便利性。 例如,若是你須要保護用戶免受社會工程學攻擊, 你須要啓用 session.use_only_cookies 選項。

    • 嚴格會話管理:PHP 是以自適應的方式來管理會話的, 這種方式使用起來很靈活,可是一樣也帶來了必定的風險。所以須要配置session.use_strict_mode。當啓用這個配置項,未經初始化的會話 ID 會被拒絕, 併爲其生成一個全新的會話,這能夠避免攻擊者使用一個已知的會話 ID 來進行攻擊。

    • 從新生成會話ID:爲了確保會話安全,開發者還須要使用 session_regenerate_id() 函數,按期自動從新生成會話ID。

    • CSRF(跨站請求僞造):會話和認證沒法避免跨站請求僞造攻擊, 開發者須要本身來實現保護應用不受 CSRF 攻擊的功能。

  • 和會話安全相關的配置項

    • session.cookie_lifetime=0 告知瀏覽器不要持久化存儲 cookie 數據。

    • session.use_cookies=On,session.use_only_cookies=On 雖然 HTTP cookie 存在一些問題, 可是它確實是實現會話 ID 管理的優選方案。

    • session.use_strict_mode=On 此設置防止會話模塊使用未初始化的會話 ID。

    • session.cookie_httponly=On 禁止JavaScript訪問會話cookie。 此設置項能夠保護cookie不被JavaScript竊取。

    • session.cookie_secure=On 僅容許在 HTTPS 協議下訪問會話ID cookie。 若是你的web站點僅支持HTTPS,那麼必須將此配置項設置爲On。

    • session.use_trans_sid=Off 禁用會話 ID 透傳機制能夠 避免會話 ID 被注入以及泄漏, 有效的提升會話安全性。

 

3.2 文件安全

  • PHP聽從大多數服務器系統中關於文件和目錄權限的安全機制。這就使管理員能夠控制哪些文件在文件系統內是可讀的。必須特別注意的是全局的可讀文件,並確保每個有權限的用戶對這些文件的讀取動做都是安全的。

  • PHP 被設計爲以用戶級別來訪問文件系統,因此徹底有可能經過編寫一段 PHP 代碼來讀取系統文件如 /etc/passwd,更改網絡鏈接以及發送大量打印任務等等。所以必須確保 PHP 代碼讀取和寫入的是合適的文件。

  • 有兩個重要措施來防止此類問題:

    • 只給 PHP 的 web 用戶頗有限的權限。

    • 檢查全部提交上來的變量。

 

3.3 數據庫安全

  • PHP 自己並不能保護數據庫的安全。記住一條簡單的原則:深刻防護。保護數據庫的措施越多,攻擊者就越難得到和使用數據庫內的信息。正確地設計和應用數據庫能夠減小被攻擊的擔心。

  • 直接 SQL 命令注入就是攻擊者經常使用的一種建立或修改已有 SQL 語句的技術,從而達到取得隱藏數據,或覆蓋關鍵的值,甚至執行數據庫主機操做系統命令的目的。

  • -- 是 SQL 的註釋標記,通常可使用來它告訴 SQL 解釋器忽略後面的語句。

  • 預防措施

    • 永遠不要使用超級用戶或全部者賬號去鏈接數據庫。要用權限被嚴格限制的賬號。

    • 檢查輸入的數據是否具備所指望的數據格式。

    • 使用數據庫特定的敏感字符轉義函數(好比 mysql_escape_string() 和 sql_escape_string())把用戶提交上來的非數字數據進行轉義。

    • 也能夠選擇使用數據庫的存儲過程和預約義指針等特性來抽象數庫訪問,使用戶不能直接訪問數據表和視圖。

 

4.PHP的特性

4.1 垃圾回收機制

  • 引用計數基本知識

    • 每一個php變量存在一個叫"zval"的變量容器中。一個zval變量容器,除了包含變量的類型和值,還包括兩個字節的額外信息。第一個是"is_ref",是個bool值,用來標識這個變量是不是屬於引用集合(reference set)。

    • 把一個變量賦值給另外一變量將增長引用次數(refcount).

    • 變量容器在」refcount「變成0時就被銷燬. 當任何關聯到某個變量容器的變量離開它的做用域(好比:函數執行結束),或者對變量調用了函數 unset()時,」refcount「就會減1。

  • 回收週期

    • 若是一個引用計數增長,它將繼續被使用,固然就再也不在垃圾中。若是引用計數減小到零,所在變量容器將被清除(free)。就是說,僅僅在引用計數減小到非零值時,纔會產生垃圾週期(garbage cycle)。其次,在一個垃圾週期中,經過檢查引用計數是否減1,而且檢查哪些變量容器的引用次數是零,來發現哪部分是垃圾。

  • 性能方面考慮

    • 首先,實現垃圾回收機制的整個緣由是爲了,一旦先決條件知足,經過清理循環引用的變量來節省內存佔用。在PHP執行中,一旦根緩衝區滿了或者調用gc_collect_cycles() 函數時,就會執行垃圾回收。

    • 執行時間增長:垃圾回收影響性能的第二個領域是它釋放已泄漏的內存耗費的時間。PHP中的垃圾回收機制,回收算法確實運行時會有時間消耗上的增長。

 

4.2 Fast cgi管理

  • 支持平滑中止/啓動的高級進程管理功能;

    • 能夠工做於不一樣的 uid/gid/chroot 環境下,並監聽不一樣的端口和使用不一樣的 php.ini 配置文件(可取代 safe_mode 的設置);

    • stdout 和 stderr 日誌記錄;

    • 在發生意外狀況的時候可以從新啓動並緩存被破壞的 opcode;

    • 文件上傳優化支持;

    • "慢日誌" - 記錄腳本(不只記錄文件名,還記錄 PHP backtrace 信息,可使用 ptrace或者相似工具讀取和分析遠程進程的運行數據)運行所致使的異常緩慢;

    • fastcgi_finish_request() - 特殊功能:用於在請求完成和刷新數據後,繼續在後臺執行耗時的工做(錄入視頻轉換、統計處理等);

    • 動態/靜態子進程產生;

    • 基本 SAPI 運行狀態信息(相似Apache的 mod_status);

    • 基於 php.ini 的配置文件。

 

5.PHP實用性考慮

5.1 大量數據的處理

  • 足夠的批處理

    • 記錄在業務事務過程當中對數據庫有影響的全部變化,並在操做結束後,做爲一種結果保存到數據庫。

    • 解決大量規模很小的數據庫調用。

  • 充分的異步處理

    • 分而治之的思想:把複雜的業務流程拆分爲獨立的幾個子流程。

    • 把不影響主流程的數據加載進行異步處理

 

5.2 內存使用狀況

  • 使用生成器

    • 生成器提供簡易的方法實現對象迭代,性能開銷和複雜性大大下降。

    • 生成器能夠避免,大變量致使的內存溢出問題。

  • 在長時間執行的腳本中,儘量手動unset()變量。避免PHP垃圾回收機制的耗時,和內存碎片致使的內存增長問題。

 

5.3 併發處理狀況

  • 樂觀鎖機制

    • 在數據進行提交更新的時候,纔會正式對數據的衝突與否進行檢測,若是發現衝突了,則讓返回用戶錯誤的信息,讓用戶決定如何去作。

  • 悲觀鎖機制

    • 悲觀鎖的實現方式是使用數據庫的鎖機制,例如:select * from goods where goods_code ='111' for update ;

相關文章
相關標籤/搜索