You've already forked qlg.tsgz.moe
							
							
		
			
				
	
	
		
			254 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			254 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
| <?php
 | |
| //关闭错误输出
 | |
| //error_reporting(0);
 | |
| $shortopts = "c:";
 | |
| $shortopts .= "n:";
 | |
| $shortopts .= "s:";
 | |
| $shortopts .= "f:";
 | |
| $shortopts .= "p::";
 | |
| 
 | |
| $opt = getopt($shortopts);
 | |
| //并发数量
 | |
| if (!isset($opt['c'])) {
 | |
|     exit("require -c [process_num]. ep: -c 100\n");
 | |
| }
 | |
| if (!isset($opt['n'])) {
 | |
|     exit("require -n [request_num]. ep: -n 10000\n");
 | |
| }
 | |
| if (!isset($opt['s'])) {
 | |
|     exit("require -s [server_url]. ep: -s tcp://127.0.0.1:9999\n");
 | |
| }
 | |
| if (!isset($opt['f'])) {
 | |
|     exit("require -f [test_function]. ep: -f websocket|http|tcp|udp\n");
 | |
| }
 | |
| 
 | |
| class BenchMark
 | |
| {
 | |
|     protected $nConcurrency;
 | |
|     protected $nRequest;
 | |
|     protected $host;
 | |
|     protected $port;
 | |
|     protected $clients = array();
 | |
| 
 | |
|     protected $nRecvBytes = 0;
 | |
|     protected $nSendBytes = 0;
 | |
| 
 | |
|     protected $requestCount = 0;
 | |
|     protected $connectErrorCount = 0;
 | |
| 
 | |
|     protected $connectTime = 0;
 | |
| 
 | |
|     protected $startTime;
 | |
|     protected $beginSendTime;
 | |
|     protected $testMethod;
 | |
| 
 | |
|     static $sentData = "hello world\n";
 | |
| 
 | |
|     function __construct($opt)
 | |
|     {
 | |
|         $this->nConcurrency = $opt['c'];
 | |
|         $this->nRequest = $opt['n'];
 | |
|         $serv = parse_url($opt['s']);
 | |
|         $this->host = $serv['host'];
 | |
|         $this->port = $serv['port'];
 | |
|         $this->testMethod = $opt['f'];
 | |
|         if (!method_exists($this, $this->testMethod))
 | |
|         {
 | |
|             throw new RuntimeException("method [{$this->testMethod}] is not exists.");
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     protected function finish()
 | |
|     {
 | |
|         foreach($this->clients as $k => $cli)
 | |
|         {
 | |
|             /**
 | |
|              * @var $cli swoole\client
 | |
|              */
 | |
|             if ($cli->isConnected())
 | |
|             {
 | |
|                 $cli->close();
 | |
|             }
 | |
|             unset($this->clients[$k]);
 | |
|         }
 | |
|         echo "============================================================\n";
 | |
|         echo "              Swoole Version ".SWOOLE_VERSION."\n";
 | |
|         echo "============================================================\n";
 | |
|         echo "{$this->requestCount}\tbenchmark tests is finished.\n";
 | |
|         echo "SendBytes:\t".number_format($this->nSendBytes)."\n";
 | |
|         echo "nReceBytes:\t".number_format($this->nRecvBytes)."\n";
 | |
|         echo "concurrency:\t".$this->nConcurrency,"\n";
 | |
|         echo "connect failed:\t" . $this->connectErrorCount, "\n";
 | |
|         echo "request num:\t" . $this->nRequest, "\n";
 | |
|         $costTime = $this->format(microtime(true) - $this->startTime);
 | |
|         echo "total time:\t" . ($costTime) . "\n";
 | |
|         if ($this->requestCount > 0)
 | |
|         {
 | |
|             echo "request per second:\t" . intval($this->requestCount / $costTime), "\n";
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             echo "request per second:\t0\n";
 | |
|         }
 | |
|         echo "connection time:\t" . $this->format($this->connectTime) . "\n";
 | |
|     }
 | |
| 
 | |
|     function format($time)
 | |
|     {
 | |
|         return round($time, 4);
 | |
|     }
 | |
| 
 | |
|     function onReceive($cli, $data)
 | |
|     {
 | |
|         $this->nRecvBytes += strlen($data);
 | |
|         /**
 | |
|          * 请求已经发完了,关闭连接,等待所有连接结束
 | |
|          */
 | |
|         if ($this->requestCount >= $this->nRequest)
 | |
|         {
 | |
|             $cli->close();
 | |
|             unset($this->clients[$cli->sock]);
 | |
|             if (count($this->clients) == 0)
 | |
|             {
 | |
|                 $this->finish();
 | |
|             }
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             $this->send($cli);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     function send($cli)
 | |
|     {
 | |
|         $data = self::$sentData;
 | |
|         $cli->send($data);
 | |
|         $this->nSendBytes += strlen($data);
 | |
|         $this->requestCount++;
 | |
|     }
 | |
| 
 | |
|     function push($cli)
 | |
|     {
 | |
|         $data = self::$sentData;
 | |
|         $cli->push($data);
 | |
|         $this->nSendBytes += strlen($data);
 | |
|         $this->requestCount++;
 | |
|     }
 | |
| 
 | |
|     function onClose($cli)
 | |
|     {
 | |
|         //echo "close\n";
 | |
|     }
 | |
| 
 | |
|     function onError($cli)
 | |
|     {
 | |
|         $this->connectErrorCount ++;
 | |
|         if ($this->connectErrorCount >= $this->nConcurrency)
 | |
|         {
 | |
|             $this->finish();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     function onConnect($cli)
 | |
|     {
 | |
|         $this->send($cli);
 | |
|     }
 | |
| 
 | |
|     function websocket()
 | |
|     {
 | |
|         $cli = new swoole\http\client($this->host, $this->port);
 | |
|         $cli->set(array('websocket_mask' => true));
 | |
|         $cli->on('Message', function($cli, $frame) {
 | |
|             $this->nRecvBytes += strlen($frame->data);
 | |
|             /**
 | |
|              * 请求已经发完了,关闭连接,等待所有连接结束
 | |
|              */
 | |
|             if ($this->requestCount >= $this->nRequest)
 | |
|             {
 | |
|                 $cli->close();
 | |
|                 unset($this->clients[$cli->sock]);
 | |
|                 if (count($this->clients) == 0)
 | |
|                 {
 | |
|                     $this->finish();
 | |
|                 }
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 $this->push($cli);
 | |
|             }
 | |
|         });
 | |
|         $cli->upgrade('/', function ($cli) {
 | |
|             $this->push($cli);
 | |
|         });
 | |
|         return $cli;
 | |
|     }
 | |
| 
 | |
|     function long_tcp()
 | |
|     {
 | |
|         $cli = new swoole\client(SWOOLE_TCP | SWOOLE_ASYNC);
 | |
|         $cli->on('receive', [$this, 'onReceive']);
 | |
|         $cli->on('close', [$this, 'onClose']);
 | |
|         $cli->on('connect', [$this, 'onConnect']);
 | |
|         $cli->on('error', [$this, 'onError']);
 | |
|         $cli->connect($this->host, $this->port);
 | |
|         return $cli;
 | |
|     }
 | |
| 
 | |
|     function eof()
 | |
|     {
 | |
|         $eof = "\r\n\r\n";
 | |
|         $cli = new swoole\client(SWOOLE_TCP | SWOOLE_ASYNC);
 | |
|         $cli->set(array('open_eof_check' => true, "package_eof" => $eof));
 | |
|         $cli->on('receive', [$this, 'onReceive']);
 | |
|         $cli->on('close', [$this, 'onClose']);
 | |
|         $cli->on('connect', [$this, 'onConnect']);
 | |
|         $cli->on('error', [$this, 'onError']);
 | |
|         $cli->connect($this->host, $this->port);
 | |
|         self::$sentData .= $eof;
 | |
|         return $cli;
 | |
|     }
 | |
| 
 | |
|     function length()
 | |
|     {
 | |
|         $cli = new swoole\client(SWOOLE_TCP | SWOOLE_ASYNC);
 | |
|         $cli->set(array(
 | |
|             'open_length_check' => true,
 | |
|             "package_length_type" => 'N',
 | |
|             'package_body_offset' => 4,
 | |
|         ));
 | |
|         $cli->on('receive', [$this, 'onReceive']);
 | |
|         $cli->on('close', [$this, 'onClose']);
 | |
|         $cli->on('connect', [$this, 'onConnect']);
 | |
|         $cli->on('error', [$this, 'onError']);
 | |
|         $cli->connect($this->host, $this->port);
 | |
|         self::$sentData = pack('N', strlen(self::$sentData)) . self::$sentData;
 | |
|         return $cli;
 | |
|     }
 | |
| 
 | |
|     function udp()
 | |
|     {
 | |
|         $cli = new swoole\client(SWOOLE_UDP | SWOOLE_ASYNC);
 | |
|         $cli->on('receive', [$this, 'onReceive']);
 | |
|         $cli->on('close', [$this, 'onClose']);
 | |
|         $cli->on('connect', [$this, 'onConnect']);
 | |
|         $cli->on('error', [$this, 'onError']);
 | |
|         $cli->connect($this->host, $this->port);
 | |
|         return $cli;
 | |
|     }
 | |
| 
 | |
|     function run()
 | |
|     {
 | |
|         $this->startTime = microtime(true);
 | |
|         for ($i = 0; $i < $this->nConcurrency; $i++)
 | |
|         {
 | |
|             $cli = call_user_func([$this, $this->testMethod]);
 | |
|             $this->clients[$cli->sock] = $cli;
 | |
|         }
 | |
|         $this->beginSendTime = microtime(true);
 | |
|         $this->connectTime = $this->beginSendTime - $this->startTime;
 | |
|     }
 | |
| }
 | |
| 
 | |
| $bench = new BenchMark($opt);
 | |
| $bench->run();
 |