摘要:Swoole是一個PHP語言的高性能網絡通信框架,提供了PHP語言的異步多線程服務器,異步TCP/UDP網絡客戶端,異步MySQL,數據庫連接池,AsyncTask,消息隊列,毫秒定時器,異步文件讀寫,異步DNS查詢。強大的功能,由背後若干個分工明確的進程來實現,這裡詳細介紹下幾個進程的分工,以便入門者更快速的理解Swoole框架。
Swoole官網
Swoole:PHP語言的高性能網絡通信框架,提供了PHP語言的異步多線程服務器,異步TCP/UDP網絡客戶端,異步MySQL,數據庫連接池,AsyncTask,消息隊列,毫秒定時器,異步文件讀寫,異步DNS查詢。 Swoole雖然是標准的PHP擴展,實際上與普通的擴展不同。普通的擴展只是提供一個庫函數。而swoole擴展在運行後會接管PHP的控制權,進入事件循環。當IO事件發生後,swoole會自動回調指定的PHP函數。
$serv = new swoole_server("127.0.0.1", 9501);
$serv->set(array(
'worker_num' => 8, //工作進程數量
'daemonize' => true, //是否作為守護進程
));
$serv->on('connect', function ($serv, $fd){
echo "Client:Connect.\n";
});
$serv->on('receive', function ($serv, $fd, $from_id, $data) {
$serv->send($fd, 'Swoole: '.$data);
$serv->close($fd);
});
$serv->on('close', function ($serv, $fd) {
echo "Client: Close.\n";
});
$serv->start();
$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
//設置事件回調函數
$client->on("connect", function($cli) {
$cli->send("hello world\n");
});
$client->on("receive", function($cli, $data){
echo "Received: ".$data."\n";
});
$client->on("error", function($cli){
echo "Connect failed\n";
});
$client->on("close", function($cli){
echo "Connection close\n";
});
//發起網絡連接
$client->connect('127.0.0.1', 9501, 0.5);
更多代碼片段請見swoole官網。
Master進程主要用來保證Swoole框架機制的運行。它會創建幾個功能性的線程:
swoole中Worker/Task進程都是由Manager進程Fork並管理的。
為什麼不是Master進程呢,主要原因是Master進程是多線程的,不能安全的執行fork操作。
Swoole提供了完善的進程管理機制,當Worker進程異常退出,如發生PHP的致命錯誤、被其他程序誤殺,或達到max_request次數之後正常退出。主進程會重新拉起新的Worker進程。 Worker進程內可以像普通的apache+php或者php-fpm中寫代碼。不需要像Node.js那樣寫異步回調的代碼。
Task進程的全稱是task_worker進程,是一種特殊的worker進程。所以onWorkerStart在task進程中也會被調用。當$worker_id >= $serv->setting['worker_num']時表示這個進程是task_worker,否則,代表此進程是worker進程。
onStart onShutdown onMasterConnect onMasterClose onTimer
onWorkerStart onWorkerStop onConnect onClose onReceive onTimer onFinish
onTask onWorkerStart
onManagerStart onManagerStop