解決類命名衝突:
use com\name\test1\Debug as uDebug;
class Debug{...}
uDebug::test();
__NAMESPACE__ //輸出當前的命名空間
命名空間加大括號形式:算法
namespace com\name\test1{
class Debug1{...}
class Debug2{...}
}
require()調用文件發生錯誤時,將會中止整個程序,sql
調用
include()時遇到相同的錯誤,會生成警告並中止執行包含文件,跳出調用代碼而後繼續執行。
require()和require_once()用於包含庫文件時更加安全,include()和include_once()適用於加載模板等操做
相對require()函數,require_once()須要額外的開銷
自動加載autoload:
當PHP引擎遇到試圖實例化未知類的操做時,會調用__autoload()方法(需提早定義),並將類名看成字符串參數傳遞
例如:
function __autoload($className){
//將$className中的下劃線轉換爲目錄分割
$path = str_replace('_',DIRECTORY_SEPARATOR,$className);
require_once("$path.php");
}
__autoload方法是一種根據類和文件的結構,管理類庫文件包含的有效方法。數據庫
類函數:
class_exists();
get_declared_classes(); //得到腳本進程中定義的全部類的數組
get_class($obj); //檢查對象的類,檢查對象所屬的類
$obj instalceof className; //檢查對象
get_class_methods(); //獲取一個類中全部的方法列表
is_callable()、method_exists() //檢查類方法是否存在且可被調用
#一個方法存在並不覺得着可調用,對private、protected、public方法,method_exists()都返回true
get_class_vars($className); //獲取類中定義的屬性
get_parent_class($classNa,e); //獲取一個類的父類
is_subclass_of($className , 'classStrName'); //檢查類是不是另外一個類的派生類
class_implements($className); //返回一個由接口名組成的數組
反射API
根據到達地找到出發地和來源,反射指在PHP運行狀態中擴展分析PHP程序,導出或提取出關於類、方法、屬性、參數等的詳細信息,包括註釋。這種動態獲取信息以及動態調用對象方法的功能稱爲反射API
使用反射API能夠對文件裏的類進行掃描,逐個生成描述文件
面向對象設計的五大原則:
- 單一職責原則
- 接口隔離原則
- 開放-封閉原則
- 替換原則
- 依賴-倒置原則
sql優化的10個原則:
- 不要在列上進行函數運算,致使索引失敗
- 使用JOIN時,應用小結果集驅動大結果集。把複雜的JOIN查詢拆分爲多條sql
- 使用like模糊查詢時,避免%%,可替換爲<= 、 >=
- select後僅列出須要的字段,對速度不會有明顯影響,主要考慮節省內存
- 使用批量插入語句,比依次執行單個插入節省交互
- limit的技術比較大時考慮使用between
- 不要使用rand函數獲取多條隨機記錄
- 避免使用NULL
- 不要使用count(id),而是count(*)
- 儘量在索引中完成排序
緩存的三個要素:
- 命中率
- 緩存更新策略
- 緩存最大數據量
一般緩存更新策略有:
- FIFO(先進先出)
- LRU(最近最少淘汰策略)
- LFU(最少使用淘汰策略)
MySQL 的 Query Cache使用的是FIFO策略
緩存的最大數據量是在緩存中可以處理元素的最大數或所能使用的最大存儲空間
超過緩存機制容許的最大數據量系統會進行相應的處理,通常
處理方式有:
- 中止緩存服務器,清空全部緩存數據
- 拒絕寫入,再也不對緩存數據進行更新
- 根據緩存更新策略清除舊數據
- 基於3的方式,對淘汰的數據進行備份
Opcode緩存:
虛擬機把PHP代碼編譯成一種中間碼的結果緩存起來,下次PHP運行此頁面時,只要直接解釋這些代碼就好了。
eAccelerator工具能起到常駐內存的做用
客戶端緩存、http緩存(待記錄)
H5中的Application Cache:
用來處理離線應用中的問題,用戶不能聯網時依然能瀏覽整個站點
須要在html中指定頁面是否須要此緩存:
<html manifest="cacheName.mf">
Memcached
使用Memcached:
- 對數據庫的高併發讀寫
- 對海量數據處理
Memcached是高性能的分佈式內存緩存服務器,經過緩存數據庫查詢結果,減小數據庫訪問次數。
Memcached特色:
- 協議簡單
- 基於libevent的事件處理
- 內置內存存儲方式
- 採用不互相通訊的分佈式
- 以守護進程方式運行與一個或多個服務器中
- Memcached使用LRU算法淘汰數據緩存
- 不支持數據持久化
Memcached把數據存儲在內存中,因此重啓Memcached或者操做系統會致使數據所有消失
安裝memcached:
apt-get install memcached
啓動memcached:
memcached -d -m 128 -u root -p 11211
-d:守護進程方式運行
-m:設置Memcached可以使用的內存大小,單位是MB
-l:設置監聽的IP地址,本機可默認不設置
-u:指定用戶
-p:設置監聽的端口,默認爲
11211
安裝PHP的memcached擴展:
sudo apt-get install php5-memcache
memcached擴展的一些方法:
- Memcache::connect(string $host [, int $port [ , int $timeout]]); //鏈接mem服務器
$timeout爲鏈接持續時間,默認爲1秒。過長的時間會倒置失去全部緩存的優點
- Memcache::addServer(string $host [ , $port [ , $bool $persistent [ , $weight [, int $timeout [, int $retry_interval [ , bool $status [ , callback $failure_callback]]]]]]]); //向對象添加一個服務器
- Memcache::add(string $key,$mixed $var [, int $flag[ , int $expire]]); //添加緩存數據
- key長度不能超過250字節,
- var 值最大爲1MB
- $flag 是否使用ZLib壓縮,設置爲MEMACHE_COMPRESSED使用壓縮
- $expire緩存過時時間,0表示不過時。設置不能大於2592000(30天)
- Memcache::replace(string $key, mixed $var [ , int $flag [, int $expire]]); //替換一個已存在的key
- Memcache::set(string $key ,mixed $vsar [ , $flag [ , $expire]]) //add和replace的集合體
- Memcache::get(string $key [ , int &flags]); //獲取key的緩存內容
- $flags 若是給定此參數(引用方式傳遞),該參數會被寫入一些與key對應的信息
- Memcache::delete(string $key [ , $timeout]); //刪除key的緩存
- Memcache::flush(void); //當即使全部已經存在的緩存失效
- Memcache::getServerStatus(string $host [ , $port]); //獲取一個服務器的在線/離線狀態
- Memcache::getStats([ string $type [ , $slabid [ , int $limit = 100]]]); //獲取服務器的統計信息
- Memcache::close(void); //關閉與Memcache服務器的鏈接
Memcached使用多路複用I/O模型(如epoll、select),傳統阻塞IO中 系統可能會由於某個用戶鏈接還沒作好IO準備而一直等待,直到這個鏈接作好準備,若是此時遊其餘用戶鏈接到服務器,可能會由於系統阻塞而得不到相應。
多路複用I/O是一種消息通知模式,用戶鏈接作好IO準備後,系統會通知這個鏈接可進行IO操做,這樣就不會阻塞在某個用戶鏈接。
Memcached使用Slab分配算法保存數據
Slab分配算法的原理是,把固定大小(mem默認爲1M)的內存劃分爲n塊,每1M大小的內存塊稱爲一個slab頁,每次向系統申請一個slab頁,而後經過分割算法把這個slab頁分紅若個小塊的chunk,而後把這些chunk分配給用戶使用。
Memcached多線程模型:
- 主線程:接受客戶端鏈接,並把鏈接分配給工做線程處理
- 工做線程:處理客戶端鏈接的請求
Memcached分佈式佈置方案:
Redis
Redis把整個數據庫全加載到內存中進行操做,經過異步操做按期把數據庫數據flush到硬盤保存
Reids特色:
- 支持豐富的數據類型:String、List、Sort、Sorted Set、Hash
- 支持數據持久化方式:內存快照、日誌追加
- 支持主從複製
安裝Redis:
安裝php擴展redis:
sudo apt-get install php5-redis
redis默認端口爲:6379
redis配置文件(待整理)
redis key相關命令:
exits key //key是否存在,返回0/1
del key1 key2.. //刪除指定key,返回刪除key的數目,0表示key都不存在
type key //返回給定key的value類型,none表示不存在key
types pattern //返回匹配指定模式的全部key
expire key seconds //設置指定key的過時時間
randomkey //返回當前數據庫中隨機的一個key,若是數據庫爲空,返回空字符串
rename oldkey newkey //重命名key
renamenx oldkey newkey //重命名key,若是newkey存在返回失敗
ttl key //返回設置過時時間key的剩餘秒數,-1表示key不存在或沒有設置過時時間
move key db-index //將key從當前數據庫移動到指定的數據庫,返回1成功,0表示不存在或已在指定數據庫
未完待續……