appnet - 高性能異步網絡事件庫
appnet是一個基于linux epoll的多線程的高性能異步網絡事件庫,目標是用高性能的PHP版本
搭載appnet取代C/lua或C/python模式,快速構建強有力的長連接服務器,以彌補PHP固有的缺陷。
使其可廣泛用于聊天系統,游戲服務器,消息通知服務器等實時通信場景。可對網絡IO密集性場景
或CPU密集性場景配置reactor數量和woker數量的比例,使硬件運行于最佳狀態。
其特點有
[1],高性能,純C語言開發,epoll異步非阻塞事件通知機制.
[2],易用性,使用方式簡單,并提供PHP7.0版本擴展。
[3],高并發,多線程網絡IO,Per Thread One Loop并發模型,多個worker進程并行處理業務。
[4],多協議,可混合TCP協議,websocket協議和簡單http協議與服務器通信。
[5],內存優化,進程間通信使用共享內存,兼容jemalloc和tcmalloc內存優化技術。
[6],緩沖區優化,自適應緩沖區,根據數據包大小自動增長縮小,避免內存浪費和緩沖區溢出
與其它網絡庫粗略比較
[1], 相比node.js單進程模式,appnet可充分利用多核CPU,不致于服務器資源浪費。
[2], 相比nginx多進程+fpm多進程,支持TCP協議,websocket協議等長連接。
[3], 相比libevent,原生支持多線程無需再次封裝,支持混合協議。
[4], 相比memcache多線程+libevent模型,appnet支持多任務處理業務,具有更少的封裝。
[5], 相比redis單進程網絡模型,具體有更強的網絡IO能力,appnet也就是redis網絡層的增強版本
以上是一個美好的愿望,目前websocket協議和http協議尚未實現,還存已知的在進程終止時有可能會
內存泄露BUG,目前是一個人開發,也缺少更多的測試,希望有興趣的同學一起參與進來測試,開發和提建議。
讓PHP真正成為世界上最好的語言,沒有之一。。
安裝方法:
1,源碼安裝php_7.0.x
2,下載擴展到任意目錄appnet_php7
3,執行如下指令:
>cd appnet_php7
>/usr/local/php7/bin/phpize
>./configure --with-php-config=/usr/local/php7/bin/php-config
>make
>make install
>php test/test.php
>telnet 127.0.0.1 3011
開始測試吧。
<?php dl( "appnet.so"); $server = new appnetServer( "0.0.0.0" , 3011 ); $server->on('connect', function( $serv , $fd ) { $pid = posix_getpid(); echo "Client:Connect:{$fd} pid={$pid} \n"; }); $server->on('receive', function( $serv , $fd , $buffer ) { echo "Client Recv:[{$buffer}][{$fd}] \n"; $header = $serv->getHeader(); if( $header['Protocol'] == "WEBSOCKET" ) { Websocket::onReceive( $serv , $fd, $buffer ); } }); $server->on( 'close' , function( $serv , $fd ) { echo "Client Close:$fd \n"; }); //on worker run start,you can init env. $server->on( 'start' , function( $serv ) { $pid = posix_getpid(); echo "On Worker Start!! pid={$pid} \n"; //3000ms means 3second $serv->timerAdd( 3000 , "onTimerCallback" , "paramsxxx" ); }); //on worker shutdown,you must save data in last time. $server->on( 'final' , function( $serv ) { $pid = posix_getpid(); echo "On Worker Final!! pid={$pid} \n"; }); function onTimerCallback( $serv , $timer_id , $params ) { $pid = posix_getpid(); echo "onTimerCallback ok,worker pid={$pid},timer_id={$timer_id}...\n"; //if do not remove it, it will be call this function forever $serv->timerRemove( $timer_id ); } $server->run(); ?>
官方網站:http://www.baiduhome.net/lib/view/home/1455511580292