<?php $running = true; $exitSig = 0; function signal($sig) { global $running, $exitSig; $exitSig = $sig; $running = false; is_main_task() and task_set_run(false); } pcntl_async_signals(true); pcntl_signal(SIGTERM, 'signal', false); pcntl_signal(SIGINT, 'signal', false); pcntl_signal(SIGUSR1, 'signal', false); pcntl_signal(SIGUSR2, 'signal', false); if(!is_main_task()) { $host = $_SERVER['argv'][1]; $port = (int) $_SERVER['argv'][2]; while($running) { $fd = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if($fd === false) { share_var_inc('errs', 1); //strerror('socket_connect', false); continue; } @socket_set_option($fd, SOL_SOCKET, SO_LINGER, ['l_onoff'=>1, 'l_linger'=>1]); @socket_set_option($fd, SOL_SOCKET, SO_REUSEADDR, 1) or strerror('socket_set_option', false); if(!@socket_connect($fd, $host, $port)) { share_var_inc('errs', 1); //strerror('socket_connect', false); @socket_close($fd); continue; } if(($str = @socket_read($fd, 1024)) !== false) { share_var_inc('conns', 1); //echo $str; @socket_write($fd, '1'); } else share_var_inc('errs', 1); @socket_close($fd); } } else { $host = ($_SERVER['argv'][1]??'127.0.0.1'); $port = (int) ($_SERVER['argv'][2]??5000); $conns = (int) ($_SERVER['argv'][3]??100); task_set_threads($conns); share_var_init(2); for($i=0; $i<$conns; $i++) create_task('conn' . $i, __FILE__, [$host, $port]); $n = 0; $e = 0; while($running) { sleep(1); $n2 = share_var_get('conns'); $n3 = share_var_get('errs'); $n = $n2 - $n; $e = $n3 - $e; echo "$n connects, $e errors\n"; $n = $n2; $e = $n3; } task_wait($exitSig?:SIGINT); share_var_destory(); echo "Stoped\n"; } function strerror($msg, $isExit = true) { $err = socket_last_error(); printf("[%s] %s(%d): %s\n", THREAD_TASK_NAME, $msg, $err, socket_strerror($err)); if($isExit) exit; else return true; }