PHP面試問題總結

豎橫山發表於2021-07-26

垃圾回收機制

每個PHP變數存在一個叫zval的結構體中,除了包含變數型別和值,還包括is_ref(=true指標變數,-false普通變數),refcount(指向這個變數的個數),當刪除元素導致refcount=0時,這個變數被垃圾回收機制刪除
以下操作會導致refcount永遠不為0,可能導致記憶體溢位

$a = array( 'one' );
$a[] =& $a;
unset($a);

每當refcount減一的時候,變數放到跟快取區,等待週期回收處理,每當根快取區存滿時(預設10000),就會執行回收演算法

FPM調優

pm = dynamic : 靈活模式,子程式的數量是根據以下指令來動態生成的,預設是這個模式:
pm.max_children,//最大子程式數
pm.start_servers,//初始化啟動程式數
pm.min_spare_servers,//最低閒置程式數
pm.max_sqare_servers//最高閒置程式數

pm = ondemand: 死魚模式,這個模式只有請求來了之後才會啟動子程式,幾乎每次都要等待一次啟動worker的時間,比較適合虛擬主機模式,pm.process_idle_timeout秒後殺掉子程式

pm = static: 最大馬力模式,子程式的數量是由pm.max_children指令來確定的,一直以最大子程式運作,很耗記憶體,但是反應賊快,伺服器記憶體賊大的可以用這個,如果你伺服器有8G以上,一個程式按20M算,100個程式加起來才2G

日誌 多寫點日誌準沒錯
慢日誌
slowlog = /usr/local/var/log/php-fpm.log.slow
request_slowlog_timeout = 15s
錯誤日誌
error_log =  /usr/local/var/log/php-fpm.log
訪問日誌
access.log = log/$pool.access.log

OPCACHE 程式碼=>AST抽象語法樹=>生成opcode快取 之後還可以最佳化
opcache.enable=1    //預設關閉
opcache.memory_consumption=512//最大記憶體空間,單位MB
opcache.interned_strings_buffer=64
opcache.max_accelerated_files=32531//快取指令碼數量

opcache.validate_timestamps=0//0不校驗檔案變動,檔案改動,需要手動清除opcache
opcache.validate_timestamps=0//1校驗檔案變動,
opcache.revalidate_freq=10 //校驗檔案的時間間隔
opcache.save_comments=1//保留註釋,?註解要用到?
opcache.fast_shutdown=0
##PHP7.4+ 預載入檔案
opcache.preload=/home/rawphp/preload.php
opcache.preload_user=odin


CGI 、FASTCGI 、 PHPFPM 、 PHPCGI

CGI 是個協議,規定伺服器傳輸給動態指令碼資料格式的協議
FASTCGI 提高CGI的效能,啟動一個master程式,解析php.ini檔案,請求過來的時候直接複製一個worker程式出來,立即可以處理請求,而且也可以預先啟動pm.start_servers個worker等操作提高效能
PHPFPM 是一個實現了FASTCGI的程式
PHPCGI 只是一個CGI處理程式 簡單解析請求返回結果,沒有程式管理等高階功能
本作品採用《CC 協議》,轉載必須註明作者和本文連結
遇強則強,太強另說

相關文章