PHP 入门 - 10.应用技术
文章目錄
- 輸出緩存
- 輸出緩沖區
- 函數
- 錯誤處理
- 錯誤報告
- 錯誤抑制
- 觸發錯誤
- 定義錯誤處理器
- 錯誤處理器中的日志
- 性能調優
- 分析
- 優化執行時間
- 優化內存占用
- 擴展流量的三種方式:
- 反向代理緩存
- 負載均衡
- 數據庫復制
輸出緩存
輸出緩沖區
把輸出的內容先放進內存,而不先顯示。最根本的作用是,協調高速 CPU 和相對緩慢的 IO 設備(磁盤等)的運作。
函數
- ob_start([callback]) : 打開輸出緩沖。callback 參數是后處理輸出的函數名。
- ob_get_length():int : 獲取當前緩沖區長度。緩沖沒有開啟返回 false 。
- ob_get_contents():string : 獲取當前緩沖區長度。緩沖沒有開啟返回 false 。
- ob_clean() : 清理輸出緩沖區但是不會關閉輸出緩沖。
- ob_end_clean() : 清理輸出緩沖區并且結束輸出緩沖
- ob_flush() : 發送數據到網頁服務器并且清理輸出,但是不關閉輸出緩沖。
- flush() : 除了刷新和清理輸出緩沖區,也會嘗試讓網頁服務器立即發送數據到瀏覽器。
- ob_end_flush() : 發送數據到網頁服務器并且清理輸出,并且關閉輸出緩沖。
錯誤處理
錯誤報告
PHP 中錯誤有三種等級:
- 提示: notice ,發生在執行腳本可能出現錯誤時,但正常執行時也遇到(例如,嘗試訪問一個不存在的變量)。
- 警告: warning ,表明一個非致命錯誤,典型的,警告在函數調用無效參數時就會顯示。
- 錯誤: error ,表明致命狀態,無法從腳本中恢復,解析錯誤是一個特殊的錯誤類型,在腳本中有語法錯誤時發生。除了解析錯誤外的所有錯誤都叫運行時錯誤
在 PHP 中可以在 php.ini 文件中用 error_reporting 選項全局修改這個特性。也可以在腳本中使用 error_reporting() 函數在本地變量錯誤報告行為。
錯誤抑制
可以通過在獨立表達式前放置一個錯誤抑制符 @ 來禁用它的錯誤信息.
$value = @(2 / 0);錯誤抑制符不能抑制解析錯誤,只能抑制運行時錯誤的不同類型。
觸發錯誤
可以在 PHP 中用 trigger_error() 函數拋出一個錯誤:
trigger_error(message [, tyep="E_SUER_NOTICE"]);type 參數: * E_USER_ERROR : 錯誤 * E_USER_WARNING : 警告 * E_USER_NOTICE : 提示定義錯誤處理器
如果你想格式化錯誤信息,可以向 PHP 提供錯誤處理器。基本方法是創建一個錯誤處理函數并用 set_error_handler() 來注冊。
聲明的函數可以接受 2 到 5 個參數。前兩個參數是錯誤代碼和錯誤描述。后面三個參數分別是:錯誤發生的文件名、錯誤發生的行號和錯誤發生的符號表復制。
function displayError($error, $errorString, $filename, $line, $symbols) {echo "<p>Error '<b>{$errorString}</b>' occurred.<br />";echo "-- in file '<i>{$filename}</i>', line $line."; }set_error_handler('displayError'); $value = 4 / 0; //輸出 /* Error 'Division by zero' occurred. -- in file 'C:\Git\php\text1.php', line 8. */錯誤處理器中的日志
PHP 提供內建函數 error_log() ,把錯誤記錄到管理員放錯誤日志的地方。
error_log(message, type [, destination [, extra_haders ]]);type參數: * 0 : 用 PHP 標準錯誤日志 * 1 : 把錯誤郵件給 destination 地址 * 3 : 附加錯誤到 destination 文件當類型為 0 來調用 error_log() 。通過改變 php.ini 文件中 error_log 的值,可以修改要往那個文件中寫日志。如果將其設置為 syslog ,系統日志將被使用。
性能調優
一旦你的代碼可以工作,就可以優化代碼。優化代碼的目標通常為縮短運行時間和減少內存占用。
分析
使用 microtime() 來準確的標識消逝的時間。
例如,下面代碼可以的得到 phpinfo() 輸出花費了多少時間:
ob_start(); $start = microtime();phpinfo();$end = microtime(); ob_end_clean();echo "phpinfo() took" . ($end - $start) . "seconds to run.\n";優化執行時間
-
避免使用 printf() ,只用 echo 。
-
避免在循環中重新計算值,因為 PHP 解析器不會移除循環不變量
// 如果 $array 大小不變for($i = 0; $i < count($array); $i++) // bad$num = count($array); for($i = 0; $i < $num; $i++) // good -
只包含必要的文件。分離出包含文件中確定要用的函數,將他們放在一起。
-
如果用了數據庫,要使用持久化數據庫連接——啟動和關閉數據庫連接時比較慢的。
-
當可以用簡單字符串操作函數時就不要用正則表達式。
優化內存占用
-
用數字代替字符串
for($i = "0", $i < "10"; $i++) // bad for($i = 0; $i < 10; $i++) // good -
當你處理完了一個大字符串,把保存字符串的變量設置為空,這會釋放內存以便重用。
-
只包含必需的文件,用 include_once 和 require_once 來替代 include 和 require 。
-
處理完 MySQL 和其他數據庫的結果集后立即釋放。在內存中保存使用后的結果集沒有任何好處。
擴展流量的三種方式:
反向代理緩存
反向代理服務器位于用戶與目標服務器之間,但是對于用戶而言,反向代理服務器就相當于目標服務器,即用戶直接訪問反向代理服務器就可以獲得目標服務器的資源。代理用來更快的提供靜態文件。
負載均衡
負載均衡是分攤負載到幾臺機器上。一個“負載均衡系統”通過均衡分布負載或轉發請求到較少負載的機器上實現。
數據庫復制
有時數據庫服務器會成為瓶頸——很多并發查詢可能會拖垮一個服務器。復制是一個很好的解決方案。把發生在一個數據庫上的所有同步帶到其他一個或多個數據庫上,這可以讓你查詢分散到不同的數據庫服務器而不是自從一臺服務器加載。
最有效的模型是單向復制,就是你只有一個主數據庫要復制到幾個從數據庫上。寫數據庫到主數據庫,讀數據庫是負載均衡地跨多個從庫。這個技術的目標架構是多讀小寫。
感謝你看到了這里。如果文章有錯誤,請評論指正,謝謝!
總結
以上是生活随笔為你收集整理的PHP 入门 - 10.应用技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP 入门 - 9.安全
- 下一篇: Anaconda3-5.3.0-Wind