php是一門廣泛應用于網站開發的編程語言,它的優勢在于數據結構簡單、可讀性高、開發效率高等方面。為了讓php在高并發時也能快速響應,開發人員提出了php pm模式。
pm是進程管理的英文縮寫,常見的php pm有以下幾種:
1. php-fpm 2. swoole 3. php-pm
這些pm模式的目的都是為了提高php處理請求的效率和穩定性。
以php-fpm為例,它是常見的php pm模式之一,可以通過nginx等web服務器來調用它。當php-fpm接收到客戶端請求時,會fork出一些子進程來處理請求,而主進程則負責管理這些子進程的狀態。如果有子進程因為處理請求超時、異常等問題而出錯,主進程會自動重啟它。
[global] pid = /var/run/php-fpm/php-fpm.pid error_log = /var/log/php-fpm/error.log log_level = notice [www] listen = /var/run/php-fpm/php-fpm.sock user = nginx group = nginx listen.owner = nginx listen.group = nginx listen.mode = 0660 pm = dynamic pm.max_children = 150 pm.start_servers = 20 pm.min_spare_servers = 5 pm.max_spare_servers = 35 request_terminate_timeout = 30s request_slowlog_timeout = 5s slowlog = /var/log/php-fpm/www-slow.log
上面的代碼是php-fpm的配置文件,其中pm.max_children表示最多fork的子進程數量;pm.start_servers表示啟動時的子進程數量;pm.min_spare_servers和pm.max_spare_servers表示子進程數量的范圍,以應對不同負載情況下的變化。request_terminate_timeout和request_slowlog_timeout則是用于設置請求超時和請求慢日志的。
相比于php-fpm,swoole是一種更輕量化、更高性能的php pm模式。swoole的設計理念是基于協程的。在swoole中,可以使用coroutine來開發高效的異步任務。比如,可以將常規的同步文件讀寫操作轉化為異步操作,從而提高程序的并發能力。
<?php Co\run(function () { $server = new Swoole\Server('127.0.0.1', 9501, SWOOLE_BASE); $server->set([ 'worker_num' => 2, 'daemonize' => false, 'max_request' => 1000, 'dispatch_mode' => 2, 'debug_mode' => 1 ]); $server->on('connect', function ($server, $fd) { echo 'connect'.PHP_EOL; }); $server->on('receive', function ($server, $fd, $reactor_id, $data) { echo 'receive'.PHP_EOL; $server->send($fd, 'Swoole: '.$data); }); $server->on('close', function ($server, $fd) { echo 'close'.PHP_EOL; }); $server->start(); }); ?>
swoole的運行方式也很簡單,只需要使用swoole提供的圖中所示的方式即可創建監聽的server。其中,worker_num表示啟動的worker進程數量;dispatch_mode表示task的分配模式;max_request表示每個worker進程最多處理的請求次數。
除了php-fpm和swoole,還有php-pm等其他pm模式可供選擇。php-pm采用的是多線程的方式來處理請求。由于多進程之間存在信號處理等機制的超時等待,因此php-pm在高并發場景下的表現并不理想。
綜上,不同的場景需要選擇不同的php pm模式,以滿足業務的需求。php-fpm適合對穩定性、錯賬處理等略顯保守的場景;而swoole適合對性能、并發處理性等有高要求的場景。除此之外,還有php-pm等其他的pm模式可供選擇,需開發人員在自己的場景下進行權衡,選擇最適合自己的模式。