#!/usr/bin/env php =')) { exit(Man\Core\Master::NAME . ' PHP >= 5.3.0 required.' . PHP_EOL); } // ==pid-file== require_once WORKERMAN_ROOT_DIR . 'man/Core/Lib/Config.php'; Man\Core\Lib\Config::instance(); if(!($pid_file = Man\Core\Lib\Config::get('workerman.pid_file'))) { $pid_file = '/var/run/php-server.pid'; } define('WORKERMAN_PID_FILE', $pid_file); // ==log-dir== if(!($log_dir = Man\Core\Lib\Config::get('workerman.log_dir'))) { $log_dir = WORKERMAN_ROOT_DIR . 'logs/'; } define('WORKERMAN_LOG_DIR', $log_dir . '/'); // ==ipc-key== if(!($ipc_key = Man\Core\Lib\Config::get('workerman.ipc_key'))) { $ipc_key = 0x70010a2e; } define('IPC_KEY', $ipc_key); // ==shm-size== if(!($shm_size = Man\Core\Lib\Config::get('workerman.shm_size'))) { $shm_size = 393216; } define('DEFAULT_SHM_SIZE', $shm_size); //检查pid对应的进程是否存在,不存在删除PID文件 if($cmd != 'status' && is_file(WORKERMAN_PID_FILE)) { //检查权限 if(!posix_access(WORKERMAN_PID_FILE, POSIX_W_OK)) { if($stat = stat(WORKERMAN_PID_FILE)) { if(($start_pwuid = posix_getpwuid($stat['uid'])) && ($current_pwuid = posix_getpwuid(posix_getuid()))) { exit("\n\033[31;40mServer is started by user {$start_pwuid['name']}, {$current_pwuid['name']} can not $cmd Server, Permission denied\033[0m\n\n\033[31;40mServer $cmd failed\033[0m\n\n"); } } exit("Can not $cmd Server, Permission denied\n"); } //检查pid进程是否存在 if($pid = @file_get_contents(WORKERMAN_PID_FILE)) { if(false === posix_kill($pid, 0)) { if(!unlink(WORKERMAN_PID_FILE)) { exit("Can not $cmd Server\n\n"); } } } } switch($cmd) { case 'start': $worker_user = isset($argv[2]) ? $argv[2] : ''; Man\Core\Master::run($worker_user); break; case 'stop': $pid = @file_get_contents(WORKERMAN_PID_FILE); if(empty($pid)) { exit("Server not running?\n"); } stop_and_wait(); break; case 'restart': stop_and_wait(); $worker_user = isset($argv[2]) ? $argv[2] : ''; Man\Core\Master::run(); break; case 'reload': $pid = @file_get_contents(WORKERMAN_PID_FILE); if(empty($pid)) { exit("server not running?\n"); } posix_kill($pid, SIGHUP); echo "reload PHP-Server\n"; break; case 'kill': force_kill(); force_kill(); break; case 'status': $address = Man\Core\Lib\Config::get('Monitor.listen'); $sock = @stream_socket_client($address); if(!$sock) { exit("\n\033[31;40mcan not connect to $address \033[0m\n\n\033[31;40mServer not running\033[0m\n\n"); } fwrite($sock, 'status'); $read_fds = array($sock); $write_fds = $except_fds = array(); while($ret = stream_select($read_fds, $write_fds, $except_fds, 1)) { if(!$ret)break; foreach($read_fds as $fd) { if($ret_str = fread($fd, 8192)) { echo $ret_str; } else { exit; } } } break; default: echo "Usage: serverd {start|stop|restart|reload|kill|status}\n"; exit; } function force_kill() { $ret = $match = array(); exec("ps aux | grep -E '".Man\Core\Master::NAME.":|serverd' | grep -v grep", $ret); $this_pid = posix_getpid(); $this_ppid = posix_getppid(); foreach($ret as $line) { if(preg_match("/^[\S]+\s+(\d+)\s+/", $line, $match)) { $tmp_pid = $match[1]; if($this_pid != $tmp_pid && $this_ppid != $tmp_pid) { posix_kill($tmp_pid, SIGKILL); } } } } function stop_and_wait($wait_time = 6) { $pid = @file_get_contents(WORKERMAN_PID_FILE); if(empty($pid)) { //exit("server not running?\n"); } else { $start_time = time(); posix_kill($pid, SIGINT); while(is_file(WORKERMAN_PID_FILE)) { clearstatcache(); usleep(1000); if(time()-$start_time >= $wait_time) { force_kill(); force_kill(); unlink(WORKERMAN_PID_FILE); usleep(500000); break; } } echo "PHP-Server stoped\n"; } }