調整內核參數以提升系統對高并發的處理能力。關鍵配置包括:
/etc/security/limits.conf,增加nofile(最大文件描述符數),如* soft nofile 65535; * hard nofile 65535,避免高并發下連接數受限。/etc/sysctl.conf,啟用TCP窗口縮放(net.ipv4.tcp_window_scaling=1)、調整TCP緩沖區大?。?code>net.core.rmem_max=16777216; net.core.wmem_max=16777216)、減少SYN等待時間(net.ipv4.tcp_synack_retries=2),提升網絡傳輸效率。vm.swappiness設置為10(默認60),減少系統使用交換分區的頻率,優先利用物理內存,降低IO延遲。啟用OPcache加速PHP腳本執行,修改php.ini:
[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=256 ; 緩存大?。∕B),根據服務器內存調整
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000 ; 緩存文件數量
opcache.revalidate_freq=60 ; 文件修改檢查間隔(秒)
同時,調整PHP-FPM參數(php-fpm.conf)以適應并發需求:
pm = dynamic
pm.max_children = 50 ; 最大子進程數(根據內存計算:內存/單個進程占用)
pm.start_servers = 5 ; 啟動時的進程數
pm.min_spare_servers = 5 ; 最小空閑進程數
pm.max_spare_servers = 35 ; 最大空閑進程數
.env文件中設置APP_DEBUG = false,禁用調試信息的輸出(如SQL日志、錯誤堆棧),減少不必要的資源消耗。php think optimize:route命令生成路由緩存文件,避免每次請求都重新注冊路由,降低框架開銷。config/log.php中的level設置為error,僅記錄錯誤日志,避免大量info日志占用IO資源。with()方法實現關聯預加載,避免N+1查詢問題(如User::with('posts')->select());禁止在循環中執行數據庫查詢,盡量使用批量操作(如Db::name('user')->insertAll($data))。'cache' => [
'type' => 'redis',
'host' => '127.0.0.1',
'port' => 6379,
'select' => 0,
],
通過Cache::remember('key', 3600, function(){ ... })實現熱點數據預加載。WHERE、JOIN、ORDER BY)添加索引,使用EXPLAIN分析SQL執行計劃,避免全表掃描。slow_query_log=1),通過pt-query-digest等工具分析慢查詢,優化復雜SQL(如拆分大查詢、避免SELECT *)。WHERE DATE(create_time) = '2025-10-01')、使用OR連接未索引的字段。使用數據庫連接池(如Swoole的連接池)減少連接建立和銷毀的開銷,配置示例(database.php):
'connections' => [
'mysql' => [
'pool_size' => 100, ; 連接池大小
'pool_get_timeout' => 5, ; 獲取連接超時時間(秒)
],
],
采用多級緩存架構提升訪問速度:
think-cache的本地緩存驅動,緩存小數據(如配置項),減少Redis訪問次數。'cache' => [
'type' => 'redis',
'host' => '127.0.0.1',
'port' => 6379,
],
cron)預熱熱點數據(如每小時加載熱門商品數據到Redis),避免首次訪問時的延遲。將靜態資源(圖片、CSS、JS、字體)托管到CDN(內容分發網絡),利用CDN的邊緣節點緩存資源,減少用戶訪問時的網絡延遲和服務器帶寬消耗。
將靜態資源部署到獨立的服務器(如Nginx專用于靜態資源),配置Nginx示例:
server {
listen 80;
server_name static.yourdomain.com;
root /path/to/static/files;
location / {
expires 30d; ; 設置緩存過期時間
add_header Cache-Control "public";
}
}
通過url助手函數生成靜態資源URL(如url('static/image.jpg')),指向CDN地址。
使用Nginx作為反向代理,配置負載均衡(upstream模塊),將請求分發到多臺ThinkPHP服務器:
upstream thinkphp_servers {
server 192.168.1.1:8080;
server 192.168.1.2:8080;
server 192.168.1.3:8080;
}
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://thinkphp_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
同時,配置Session共享(如Redis存儲Session),避免用戶會話丟失:
'session' => [
'type' => 'redis',
'host' => '127.0.0.1',
'port' => 6379,
'prefix' => 'sess_',
],
使用消息隊列(如RabbitMQ、Redis的list結構)處理耗時任務(如發送郵件、生成報表),避免阻塞主線程。配置示例(ThinkPHP Job):
class SendEmailJob extends Job
{
public function fire($job, $data)
{
// 發送郵件邏輯
Mail::send('email.template', $data, function($message) use ($data) {
$message->to($data['email'])->subject('通知');
});
$job->delete(); // 任務完成,刪除隊列
}
}
// 推送任務到隊列
Queue::push(new SendEmailJob(['email' => 'user@example.com']));
top(查看進程CPU/內存占用)、vmstat(查看系統整體狀態)、iostat(查看磁盤IO)、netstat/ss(查看網絡連接)監控系統資源。New Relic、Datadog監控應用性能(如響應時間、SQL查詢時間、緩存命中率),定位瓶頸。ELK(Elasticsearch+Logstash+Kibana)收集和分析應用日志,快速發現異常。使用Apache JMeter或LoadRunner模擬高并發場景(如1000并發用戶),測試應用的響應時間、吞吐量(QPS),根據測試結果調整配置(如增加PHP-FPM進程數、優化SQL)。