CentOS上PHP內存使用優化策略
通過php.ini
文件限制腳本最大內存使用,避免單個腳本過度消耗內存。找到memory_limit
參數(通常位于/etc/php.ini
),根據應用需求設置合理值(如128M
或256M
);同時調整上傳相關參數:post_max_size
(POST數據最大大?。?、upload_max_filesize
(上傳文件最大大?。?,避免大文件上傳導致內存溢出。修改后需重啟PHP服務(如systemctl restart php-fpm
)使配置生效。
OPcache通過緩存編譯后的PHP腳本字節碼,減少重復編譯的開銷,顯著降低內存消耗。安裝OPcache擴展(sudo yum install php-opcache
),并在php.ini
中啟用:
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128 # OPCache緩存內存大?。∕B),根據服務器內存調整
opcache.interned_strings_buffer=8 # 內部字符串緩存大小
opcache.max_accelerated_files=4000 # 最大加速腳本數量
優化后可使腳本執行效率提升30%~50%,內存使用減少20%~30%。
unset()
函數銷毀不再需要的變量(如大數組、數據庫查詢結果),釋放內存。例如:$data = range(1, 1000000); // 生成大數組
processData($data); // 處理數據
unset($data); // 釋放內存
PDO::FETCH_ASSOC
或fetch_row()
逐行讀取數據庫查詢結果,避免一次性加載全部數據到內存。例如:$stmt = $pdo->query("SELECT * FROM large_table");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
// 逐行處理數據
}
yield
關鍵字創建生成器,按需生成數據,減少內存占用。例如:function getLargeDataSet() {
for ($i = 0; $i < 1000000; $i++) {
yield $i; // 每次迭代生成一個值
}
}
foreach (getLargeDataSet() as $item) {
// 處理每個數據項
}
__destruct()
析構函數手動打破引用,或PHP 7.4+的WeakReference
(弱引用)類。例如:class A {
public $b;
public function __construct() {
$this->b = new B($this);
}
public function __destruct() {
$this->b->a = null; // 手動打破循環引用
}
}
class B {
public $a;
public function __construct(A $a) {
$this->a = $a;
}
}
$a = new A();
unset($a); // 此時可正常釋放內存
PHP-FPM的進程管理參數直接影響內存使用,需根據服務器內存和負載調整/etc/php-fpm.d/www.conf
中的參數:
pm.max_children
:最大子進程數,建議設置為服務器內存(MB)/ 單個腳本內存限制(MB)
(如1GB內存、128M限制則設為8
),避免過多進程占用內存。pm.start_servers
:啟動時的子進程數,通常設置為CPU核心數的4倍(如4核CPU設為16
)。pm.max_requests_per_child
:每個子進程處理的最大請求數(如1000
),達到后自動重啟進程,防止內存泄漏累積。對于頻繁訪問的數據庫查詢結果、計算密集型操作,使用緩存系統(如Redis、Memcached)存儲結果,減少內存消耗。例如,使用Redis緩存查詢結果:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$key = 'user_data_123';
if ($redis->exists($key)) {
$data = $redis->get($key); // 從緩存讀取
} else {
$data = $db->query("SELECT * FROM users WHERE id = 123")->fetch();
$redis->set($key, $data, 3600); // 緩存1小時
}
緩存可將內存使用減少50%以上,同時提升響應速度。
top
、htop
、free -m
等命令監控服務器內存使用情況,及時發現內存異常。memory_get_usage()
和memory_get_peak_usage()
函數記錄腳本內存使用,識別內存泄漏點。例如:echo "當前內存使用:" . memory_get_usage() . " 字節\n";
echo "峰值內存使用:" . memory_get_peak_usage() . " 字節\n";
xdebug.profiler_enable=1
),或Blackfire進行深度性能分析,定位內存泄漏的代碼位置。xdebug
僅在調試時開啟),減少內存占用。通過php -m
查看已加載擴展,修改php.ini
中的extension=
行禁用無用擴展。