功能描述:創(chuàng)建一個swoole_server資源對象
函數(shù)原型:
// 類成員函數(shù)
public function swoole_server::__construct(string $host, int $port, int $mode = SWOOLE_PROCESS,
int $sock_type = SWOOLE_SOCK_TCP);
// 公共函數(shù)
function swoole_server_create(string $host, int $port, int $mode = SWOOLE_PROCESS,
int $sock_type = SWOOLE_SOCK_TCP);
返回:一個swoole_server對象
參數(shù)說明:
參數(shù) | 說明 |
---|---|
string host | 監(jiān)聽的IP地址 |
int port | 監(jiān)聽的端口號 |
int mode | 運行模式 |
int sock_type | 指定的socket類型 |
說明: host、port、socket_type的詳細說明見swoole_server::addlistener。
mode指定了swoole_server的運行模式,共有如下三種:
mode | 類型 | 說明 |
---|---|---|
SWOOLE_BASE | Base模式 | 傳統(tǒng)的異步非阻塞Server。在Reactor內(nèi)直接回調(diào)PHP的函數(shù)。如果回調(diào)函數(shù)中有阻塞操作會導(dǎo)致Server退化為同步模式。worker_num參數(shù)對與BASE模式仍然有效,swoole會啟動多個Reactor進程 |
SWOOLE_THREAD | 線程模式(已廢棄) | 多線程Worker模式,Reactor線程來處理網(wǎng)絡(luò)事件輪詢,讀取數(shù)據(jù)。得到的請求交給Worker線程去處理。多線程模式比進程模式輕量一些,而且線程之間可以共享堆棧和資源。 訪問共享內(nèi)存時會有同步問題,需要使用Swoole提供的鎖機制來保護數(shù)據(jù)。 |
SWOOLE_PROCESS | 進程模式(默認) | Swoole提供了完善的進程管理、內(nèi)存保護機制。 在業(yè)務(wù)邏輯非常復(fù)雜的情況下,也可以長期穩(wěn)定運行,適合業(yè)務(wù)邏輯非常復(fù)雜的場景。 |
樣例:
$serv = new swoole_server("127.0.0.1" , 8888 , SWOOLE_PROCESS , SWOOLE_SOCK_TCP);
功能描述:設(shè)置swoole_server運行時的各項參數(shù)
函數(shù)原型:
// 類成員函數(shù)
public function swoole_server::set(array $setting);
// 公共函數(shù)
function swoole_server_set(swoole_server $server, array $setting);
返回:無
參數(shù)說明:
參數(shù) | 說明 |
---|---|
array setting | 配置選項數(shù)組,采用key-value形式 |
說明:
該函數(shù)必須在swoole_server::start函數(shù)調(diào)用前調(diào)用。
全部swoole_server的配置參數(shù)點此查看
樣例:
$serv->set(
array(
'worker_num' => 8,
'max_request' => 10000,
'max_conn' => 100000,
'dispatch_mode' => 2,
'debug_mode'=> 1,
'daemonize' => false,
)
);
功能描述:綁定swoole_server的相關(guān)回調(diào)函數(shù)
函數(shù)原型:
// 類成員函數(shù)
public function bool swoole_server->on(string $event, mixed $callback);
返回:設(shè)置成功返回true,否則返回false
參數(shù)說明:
參數(shù) | 說明 |
---|---|
string event | 回調(diào)的名稱(大小寫不敏感) |
mixed callback | 回調(diào)的PHP函數(shù),可以是函數(shù)名的字符串,類靜態(tài)方法,對象方法數(shù)組,匿名函數(shù) |
說明:
該函數(shù)必須在swoole_server::start函數(shù)調(diào)用前調(diào)用。
此方法與swoole_server::handler功能相同,作用是與swoole_client風(fēng)格保持一致。
swoole_server::on中事件名稱字符串不要加on。
全部的回調(diào)函數(shù)列表點此查看
樣例:
$serv->on('connect', function ($serv, $fd){
echo "Client:Connect.\n";
});
$serv->on('receive', array( $myclass, 'onReceive' ) ); // onReceive是myclass的成員函數(shù)
功能描述:給swoole_server增加一個監(jiān)聽的地址和端口
函數(shù)原型:
// 類成員函數(shù)
public function swoole_server::addlistener(string $host, int $port, $type = SWOOLE_SOCK_TCP);
// 公共函數(shù)
function swoole_server_addlisten(swoole_server $serv, string $host, int $port, $type = SWOOLE_SOCK_TCP);
返回:無
參數(shù)說明:
參數(shù) | 說明 |
---|---|
string host | 監(jiān)聽的IP地址 |
int port | 監(jiān)聽的端口號 |
int sock_type | 指定的socket類型 |
說明: swoole支持如下socket類型:
sock_type | 說明 |
---|---|
SWOOLE_TCP/SWOOLE_SOCK_TCP | TCP IPv4 Socket |
SWOOLE_TCP6/SWOOLE_SOCK_TCP6 | TCP IPv6 Socket |
SWOOLE_UDP/SWOOLE_SOCK_UDP | UDP IPv4 Socket |
SWOOLE_UDP6/SWOOLE_SOCK_UDP6 | UDP IPv4 Socket |
SWOOLE_UNIX_DGRAM | Unix UDP Socket |
SWOOLE_UNIX_STREAM | Unix TCP Socket |
Unix Socket僅在1.7.1+后可用,此模式下host參數(shù)必須填寫可訪問的文件路徑,port參數(shù)忽略
Unix Socket模式下,客戶端fd將不再是數(shù)字,而是一個文件路徑的字符串
SWOOLE_TCP等是1.7.0+后提供的簡寫方式,與1.7.0前的SWOOLE_SOCK_TCP是等同的
樣例:
$serv->addlistener("127.0.0.1", 9502, SWOOLE_SOCK_TCP);
$serv->addlistener("192.168.1.100", 9503, SWOOLE_SOCK_TCP);
$serv->addlistener("0.0.0.0", 9504, SWOOLE_SOCK_UDP);
$serv->addlistener("/var/run/myserv.sock", 0, SWOOLE_UNIX_STREAM);
swoole_server_addlisten($serv, "127.0.0.1", 9502, SWOOLE_SOCK_TCP);
功能描述:設(shè)置Server的事件回調(diào)函數(shù)
函數(shù)原型:
// 類成員函數(shù)
public function swoole_server::handler(string $event_name, mixed $event_callback_function);
// 公共函數(shù)
function swoole_server_handler(swoole_server $serv, string $event_name, mixed $event_callback_function);
返回:設(shè)置成功返回true,否則返回false
參數(shù)說明:
參數(shù) | 說明 |
---|---|
string event_name | 回調(diào)的名稱(大小寫不敏感) |
mixed event_callback_function | 回調(diào)的PHP函數(shù),可以是函數(shù)名的字符串,類靜態(tài)方法,對象方法數(shù)組,匿名函數(shù) |
說明: 該函數(shù)必須在swoole_server::start函數(shù)調(diào)用前調(diào)用。
事件名稱字符串要加on。
全部的回調(diào)函數(shù)列表點此查看
onConnect/onClose/onReceive這3個回調(diào)函數(shù)必須設(shè)置。其他事件回調(diào)函數(shù)可選
如果設(shè)定了timer定時器,onTimer事件回調(diào)函數(shù)也必須設(shè)置
如果啟用了task_worker,onTask/onFinish事件回調(diào)函數(shù)必須設(shè)置
樣例:
$serv->handler('onStart', 'my_onStart');
$serv->handler('onStart', array($this, 'my_onStart'));
$serv->handler('onStart', 'myClass::onStart');
功能描述:啟動server,開始監(jiān)聽所有TCP/UDP端口
函數(shù)原型:
// 類成員函數(shù)
public function swoole_server::start()
返回:啟動成功返回true,否則返回false
參數(shù)說明:無
說明:
啟動成功后會創(chuàng)建worker_num+2個進程:Master進程+Manager進程+worker_num 個 Worker進程。
另外。啟用task_worker會增加task_worker_num個Worker進程
三種進程的說明如下:
進程類型 | 說明 |
---|---|
Master進程 | 主進程內(nèi)有多個Reactor線程,基于epoll/kqueue進行網(wǎng)絡(luò)事件輪詢。收到數(shù)據(jù)后轉(zhuǎn)發(fā)到Worker進程去處理 |
Manager進程 | 對所有Worker進程進行管理,Worker進程生命周期結(jié)束或者發(fā)生異常時自動回收,并創(chuàng)建新的Worker進程 |
Worker進程 | 對收到的數(shù)據(jù)進行處理,包括協(xié)議解析和響應(yīng)請求 |
樣例:
$serv->start();
功能描述:重啟所有worker進程。
函數(shù)原型:
// 類成員函數(shù)
public function swoole_server::reload()
返回:調(diào)用成功返回true,否則返回false
參數(shù)說明:無
說明:
調(diào)用后會向Manager發(fā)送一個SIGUSR1信號,平滑重啟全部的Worker進程(所謂平滑重啟,是指重啟動作會在Worker處理完正在執(zhí)行的任務(wù)后發(fā)生,并不會中斷正在運行的任務(wù)。)
小技巧:在onWorkerStart回調(diào)中require相應(yīng)的php文件,當(dāng)這些文件被修改后,只需要通過SIGUSR1信號即可實現(xiàn)服務(wù)器熱更新。
1.7.7版本增加了僅重啟task_worker的功能。只需向服務(wù)器發(fā)送SIGUSR2即可
樣例:
$serv->reload();
功能描述:關(guān)閉服務(wù)器。
函數(shù)原型:
// 類成員函數(shù)
public function swoole_server::shutdown()
返回:調(diào)用成功返回true,否則返回false
參數(shù)說明:無
說明:
此函數(shù)可以用在worker進程內(nèi),平滑關(guān)閉全部的Worker進程。
也可向Master進程發(fā)送SIGTERM信號關(guān)閉服務(wù)器。
樣例:
$serv->shutdown();
功能描述:設(shè)置一個固定間隔的定時器
函數(shù)原型:
// 類成員函數(shù)
public function swoole_server::addtimer(int $interval);
// 公共函數(shù)
function swoole_server_addtimer(swoole_server $serv, int $interval);
返回:設(shè)置成功返回true,否則返回false
參數(shù)說明:
參數(shù) | 說明 |
---|---|
int interval | 定時器的時間間隔,單位為毫秒ms |
說明:
swoole定時器的最小顆粒是1毫秒,支持多個不同間隔的定時器。
注意不能存在2個相同間隔時間的定時器。
使用多個定時器時,其他定時器必須為最小定時器時間間隔的整數(shù)倍。
該函數(shù)只能在onWorkerStart/onConnect/onReceive/onClose回調(diào)函數(shù)中調(diào)用。
增加定時器后需要為Server設(shè)置onTimer回調(diào)函數(shù),否則Server將無法啟動。
樣例:
$serv->addtimer(1000); //1s
swoole_server_addtimer($serv,20); //20ms
功能描述:刪除指定的定時器。
函數(shù)原型:
// 類成員函數(shù)
public function swoole_server::deltimer(int $interval);
返回:無
參數(shù)說明:
參數(shù) | 說明 |
---|---|
int interval | 定時器的時間間隔,單位為毫秒ms |
說明:
刪除間隔為interval的定時器
樣例:
$serv->deltimer(1000);
功能描述:在指定的時間后執(zhí)行函數(shù)
函數(shù)原型:
// 類成員函數(shù)
public function swoole_server::after(int $after_time_ms, mixed $callback_function, mixed params);
// 公共函數(shù)
function swoole_timer_after(swoole_server $serv, int $after_time_ms, mixed $callback_function, mixed params);
返回:無
參數(shù)說明:
參數(shù) | 說明 |
---|---|
int after_time_ms | 指定時間,單位為毫秒ms |
mixed callback_function | 指定的回調(diào)函數(shù) |
mixed params | 指定的回調(diào)函數(shù)的參數(shù) |
說明:
創(chuàng)建一個一次性定時器,在指定的after_time_ms時間后調(diào)用callback_funciton回調(diào)函數(shù),執(zhí)行完成后就會銷毀。
callback_function函數(shù)的參數(shù)為指定的params
需要swoole-1.7.7以上版本。
樣例:
$serv->after(1000, function( $params ){
echo "Do something\n";
} , "data" );
功能描述:關(guān)閉客戶端連接
函數(shù)原型:
// 類成員函數(shù)
public function swoole_server::close(int $fd, int $from_id = 0);
返回:關(guān)閉成功返回true,失敗返回false
參數(shù)說明:
參數(shù) | 說明 |
---|---|
int fd | 指定關(guān)閉的fd |
int from_id | fd來自于哪個Reactor(swoole-1.6以后已廢棄該參數(shù)) |
說明:
調(diào)用close關(guān)閉連接后,連接并不會馬上關(guān)閉,因此不要在close之后立即寫清理邏輯,而是應(yīng)該在onClose回調(diào)中處理
樣例:
$serv->close( $fd );
功能描述:向客戶端發(fā)送數(shù)據(jù)
函數(shù)原型:
// 類成員函數(shù)
public function swoole_server::send(int $fd, string $data, int $from_id = 0);
返回:發(fā)送成功返回true,失敗返回false
參數(shù)說明:
參數(shù) | 說明 |
---|---|
int fd | 指定發(fā)送的fd |
string data | 發(fā)送的數(shù)據(jù) |
int from_id | fd來自于哪個Reactor |
說明:
樣例:
$serv->send( $fd , "Hello World");
功能描述:發(fā)送文件到TCP客戶端連接
函數(shù)原型:
// 類成員函數(shù)
public function swoole_server::sendfile(int $fd, string $filename);
返回:發(fā)送成功返回true,失敗返回false
參數(shù)說明:
參數(shù) | 說明 |
---|---|
int fd | 指定發(fā)送的fd |
string filename | 發(fā)送的文件名 |
說明:
sendfile函數(shù)調(diào)用OS提供的sendfile系統(tǒng)調(diào)用,由操作系統(tǒng)直接讀取文件并寫入socket。sendfile只有2次內(nèi)存拷貝,使用此函數(shù)可以降低發(fā)送大量文件時操作系統(tǒng)的CPU和內(nèi)存占用。
樣例:
$serv->sendfile($fd, __DIR__.'/test.jpg');
功能描述:獲取連接的信息
函數(shù)原型:
// 類成員函數(shù)
public function swoole_server::connection_info(int $fd, int $from_id = 0);
返回:如果fd存在,返回一個數(shù)組,連接不存在或已關(guān)閉返回false
參數(shù)說明:
參數(shù) | 說明 |
---|---|
int fd | 指定發(fā)送的fd |
int from_id | 來自于哪個Reactor |
說明:
UDP socket調(diào)用該參數(shù)時必須傳入from_id.
返回的結(jié)果如下:
名稱 | 說明 |
---|---|
int from_id | 來自于哪個Reactor |
int from_fd | 來自哪個Server Socket |
int from_port | 來自哪個Server端口 |
int remote_port | 客戶端連接的端口 |
string remote_ip | 客戶端連接的ip |
int connect_time | 連接到Server的時間,單位秒 |
int last_time | 最后一次發(fā)送數(shù)據(jù)的時間,單位秒 |
sendfile函數(shù)調(diào)用OS提供的sendfile系統(tǒng)調(diào)用,由操作系統(tǒng)直接讀取文件并寫入socket。sendfile只有2次內(nèi)存拷貝,使用此函數(shù)可以降低發(fā)送大量文件時操作系統(tǒng)的CPU和內(nèi)存占用。
樣例:
$fdinfo = $serv->connection_info($fd);
$udp_client = $serv->connection_info($fd, $from_id);
功能描述:遍歷當(dāng)前Server的全部客戶端連接
函數(shù)原型:
// 類成員函數(shù)
public function swoole_server::connection_list(int $start_fd = 0, int $pagesize = 10);
返回:調(diào)用成功將返回一個數(shù)字索引數(shù)組,元素是取到的fd。數(shù)組會按從小到大排序。最后一個fd作為新的start_fd再次嘗試獲取。
調(diào)用失敗返回false
參數(shù)說明:
參數(shù) | 說明 |
---|---|
int start_fd | 起始fd |
int pagesize | 每頁取多少條,最大不得超過100. |
說明:
connection_list僅可用于TCP,UDP服務(wù)器需要自行保存客戶端信息
樣例:
$start_fd = 0;
while(true)
{
$conn_list = $serv->connection_list($start_fd, 10);
if($conn_list===false)
{
echo "finish\n";
break;
}
$start_fd = end($conn_list);
var_dump($conn_list);
foreach($conn_list as $fd)
{
$serv->send($fd, "broadcast");
}
}
功能描述:獲取當(dāng)前Server的活動TCP連接數(shù),啟動時間,accpet/close的總次數(shù)等信息。
函數(shù)原型:
// 類成員函數(shù)
public function swoole_server->stats();
返回:結(jié)果數(shù)組
參數(shù)說明:無
說明:
stats方法在1.7.5+后可用
名稱 | 說明 |
---|---|
int start_time | 啟動時間 |
int connection_num | 當(dāng)前的連接數(shù) |
int accept_count | accept總次數(shù) |
int close_count | close連接的總數(shù) |
樣例:
$status = $serv->stats();
功能描述:投遞一個異步任務(wù)到task_worker池中
函數(shù)原型:
// 類成員函數(shù)
public function swoole_server::task(string $data, int $dst_worker_id = -1);
返回:調(diào)用成功返回task_worker_id,失敗返回false
參數(shù)說明:
參數(shù) | 說明 |
---|---|
string data | task數(shù)據(jù) |
int dst_worker_id | 指定投遞給哪個task進程,默認隨機投遞 |
說明:
此功能用于將慢速的任務(wù)異步地去執(zhí)行,調(diào)用task函數(shù)會立即返回,Worker進程可以繼續(xù)處理新的請求。
函數(shù)會返回一個$task_id數(shù)字,表示此任務(wù)的ID
任務(wù)完成后,可以通過return(低于swoole-1.7.2版本使用finish函數(shù))將結(jié)果通過onFinish回調(diào)返回給Worker進程。
發(fā)送的data必須為字符串,如果是數(shù)組或?qū)ο?,請在業(yè)務(wù)代碼中進行serialize處理,并在onTask/onFinish中進行unserialize。
data可以為二進制數(shù)據(jù),最大長度為8K(超過8K可以使用臨時文件共享)。字符串可以使用gzip進行壓縮。
使用task必須為Server設(shè)置onTask和onFinish回調(diào),并指定task_worker_num配置參數(shù)。
樣例:
$task_id = $serv->task("some data");
功能描述:投遞一個同步任務(wù)到task_worker池中
函數(shù)原型:
// 類成員函數(shù)
public function swoole_server::taskwait(string $task_data, float $timeout = 0.5, int $dst_worker_id = -1);
返回:task執(zhí)行的結(jié)果
參數(shù)說明:
參數(shù) | 說明 |
---|---|
string data | task數(shù)據(jù) |
float timeout | 超時時間 |
int dst_worker_id | 指定投遞給哪個task進程,默認隨機投遞 |
說明:
taskwait與task方法作用相同,用于投遞一個異步的任務(wù)到task進程池去執(zhí)行。與task不同的是taskwait是阻塞等待的,直到任務(wù)完成或者超時返回。
任務(wù)完成后,可以通過return直接返回結(jié)果
樣例:
$task_id = $serv->taskwait("some data", 30);
功能描述:傳遞Task結(jié)果數(shù)據(jù)給worker進程
函數(shù)原型:
// 類成員函數(shù)
public function swoole_server::finish(string $task_data);
返回:無
參數(shù)說明:
參數(shù) | 說明 |
---|---|
string data | 結(jié)果數(shù)據(jù) |
說明:
使用swoole_server::finish函數(shù)必須為Server設(shè)置onFinish回調(diào)函數(shù)。此函數(shù)只可用于Task Worker進程的onTask回調(diào)中
swoole_server::finish是可選的。如果Worker進程不關(guān)心任務(wù)執(zhí)行的結(jié)果,可以不調(diào)用此函數(shù)
此函數(shù)在swoole-1.7.2以上版本已廢棄,使用return代替。
樣例:
$serv->finish("result data");
功能描述:進行心跳檢測
函數(shù)原型:
// 類成員函數(shù)
public function swoole_server::heartbeat(bool $if_close_connection = true);
返回:無
參數(shù)說明:
參數(shù) | 說明 |
---|---|
bool if_close_connection | 是否關(guān)閉超時的連接,默認為true |
說明:
該函數(shù)會主動發(fā)起一次檢測,遍歷全部連接,根據(jù)設(shè)置的heartbeat_check_interval和heartbeat_idle_time參數(shù),找到那些處于idle閑置狀態(tài)的連接
swoole默認會直接關(guān)閉這些連接,heartbeat會返回這些連接的fd
如果if_close_connection為false,則heartbeat會返回這些idle連接的fd,但不會關(guān)閉這些連接
if_close_connection參數(shù) 在swoole-1.7.4以上版本可用
樣例:
$serv->heartbeat();
功能描述:獲取mysqli的socket文件描述符
函數(shù)原型:
// 公共函數(shù)
int swoole_get_mysqli_sock(mysqli $db)
返回:mysqli的fd
參數(shù)說明:
參數(shù) | 說明 |
---|---|
mysqli db | mysqli的連接 |
說明:
可將mysql的socket增加到swoole中,執(zhí)行異步MySQL查詢。如果想要使用異步MySQL,需要在編譯swoole時制定--enable-async-mysql
swoole_get_mysqli_sock僅支持mysqlnd驅(qū)動
即使是異步MySQL也需要一個連接池,并發(fā)SQL必須有多個連接。
樣例:
$db = new mysqli;
$db->connect('127.0.0.1', 'root', 'root', 'test');
$db->query("show tables", MYSQLI_ASYNC);
swoole_event_add(swoole_get_mysqli_sock($db), function($db_sock) {
global $db;
$res = $db->reap_async_query();
var_dump($res->fetch_all(MYSQLI_ASSOC));
swoole_event_exit();
});
功能描述:設(shè)置進程的名稱
函數(shù)原型:
// 公共函數(shù)
void swoole_set_process_name(string $name);
返回:無
參數(shù)說明:
參數(shù) | 說明 |
---|---|
string name | 進程名稱 |
說明:
修改進程名稱后,通過ps命令看到的將不再是php your_file.php,而是設(shè)定的字符串
在swoole_server_create之前修改為manager進程名稱 onStart調(diào)用時修改為主進程名稱 onWorkerStart修改為worker進程名稱
swoole_set_process_name存在兼容性問題,優(yōu)先使用PHP內(nèi)置的cli_set_process_title函數(shù)
樣例:
woole_set_process_name("swoole server");
功能描述:獲取swoole擴展的版本號
函數(shù)原型:
// 公共函數(shù)
string swoole_version();
返回:swoole擴展的版本號
參數(shù)說明:無
說明:
樣例:
echo swoole_version();
功能描述:將標準的Unix Errno錯誤碼轉(zhuǎn)換成錯誤信息
函數(shù)原型:
// 公共函數(shù)
string swoole_strerror(int $errno);
返回:轉(zhuǎn)化后的錯誤信息
參數(shù)說明:
參數(shù) | 說明 |
---|---|
int errno | errno錯誤碼 |
說明:
樣例:
echo swoole_strerror( $errno );
功能描述:獲取最近一次系統(tǒng)調(diào)用的錯誤碼
函數(shù)原型:
// 公共函數(shù)
int swoole_errno();
返回:最近一次系統(tǒng)調(diào)用的錯誤碼
參數(shù)說明:無
說明:
錯誤碼的值與操作系統(tǒng)有關(guān)??墒鞘褂胹woole_strerror將錯誤轉(zhuǎn)換為錯誤信息。
樣例:
echo swoole_strerror(swoole_errno());
功能描述:此函數(shù)用于獲取本機所有網(wǎng)絡(luò)接口的IP地址
函數(shù)原型:
// 公共函數(shù)
array swoole_get_local_ip();
返回:以interface名稱為key的關(guān)聯(lián)數(shù)組
參數(shù)說明:無
說明:
目前只返回IPv4地址,返回結(jié)果會過濾掉本地loop地址127.0.0.1
返回結(jié)果樣例array("eth0" => "192.168.1.100"); 樣例:
var_dump(swoole_get_local_ip());
更多建議: