這篇文章主要介紹php加速PHP APC的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
在瀾滄等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需求定制設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),網(wǎng)絡(luò)營銷推廣,外貿(mào)網(wǎng)站制作,瀾滄網(wǎng)站建設(shè)費(fèi)用合理。
PHP APC提供兩種緩存功能,即緩存Opcode(目標(biāo)文件),我們稱之為apc_compiler_cache。同時(shí)它還提供一些接口用于PHP開發(fā)人員將用戶數(shù)據(jù)駐留在內(nèi)存中,我們稱之為apc_user_cache。我們這里主要控討php-apc的配置。
作為測試環(huán)境,我們這里使用的是CentOS5.3(2.6.18-128.el5PAE) + Apache2.0(prefork) + php5.2。我們可以去pecl apc下載APC-3.0.19.tgz
# tar -xzvf APC-3.0.19.tgz #cd APC-3.0.19 # /usr/bin/phpize # ./configure --enable-apc --enable-mmap --enable-apc-spinlocks --disable-apc-pthreadmutex #make #make install
注意:我們這里支持mmap,同時(shí)采用spinlocks自旋鎖。Spinlocks是Facebook推薦使用,同時(shí)也是APC開發(fā)者推薦使用的鎖機(jī)制。
如果你使用的系統(tǒng)環(huán)境跟我的測試環(huán)境是一樣的話,可以在/etc/php.d目錄下創(chuàng)建文件apc.ini,并且相關(guān)配置寫入/etc/php.d/apc.ini文件。這里,我們挑了一些常用到的配置,并進(jìn)行探討。把相關(guān)的配置放在一起解釋。
apc.enabled=1
apc.enabled默認(rèn)值是1,你可設(shè)成0禁用APC。如果你設(shè)置為0的時(shí)候,同樣把extension=apc.so也注釋掉(這樣可以節(jié)約內(nèi)存資源)。一旦啟用了APC功能,則會(huì)緩存Opcodes到共享內(nèi)存。
apc.shm_segments = 1
apc.shm_size = 30
APC既然把數(shù)據(jù)緩存在內(nèi)存里面,我們就有必要對(duì)它進(jìn)行內(nèi)存資源限定。通過這二個(gè)配置可以限定APC可以使用的內(nèi)存空間大小。apc.shm_segments指定了使用共享內(nèi)存塊數(shù),而apc.shm_size則指定了一塊共享內(nèi)存空間大小,單位是M。所以,允許APC使用的內(nèi)存大小應(yīng)該是 apc.shm_segments * apc.shm_size = 30M。你可以調(diào)整一塊共享內(nèi)存的大小空間。當(dāng)然,一塊共享內(nèi)存最大值是受操作系統(tǒng)限制的,即不能超過/proc/sys/kernel/shmmax大小。否則APC創(chuàng)建共享內(nèi)存的時(shí)候,會(huì)失敗。在apc.shm_size達(dá)到了上限的時(shí)候,你可以通過設(shè)置apc.shm_segments來允許APC使用更多的內(nèi)存空間。我們推薦,如果調(diào)用APC使用內(nèi)存空間的話,先考濾apc.shm_size,后考濾apc.shm_segments。具體數(shù)值,可以根據(jù)apc.php監(jiān)控情況進(jìn)行規(guī)劃與調(diào)整。值得注意的是,每一次調(diào)整需要重啟httpd守護(hù)進(jìn)程,這樣可以重新加載apc.so模塊。跟隨著httpd守護(hù)進(jìn)程啟動(dòng),apc.so模塊就會(huì)加載。apc.so加載初始化的時(shí)候,通過mmap請(qǐng)求分配內(nèi)存指定大小的內(nèi)存,即apc.shm_size
* apc.shm_segments。而且,這里使用的是匿名內(nèi)存映射方式,通過映射一個(gè)特殊設(shè)備/dev/zero,提供一個(gè)“大型”的,填滿了零的內(nèi)存供APC管理。
為了驗(yàn)證以上陳述,我們注釋掉apc.ini配置,并且寫了以下php腳本觀察apc.so模塊初始化的分配的內(nèi)存空間。
<?php//@file: apc_load.phpif (!extension_loaded('apc')) { dl('apc.so');#加載apc.so模塊 echo posix_getpid();#//輸出當(dāng)前進(jìn)程的pid,我這里這里輸出的是14735 ob_flush(); flush(); sleep(3600);#讓進(jìn)程進(jìn)入休眠狀態(tài).這樣,我們可以觀察內(nèi)存分配情況 }?>#strace -p `cat /var/run/httpd.pid` open("/var/www/html/apc_load.php", O_RDONLY) = 13 ...mmap2(NULL, 31457280, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0) = 0xb5ce7000... nanosleep({3600, 0},紅色部分,我們可以看出。通過mmap系統(tǒng)內(nèi)核調(diào)用分配了30M(31457280/1024/1024)內(nèi)存空間。PROT_READ|PROT_WRITE表示該內(nèi)存空間可供讀取與寫入。MAP_SHARED表示該內(nèi)存空間與其它進(jìn)程是共享的,即其它進(jìn)程也可以進(jìn)行讀取與寫入,我們可以通過apc.php進(jìn)行管理該塊內(nèi)存空間亦是受益于此設(shè)定。MAP_ANONYMOUS則表示匿名映射。其中fd=-1表示忽略,因?yàn)檫@里映射的特殊設(shè)備/dev/zero。最后的0表示無偏移量。我們還可以通過進(jìn)程映像文件查看該塊內(nèi)存的具體情況
#cat /proc/14735/smapsb5ce7000-b7ae7000 rw-s 00000000 00:08 633695 /dev/zero (deleted) Size: 30720 kB Rss: 44 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 44 kB可以很容易地發(fā)現(xiàn)起始地址0xb5ce7000與上面mmap系統(tǒng)內(nèi)核調(diào)用返回的地址一樣。該塊內(nèi)存是可讀寫rw,并與其它進(jìn)程共享s。而/dev/zero則是映射文件,該文件節(jié)點(diǎn)是633695。其中,size表示進(jìn)程可以使用的內(nèi)存空間,而rss則表示實(shí)際分配的內(nèi)存空間,且由Private_Dirty可以看出,實(shí)際分配的44kb內(nèi)存是由當(dāng)前進(jìn)程自己分配的。
apc.num_files_hint = 1000
apc.user_entries_hint = 4096
這二配置指定apc可以有多少個(gè)緩存條目。apc.num_files_hint說明你估計(jì)可能會(huì)有多少個(gè)文件相應(yīng)的opcodes需要被緩成,即大約可以有多少個(gè)apc_compiler_cache條目。另外apc.user_entries_hint則說明你估計(jì)可能會(huì)有多少個(gè)apc_userdata_cache條目需要被緩存。如果項(xiàng)目中不使用apc_store()緩存用戶數(shù)據(jù)的話,該值可以設(shè)定得更小。也就是說apc.num_files_hint與apc.user_entries_hint之和決定了APC允許最大緩存對(duì)象條目的數(shù)量。準(zhǔn)確地設(shè)置這二個(gè)值可以得到最佳查詢性能。當(dāng)然,如果你不清楚要進(jìn)行多少緩存(緩存對(duì)象實(shí)例)的情況下,你可以不必修改這二項(xiàng)配置。
其中apc.user_entries_hint要根據(jù)項(xiàng)目實(shí)際開發(fā)使用了apc_store()條目估計(jì)其值大小。相較而言,apc.num_files_hint可以通過find命令,更容易地估計(jì)其大小。比如我們的web根目是/var/vhosts,則使用下面的find命令可以大致地統(tǒng)計(jì)當(dāng)前apc.num_files_hint數(shù)目.
#find /var/vhosts \( -name “*.php” -or -name “*.inc” \) -type f -print |wc -l
1442apc.stat = 1
apc.stat_ctime = 0
這二個(gè)參數(shù),只跟apc_compiler_cache緩存相關(guān),并不影響apc_user_cache。我們前面提到過apc_complier_cache,它緩存的對(duì)象是php源文件一一對(duì)應(yīng)的opcodes(目標(biāo)文件)。PHP源文件存放在磁盤設(shè)備上,與之相對(duì)應(yīng)的Opcodes目標(biāo)文件位置內(nèi)存空間(共享內(nèi)存),那么當(dāng)php源文件被修改以后,怎么通知更新內(nèi)存空間的opcodes呢?每次接收到請(qǐng)求后,APC都會(huì)去檢查打開的php源文件的最后修改時(shí)間,如果文件的最后修改時(shí)間與相應(yīng)的內(nèi)存空間緩存對(duì)象記錄的最后修改時(shí)間不一致的話,APC則會(huì)認(rèn)為存放在內(nèi)存空間的Opcode目標(biāo)文件(緩存對(duì)象)已經(jīng)過期了,acp會(huì)將緩存對(duì)象清除并且保存新解析得到的Opcode。我們關(guān)心的是,即便沒有更新任何php源文件,每次接受到http請(qǐng)求后,APC都會(huì)請(qǐng)求系統(tǒng)內(nèi)核調(diào)用stat()來獲取php源文件最后修改時(shí)。我們可以通過將apc.stat設(shè)置為0,要求APC不去檢查Opcodes相對(duì)應(yīng)的php源文件是否更新了。這樣可以獲得最佳的性能,我們也推薦這么做。不過,這樣做有一點(diǎn)不好的就是,一旦有PHP源文件更新了之后,需要重啟httpd守護(hù)進(jìn)程或者調(diào)用apc_cache_clear()函數(shù)清空APC緩存來保證php源文件與緩存在內(nèi)存空間的Opcodes相一致。這篇文章發(fā)布于 2010年04月29日,星期四,7:43 上午,歸類于 PHP。您可以跟蹤這篇文章的評(píng)論通過 RSS 2.0 feed。
以上是“php加速PHP APC的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
本文名稱:php加速PHPAPC的示例分析
分享地址:http://sd-ha.com/article14/iedpge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站建設(shè)、云服務(wù)器、、響應(yīng)式網(wǎng)站、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)