我們在用php程式設計的時候,總是想要使自己的程式占用資源最小,執行速度更快,**量更少。往往我們在追求這些的同時卻失去了很多東西。下面我想講講我對php優化的理解。優化的目的是花最少的代價換來最快的執行速度與最容易維護的**。
進行大範圍的優化,而不是死啃某些程式**
我這裡所說的優化,基本上都是從伺服器,apache,資料庫這些方面來進行的優化,而並不是對你的php**加以改進從而提高程式的執行速度,因為比起你將程式中的正則優化為字串處理函式從而提公升程式速度來說,在大範圍內進行的優化所需要的代價要比這個小的多,而獲得報酬卻要豐厚的多。
在非**處進行優化有以下好處:
1、通常情況下能夠大大提高效率
2、不會危及到**的完整性
3、能夠快速部署
快取技術
下面來說說常用的快取技術,通過這些快取技術能夠大大的提高效率
在說到快取技術的時候不得不提到memcached ,memcached是高效、快速的分布式記憶體物件快取系統,主要用於加速web開發 動態應用程式。
memcached的原理
memcached是以守護程式方式執行於乙個或多個伺服器中,等待接收客戶端的連線操作,客戶端可以由各種語言編寫(例如php)。php 等客戶端在與 memcached 服務建立連線之後,接下來的事情就是訪問物件了,每個被訪問的物件都有乙個唯一的識別符號 key,訪問操作均通過這個 key 進行,儲存到 memcached 中的物件實際上是放置記憶體中的,並不是儲存在 cache 檔案中的,這也是為什麼 memcached 能夠如此高效快速的原因。
說完memcached,下面來說說常用的快取方法
1、 編譯與opcode快取
因為php是解釋型的語言,所以每個php檔案在執行的時候都需要編譯後再執行,同乙個檔案,不同的使用者訪問,或者同乙個使用者不同時間訪問同乙個檔案,每次都需要重新編譯然後執行,這樣就耗費了大量時間。
通過編譯快取每個檔案在修改之後只編譯一次這樣就減少了檔案io操作,使用者訪問後機器指令直接從記憶體中取出並執行而不是硬碟中讀出。
最常見的php編譯快取工具有:apc,accelerator,xcache
2、 全域性頁面快取– squid cache
squidcache(簡稱為squid)是乙個流行的自由軟體(gnu通用公共許可證)的**伺服器和web快取伺服器,squid作為網頁伺服器的前置cache伺服器通過快取相關請求來提高web伺服器的速度。
3、 區域性快取之sql快取
在大多數應用程式中主要的瓶頸往往可以追溯到資料庫的操作中,一般都是因為複雜的資料庫查詢而耗費了大量時間,而sql快取可以大大降低複雜查詢造成的負荷。
sql快取的例子(使用了memcached擴充套件)
**片段:
$key= md5(「somesort of sql query」);
if(!($result = memcache_get($key))) {
$result= $pdo->query($qry)->fetchall();
// 快取查詢結果一小時
memcache_set($key,$result, null, 3600);
4、 區域性快取之**塊快取
為了優化php程式,有時候我們不得不優化乙個個**段來減少那麼一點點的執行的時間,但是比起優化複雜的不同的php**段還不如通過快取來直接忽略這些**段的優化,這樣做的好處是:
1) 能夠很快的看到效果
2) 2、不會破壞以前的**
3) 速度要比優化**要快得多
**塊快取的列子(同樣使用了memcached擴充套件)
**片段:
functioncomplex_function_abc($a, $b, $c) {
$key= __function__ . serialize
(func_get_args());
if(!($result = memcache_get($key))) {
$result= //函式**
// 儲存執行結果1小時
memcache_set($key,$result, null, 3600);
return$result;
當然除了上述方法外還可以用到檔案快取(將資料庫中的資料取出儲存在檔案中),還可以生成靜態html檔案等,但是這些方法的快取還是將檔案儲存在硬碟上而不是記憶體中。
輸出控制
除了上述快取技術外還可以通過輸出控制來讓程式執行的時間更少
下面通過php與apache來說說輸出控制
1、php輸出控制
這裡最主要用到ob_start()以及php中的ob系列函式,這些函式可以做什麼呢?
第一就是靜態模版技術。所謂靜態模版技術就是通過某種方式,使得使用者在client端得到的是由php產生的html頁面。如果這個html頁面不會再被更新,那麼當另外的使用者再次瀏覽此頁面時,程式將不會再呼叫php以及相關的資料庫,對於某些資訊量比較大的**,例如sina,163,sohu。類似這種的技術帶來的好處是非常巨大的。
**示例:
<?php
ob_start();//開啟緩衝區
php頁面的全部輸出
<?php
$content= ob_get_contents(); //取得php頁面輸出的全部內容
$fp= fopen(「output.html」, 「w」); //建立乙個檔案,並開啟,準備寫入
fwrite($fp,$content); //把php頁面的內容全部寫入output.html,然後……
fclose($fp);
當然這個ob系列函式還有其他很多用處我就不在這裡一一說明了。
2、apache輸出控制
將sendbuffersize設定為頁面大小,這樣就能將頁面一次性放在傳送緩衝區從而增加處理速度。
sendbuffersize指令
說明:tcp傳送緩衝區大小(位元組)
語法:sendbuffersize bytes
預設值:sendbuffersize 0
作用域:server config
狀態:mpm
模組:beos, mpm_netware, mpm_winnt, mpmt_os2, prefork, worker
這個指令設定伺服器的tcp傳送緩衝區的大小(位元組)。提高這個值會導致兩個後果:高速度和高潛伏時間(100ms左右)。如果設定為」0″,將使用作業系統預設值。
通過源**方式編譯你的apache/php/database 可讓你的程式增加10–15%的速度
下面再說說在**優化的時候應該注意的:
1、短**不等於快的**
很多人在寫程式時希望將**寫的越簡潔越好,但是越短的**有時候反而需要更長的執行時間,所以哪怕是用更多的**也不使用速度慢的**
2、在寫程式的時候更應該注重程式的擴充套件性,而不是追求速度
3、在優化你的**之前,先看看跟資料庫有關的部分,因為大多數應用程式的瓶頸在資料庫而不是**
4、微優化得不償失
什麼叫做微優化?就像前面所說的將正規表示式部分的**改用字串函式代替。這樣做有以下缺點:
(1) 花費時間較長
(2) 不會解決你的效能問題
(3) 很有可能會破壞以前的**從而產生未知的錯誤
(4) 付出大於回報
這裡還不得不提到乙個誤區,有些人為了讓程式更加優化,在分析業務邏輯的時候便將優化考慮在內了,從而為了得到更優的**而改動業務邏輯。這是十分愚蠢的想法,因為程式的目的便是為了處理現實中遇到的問題,是為這些問題服務的,怎麼能本末倒置呢。
SQL優化那些事
說到sql優化,網上也充斥著各種優化方案。這裡總結一下 一 建立索引 建立索引是最快速,也是最有效的優化方式。你肯定也聽說過,索引並不是越多越好。具體什麼時候需要建立索引,什麼時候不能建立索引。具體都有什麼樣的規則 首先索引並不是越多越好,要做到寧缺毋濫。一張表中索參數量建議不超過4個 1 以下情況...
app 效能優化的那些事
iphone上面的應用一直都是以流暢的操作體驗而著稱,但是由於之前開發人員把注意力更多的放在開發功能上面,比較少去考慮效能的問題,可能這其中涉及到objective c,c 跟lua,優化起來相對複雜一些,導致應用在比如touch等較低端的產品上,光從啟動到進入頁面就花了將近一分鐘的時間,頁面之間的...
iOS app效能優化的那些事 二
tableview 滑動不流暢 那碰到這種情況該怎麼處理,分析影象動畫效能主要用的是core animation這個元件,先簡單介紹一下裡面一些經常用到的選項 當你碰到效能問題的時候,你可以思考一下 是否受到cpu或者gpu的限制?是否有不必要的cpu渲染?是否有太多的離屏渲染操作?是否有太多的圖層...