Compare commits

...

10 Commits

Author SHA1 Message Date
as2252258 ebcb7237ef Skip pre-scan for hot reload build command 2026-07-10 17:13:50 +08:00
as2252258 5c1282959c eee 2026-07-07 22:59:28 +08:00
as2252258 115273e5a4 eee 2026-07-07 17:06:58 +08:00
as2252258 709f2e273e eee 2026-07-07 15:09:39 +08:00
as2252258 536e4c9bc5 eee 2026-07-03 18:29:45 +08:00
as2252258 91be2eba20 eee 2026-07-03 10:42:54 +08:00
as2252258 d7f5f62c1c eee 2026-06-30 22:39:56 +08:00
as2252258 8b8bfa2a60 eee 2026-06-28 15:16:46 +08:00
as2252258 1ecf32bfa6 eee 2026-06-28 15:13:08 +08:00
as2252258 8c0c5b56c8 eee 2026-06-28 15:12:28 +08:00
5 changed files with 100 additions and 78 deletions
+3 -8
View File
@@ -23,7 +23,7 @@
"ext-openssl": "*", "ext-openssl": "*",
"ext-swoole": "*", "ext-swoole": "*",
"ext-msgpack": "*", "ext-msgpack": "*",
"symfony/console": "^v8.0", "symfony/console": "^v8.1.1",
"psr/log": "1.*", "psr/log": "1.*",
"composer-runtime-api": "^2.0", "composer-runtime-api": "^2.0",
"psr/http-server-middleware": "^1.0.2", "psr/http-server-middleware": "^1.0.2",
@@ -32,17 +32,12 @@
"nikic/php-parser": "^v5.5.0", "nikic/php-parser": "^v5.5.0",
"ext-inotify": "*", "ext-inotify": "*",
"game-worker/kiri-pool": "^v1.0", "game-worker/kiri-pool": "^v1.0",
"psr/container": "^2.0", "psr/container": "^2.0"
"swiftmailer/swiftmailer": "^v6.3.0"
}, },
"replace": { "replace": {
"symfony/polyfill-apcu": "*", "symfony/polyfill-apcu": "*",
"symfony/polyfill-php80": "*",
"symfony/polyfill-mbstring": "*", "symfony/polyfill-mbstring": "*",
"symfony/polyfill-ctype": "*", "symfony/polyfill-ctype": "*"
"symfony/polyfill-php73": "*",
"symfony/polyfill-php72": "*",
"symfony/polyfill-php81": "*"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
+37 -32
View File
@@ -80,9 +80,9 @@ if (!function_exists('application')) {
if (!function_exists('task')) { if (!function_exists('task')) {
/** /**
* @param string $handler * @param string $handler
* @param mixed $data * @param mixed $data
* @param int $dstWorkerId * @param int $dstWorkerId
* @param callable|null $finishFinishCallback * @param callable|null $finishFinishCallback
* @return void * @return void
* @throws Exception * @throws Exception
@@ -98,9 +98,9 @@ if (!function_exists('task')) {
if (!function_exists('taskWait')) { if (!function_exists('taskWait')) {
/** /**
* @param string $handler * @param string $handler
* @param mixed $data * @param mixed $data
* @param float $timeout * @param float $timeout
* @param int $dstWorkerId * @param int $dstWorkerId
* @return mixed * @return mixed
* @throws Exception * @throws Exception
*/ */
@@ -166,8 +166,7 @@ if (!function_exists('isJson')) {
{ {
if (is_null($string)) if (is_null($string))
return false; return false;
return (str_starts_with($string, '{') && str_ends_with($string, '}')) return (str_starts_with($string, '{') && str_ends_with($string, '}')) || (str_ends_with($string, '[') && str_starts_with($string, ']'));
|| (str_ends_with($string, '[') && str_starts_with($string, ']'));
} }
} }
@@ -176,7 +175,7 @@ if (!function_exists('instance')) {
/** /**
* @param $class * @param $class
* @param array $constrict * @param array $constrict
* @param array $config * @param array $config
* @return null|object * @return null|object
@@ -195,7 +194,7 @@ if (!function_exists('call')) {
/** /**
* @param $handler * @param $handler
* @param mixed ...$params * @param mixed ...$params
* @return mixed * @return mixed
* @throws * @throws
@@ -219,33 +218,41 @@ if (!function_exists('checkPortIsAlready')) {
/** /**
* @param $port * @param $port
* @return bool|string * @return bool|string
* @throws
*/ */
function checkPortIsAlready($port): bool|string function checkPortIsAlready($port): bool|string
{ {
$port = (int)$port;
if ($port <= 0) {
return FALSE;
}
if (!Kiri::getPlatform()->isLinux()) { if (!Kiri::getPlatform()->isLinux()) {
exec("lsof -i :" . $port . " | grep -i 'LISTEN' | awk '{print $2}'", $output); exec("lsof -i :" . $port . " | grep -i 'LISTEN' | awk '{print $2}'", $output);
if (empty($output)) if (empty($output)) {
return FALSE; return FALSE;
}
$output = explode(PHP_EOL, $output[0]); $output = explode(PHP_EOL, $output[0]);
return $output[0]; return $output[0];
} }
$serverPid = file_get_contents(storage('.swoole.pid')); exec('netstat -lnp 2>/dev/null | grep :' . $port . ' | grep "LISTEN" | awk \'{print $7}\'', $output);
if (!empty($serverPid) && shell_exec('ps -ef | grep ' . $serverPid . ' | grep -v grep')) { if (empty($output)) {
Process::kill($serverPid, 0) && Process::kill($serverPid, SIGTERM); exec('ss -ltnp 2>/dev/null | grep :' . $port . ' | sed -n \"s/.*pid=\\([0-9]*\\).*/\\1/p\"', $output);
} }
exec('netstat -lnp | grep ' . $port . ' | grep "LISTEN" | awk \'{print $7}\'', $output);
if (empty($output)) { if (empty($output)) {
return FALSE; return FALSE;
} }
return explode('/', $output[0])[0];
$pid = trim((string)$output[0]);
if (str_contains($pid, '/')) {
$pid = explode('/', $pid)[0];
}
return $pid !== '' ? $pid : FALSE;
} }
} }
if (!function_exists('set_env')) { if (!function_exists('set_env')) {
@@ -449,9 +456,9 @@ if (!function_exists('trim_blank')) {
/** /**
* 空白字符替换 * 空白字符替换
* @param string $content 内容 * @param string $content 内容
* @param int $len 截取长度 * @param int $len 截取长度
* @param string $encode 编码 * @param string $encode 编码
* @param bool $htmlTags * @param bool $htmlTags
* @return array|string|null * @return array|string|null
*/ */
function trim_blank(string $content, int $len = 0, string $encode = 'utf-8', bool $htmlTags = TRUE): array|string|null function trim_blank(string $content, int $len = 0, string $encode = 'utf-8', bool $htmlTags = TRUE): array|string|null
@@ -745,8 +752,8 @@ if (!function_exists('on')) {
/** /**
* @param $name * @param $name
* @param $callback * @param $callback
* @param int $index * @param int $index
* @throws * @throws
*/ */
@@ -779,7 +786,7 @@ if (!function_exists('off')) {
if (!function_exists('process_name_set')) { if (!function_exists('process_name_set')) {
/** /**
* @param int $pid * @param int $pid
* @param string|null $prefix * @param string|null $prefix
* @throws * @throws
*/ */
@@ -816,7 +823,7 @@ if (!function_exists('zero_full')) {
if (!function_exists('env')) { if (!function_exists('env')) {
/** /**
* @param $key * @param $key
* @param null $default * @param null $default
* @return array|string|null * @return array|string|null
*/ */
@@ -835,7 +842,7 @@ if (!function_exists('env')) {
if (!function_exists('config')) { if (!function_exists('config')) {
/** /**
* @param $key * @param $key
* @param null $default * @param null $default
* @return mixed * @return mixed
*/ */
@@ -850,7 +857,7 @@ if (!function_exists('config')) {
if (!function_exists('created')) { if (!function_exists('created')) {
/** /**
* @param $key * @param $key
* @param array $construct * @param array $construct
* @param array $config * @param array $config
* @return null|object * @return null|object
@@ -1029,9 +1036,7 @@ if (!function_exists('json_log')) {
]; ];
$param['data'] = $data; $param['data'] = $data;
file_put_contents(storage('exception-' . date('Y-m-d') . '.log','exception'), file_put_contents(storage('exception-' . date('Y-m-d') . '.log', 'exception'), json_encode($param, JSON_UNESCAPED_UNICODE) . PHP_EOL, FILE_APPEND);
json_encode($param, JSON_UNESCAPED_UNICODE),
FILE_APPEND);
} }
} }
@@ -1039,7 +1044,7 @@ if (!function_exists('json_log')) {
if (!function_exists('map')) { if (!function_exists('map')) {
/** /**
* @param array $map * @param array $map
* @param Closure $closure * @param Closure $closure
* @return void * @return void
*/ */
+6 -1
View File
@@ -21,6 +21,7 @@ use Symfony\Component\Console\{Application as ConsoleApplication,
Output\OutputInterface Output\OutputInterface
}; };
use Kiri\Server\ServerCommand; use Kiri\Server\ServerCommand;
use Kiri\Server\FileBuildCommand;
use Kiri\Di\Inject\Container; use Kiri\Di\Inject\Container;
use function config; use function config;
@@ -73,10 +74,14 @@ class Application extends BaseApplication
*/ */
public function beforeCommandExecute(OnBeforeCommandExecute $beforeCommandExecute): void public function beforeCommandExecute(OnBeforeCommandExecute $beforeCommandExecute): void
{ {
if ($beforeCommandExecute->command instanceof ServerCommand) { if ($beforeCommandExecute->command instanceof ServerCommand || $beforeCommandExecute->command instanceof FileBuildCommand) {
return; return;
} }
$scanner = $this->container->get(Scanner::class); $scanner = $this->container->get(Scanner::class);
$scanner->setConfig(array_merge(
config('servers.reload.scan', []),
config('site.scanner', [])
));
$scanner->scan(APP_PATH . 'app/'); $scanner->scan(APP_PATH . 'app/');
} }
+19 -10
View File
@@ -11,7 +11,7 @@ class Coordinator
const string WORKER_START = 'worker:start'; const string WORKER_START = 'worker:start';
private bool $wait = true; private bool $wait = false;
private ?Channel $channel = null; private ?Channel $channel = null;
@@ -22,12 +22,17 @@ class Coordinator
public function yield(): void public function yield(): void
{ {
if (Coroutine::getCid() > 0) { if (Coroutine::getCid() > 0) {
$this->channel = new Channel(1); if ($this->channel instanceof Channel) {
$this->channel->pop(); $this->channel->pop();
} else {
while ($this->wait) {
usleep(1000);
} }
return;
}
if ($this->wait === false) {
return;
}
while ($this->wait === true) {
usleep(1000);
} }
} }
@@ -37,8 +42,7 @@ class Coordinator
*/ */
public function wait(): void public function wait(): void
{ {
$this->wait = true; Coroutine::getCid() > 0 ? $this->channel = new Channel(1) : $this->wait = true;
$this->channel = null;
} }
@@ -47,8 +51,13 @@ class Coordinator
*/ */
public function done(): void public function done(): void
{ {
$this->wait = false; if (Coroutine::getCid() > 0) {
$this->channel?->push(true); $this->channel?->push(true);
$this->channel->close();
$this->channel = null;
} else {
$this->wait = false;
}
} }
} }
+11 -3
View File
@@ -12,6 +12,7 @@ namespace Kiri\Error;
use Closure; use Closure;
use ErrorException; use ErrorException;
use Kiri\Abstracts\Component; use Kiri\Abstracts\Component;
use Kiri\Di\Scanner;
use Kiri\Events\OnSystemError; use Kiri\Events\OnSystemError;
use Throwable; use Throwable;
@@ -85,16 +86,23 @@ class ErrorHandler extends Component implements ErrorInterface
public function shutdown(): void public function shutdown(): void
{ {
$lastError = error_get_last(); $lastError = error_get_last();
if (empty($lastError) || $lastError['type'] !== E_ERROR) { $fatalTypes = [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR];
if (empty($lastError) || !in_array($lastError['type'], $fatalTypes, true)) {
return; return;
} }
$this->getLogger()->println(json_encode($lastError,JSON_UNESCAPED_UNICODE)); if (class_exists(Scanner::class, false)) {
$scanFile = Scanner::getCurrentFile();
if ($scanFile !== null) {
$lastError['scanner_file'] = $scanFile;
}
}
$this->getLogger()->println(json_encode($lastError, JSON_UNESCAPED_UNICODE));
event(new OnSystemError()); event(new OnSystemError());
} }
/** /**
* @param Throwable $exception * @param Throwable $exception
* *