diff --git a/.idea/php.xml b/.idea/php.xml
index 7107612..598096e 100644
--- a/.idea/php.xml
+++ b/.idea/php.xml
@@ -12,6 +12,7 @@
+
diff --git a/.idea/skeleton.iml b/.idea/skeleton.iml
index 6ca719a..dc96136 100644
--- a/.idea/skeleton.iml
+++ b/.idea/skeleton.iml
@@ -8,6 +8,7 @@
+
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index abd13e0..2af57e1 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -2,286 +2,37 @@
+
+
+
+
+
+
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -295,40 +46,96 @@
-
+
-
-
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -344,18 +151,6 @@
@@ -419,11 +226,14 @@
+
+
+
-
-
+
+
@@ -432,6 +242,7 @@
+
@@ -444,11 +255,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
@@ -456,6 +300,7 @@
+
@@ -537,21 +382,23 @@
-
+
+
-
+
-
+
+
-
+
-
+
@@ -561,7 +408,7 @@
-
+
@@ -583,26 +430,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -622,191 +449,292 @@
-
+
+
+
+
+
+
+
+
-
+
-
+
-
-
+
+
-
+
+
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
+
+
+
-
-
+
+
-
+
-
-
+
+
+
+
+
-
-
-
-
+
+
+
+
-
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
-
-
-
+
+
-
+
-
-
+
+
-
+
+
+
+
+
+
+
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
+
-
-
+
+
-
-
-
-
+
+
+
+
-
-
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
+
+
+
+
diff --git a/app/Cli/Worker.php b/app/Cli/Job.php
similarity index 97%
rename from app/Cli/Worker.php
rename to app/Cli/Job.php
index cc0e58d..ff9e760 100644
--- a/app/Cli/Worker.php
+++ b/app/Cli/Job.php
@@ -5,11 +5,11 @@
use Bee\Di\Container;
/**
- * Worker
+ * Job
*
* @package Star\Cli
*/
-class Worker extends Command
+class Job extends Command
{
/**
* 命令名称
diff --git a/app/Http/Demo.php b/app/Http/Demo.php
index 3855db3..375066b 100644
--- a/app/Http/Demo.php
+++ b/app/Http/Demo.php
@@ -9,4 +9,16 @@
* @package Star\Http
*/
class Demo extends Http
-{}
+{
+ public function say()
+ {
+ throw new \Exception('hello word');
+
+ return 'hello word';
+ }
+
+ public function upload()
+ {
+ return 'upload';
+ }
+}
diff --git a/app/Job/Demo.php b/app/Job/Demo.php
new file mode 100644
index 0000000..1010d8c
--- /dev/null
+++ b/app/Job/Demo.php
@@ -0,0 +1,20 @@
+callMethod($application, $parameters);
-
- // 返回数据为数组,拼接成约定格式
- if (is_array($returnValue)) {
- $returnValue = [
- 'result' => true,
- 'info' => $returnValue,
- ];
+ // 检查是否需要 json 序列化
+ if ($context->isOutputJson()) {
+ $returnValue = json_encode($returnValue);
}
} catch (Exception $e) {
- // 拼接一场时返回的数据
- $returnValue = [
- 'result' => false,
- 'code' => $e->getCode(),
- 'msg' => $e->getMessage(),
- ];
+ // 收集异常信息并记录日志
+ $returnValue = ThrowExceptionHandler::http($e, $context);
- // 收集运行异常信息
- $context->setLog($e->toArray());
// 终止请求往下传递
$continue = false;
}
- // 检查是否需要 json 序列化
- if ($context->isOutputJson()) {
- $returnValue = json_encode($returnValue);
- }
-
// 将返回值注入上下文
$context->setContent($returnValue);
diff --git a/app/Middleware/Route.php b/app/Middleware/Route.php
index 4c60010..1eb4712 100644
--- a/app/Middleware/Route.php
+++ b/app/Middleware/Route.php
@@ -3,9 +3,9 @@
use Bee\Di\Container;
use Bee\Http\Context;
+use Bee\Http\Application;
+use Bee\Http\Middleware;
use Bee\Router\Handler as RouteHandler;
-use Star\Util\Middleware;
-use Star\Util\Application;
use Star\Util\ThrowException;
/**
diff --git a/app/Model/Demo.php b/app/Model/Demo.php
index 02e19f1..42bdfdd 100644
--- a/app/Model/Demo.php
+++ b/app/Model/Demo.php
@@ -13,5 +13,5 @@ class Demo extends Model
/**
* @var string
*/
- protected $table = 'api_error_log';
+ protected $table = 'table_name';
}
diff --git a/app/Util/Http.php b/app/Util/Http.php
index 3b2b227..81a7585 100644
--- a/app/Util/Http.php
+++ b/app/Util/Http.php
@@ -1,6 +1,7 @@
name . ':worker');
}
- // 注册错误处理方法
- register_shutdown_function(function () {
-// PR('register_shutdown_function');
- });
-
$di = Di::getDefault();
// 错误处理方法
set_error_handler(function ($code, $message, $file, $line, $callStack) use ($di) {
-// PR('set_error_handler');
- PR(func_get_args());
-// PR(debug_backtrace());
-
- $notice = new Notice();
-
- $di->getShared('service.logger')->error($message);
-
+ ThrowExceptionHandler::error(new Notice($message, $code, $line, $file));
}, E_ALL);
$router = new Router();
@@ -76,8 +66,6 @@ public function onWorkerStart(SwooleHttpServer $server, $workerId)
*/
public function onWorkerStop(SwooleHttpServer $server, $workerId)
{
-// PR('onWorkerStop');
-// PR($server);
}
/**
@@ -96,7 +84,7 @@ public function onRequest(Request $request, Response $response)
->handle()
;
} catch (\Throwable $e) {
- $response->end($e->getMessage());
+ $response->end(ThrowExceptionHandler::uncaught($e));
}
}
@@ -127,13 +115,9 @@ public function onTask(SwooleHttpServer $server, SwooleTask $task)
* @param integer $workerPid
* @param integer $exitCode
* @param integer $signal
- *
- * @return mixed
*/
public function onWorkerError(SwooleHttpServer $server, $workerId, $workerPid, $exitCode, $signal)
{
-// PR('onWorkerError');
-// PR(func_get_args());
}
/**
@@ -143,11 +127,9 @@ public function onWorkerError(SwooleHttpServer $server, $workerId, $workerPid, $
* - onManagerStart回调时,Task和Worker进程已创建
*
* @param SwooleHttpServer $server
- * @return mixed
*/
public function onManagerStart(SwooleHttpServer $server)
{
- // TODO: Implement onManagerStart() method.
}
/**
@@ -155,10 +137,8 @@ public function onManagerStart(SwooleHttpServer $server)
* - onManagerStop触发时,说明Task和Worker进程已结束运行,已被Manager进程回收。
*
* @param SwooleHttpServer $server
- * @return mixed
*/
public function onManagerStop(SwooleHttpServer $server)
{
- // TODO: Implement onManagerStop() method.
}
}
\ No newline at end of file
diff --git a/app/Util/ThrowException.php b/app/Util/ThrowException.php
index 51e4c9d..54e6fb0 100644
--- a/app/Util/ThrowException.php
+++ b/app/Util/ThrowException.php
@@ -6,7 +6,7 @@
*
* @package Eye\Util
*/
-class ThrowException extends \Bee\RuntimeException
+class ThrowException extends \Bee\Exception
{
/**
* 服务不可用
diff --git a/app/Util/ThrowExceptionHandler.php b/app/Util/ThrowExceptionHandler.php
new file mode 100644
index 0000000..1dae096
--- /dev/null
+++ b/app/Util/ThrowExceptionHandler.php
@@ -0,0 +1,137 @@
+getRequest();
+
+ $data = $e->toArray();
+ // 拼接其他日志数据
+ $data['type'] = 'http';
+ $data['request_uri'] = $request->getServer('request_uri');
+ $data['method'] = $request->getServer('request_method');
+ $data['headers'] = $request->getHeader();
+ $data['get'] = $request->getQuery();
+ $data['body'] = $request->hasFiles() ? null : $request->getRawBody();
+ $data['content'] = $context->getContent();
+ $data['data'] = $context->getData();
+
+ // 记录日异常志数据
+ self::report($e->getLevel(), $data);
+
+ return json_encode(
+ [
+ 'result' => false,
+ 'code' => $e->getCode(),
+ 'msg' => $e->getMessage(),
+ 'info' => $e->getData(),
+ ]
+ );
+ }
+
+ /**
+ * task 异常日志数据记录
+ *
+ * @param Exception $e
+ */
+ public static function task(Exception $e)
+ {
+ $data = $e->toArray();
+ // 拼接其他日志数据
+ $data['type'] = 'task';
+
+ self::report($e->getLevel(), $data);
+ }
+
+ /**
+ * worker / job 异常日志记录
+ *
+ * @param Exception $e
+ */
+ public static function job(Exception $e)
+ {
+ $data = $e->toArray();
+ // 拼接其他日志数据
+ $data['type'] = 'job';
+
+ self::report($e->getLevel(), $data);
+ }
+
+ /**
+ * 错误异常日志记录
+ *
+ * @param Error $e
+ */
+ public static function error(Error $e)
+ {
+ $data = $e->toArray();
+ // 拼接其他日志数据
+ $data['type'] = 'error';
+
+ self::report($e->getLevel(), $data);
+ }
+
+ /**
+ * 未捕获异常日志记录
+ *
+ * @param \Throwable $throwable
+ * @return string
+ */
+ public static function uncaught(\Throwable $throwable): string
+ {
+ $trace = $throwable->getTrace();
+
+ $data = [
+ 'type' => 'uncaught',
+ 'message' => $throwable->getMessage(),
+ 'code' => $throwable->getCode(),
+ 'line' => $throwable->getLine(),
+ 'class' => get_class($throwable),
+ 'file' => $throwable->getFile(),
+ 'args' => $trace[0] ?? [],
+ ];
+
+ self::report('critical', $data);
+
+ return '{"content":{"result":false,"code":500000,"msg":"服务异常,请稍后重试!"}}';
+ }
+
+ /**
+ * 执行日志记录
+ *
+ * @param string $level
+ * @param array $data
+ */
+ public static function report(string $level, array $data)
+ {
+ if (empty(self::$logger)) {
+ self::$logger = Container::getDefault()->getShared('service.logger');
+ }
+
+ self::$logger->log($level, json_encode($data, JSON_UNESCAPED_UNICODE));
+ }
+}
diff --git a/app/Worker/PullLog.php b/app/Worker/PullLog.php
deleted file mode 100644
index a30a029..0000000
--- a/app/Worker/PullLog.php
+++ /dev/null
@@ -1,67 +0,0 @@
-pop();
- // 没有数据,跳出
- if (empty($data)) {
- return;
- }
-
- $data = json_decode($data, true);
- $log = explode(' | ', $data['message']);
- $shot = json_decode($log[5], true);
-
- // 创建日志记录至数据库
- $apiErrorLogModel->create(
- [
- 'logAt' => $log[2],
- 'name' => $shot['name'] ?? 'undefined',
- 'level' => $log[3],
- 'url' => $shot['request_uri'] ?? '',
- 'method' => $shot['method'] ?? '',
- 'message' => $shot['logs'][0]['message'] ?? '',
- 'code' => $shot['logs'][0]['code'] ?? '',
- 'ip' => '',
- 'source' => $data['source'] ?? '',
- 'memory' => $log[4],
- 'pid' => $log[1],
- 'headers' => json_encode($shot['headers'], JSON_UNESCAPED_UNICODE),
- 'trace' => json_encode($shot['logs'], JSON_UNESCAPED_UNICODE),
- 'response' => json_encode($shot['runtime'], JSON_UNESCAPED_UNICODE),
- ]
- );
-
- } catch (\Throwable $e) {
- PR($e);
-// (new Application)->collectionException($e);
- }
- });
- });
- }
-}
\ No newline at end of file
diff --git a/composer.json b/composer.json
index dda889d..f0dcc3a 100644
--- a/composer.json
+++ b/composer.json
@@ -16,7 +16,8 @@
"bee-framework/http": "^1.2",
"bee-framework/cli": "^1.0",
"bee-framework/db": "^1.1",
- "bee-framework/logger": "^1.1"
+ "bee-framework/logger": "^1.1",
+ "bee-framework/process": "^1.1"
},
"autoload": {
"psr-4": {
diff --git a/composer.lock b/composer.lock
index 1c184fc..966a4a6 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
- "content-hash": "436b761b488b1d36592b877edb9756cd",
+ "content-hash": "e126ed1b290db565520ab9ee2181cdc2",
"packages": [
{
"name": "adhocore/cli",
@@ -252,6 +252,47 @@
"description": "Bee框架日志件",
"time": "2019-03-04T06:14:53+00:00"
},
+ {
+ "name": "bee-framework/process",
+ "version": "v1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/NufangTechnology/bee-process.git",
+ "reference": "ad5f774f5db114548cb7c5392454b4f78d82862b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/NufangTechnology/bee-process/zipball/ad5f774f5db114548cb7c5392454b4f78d82862b",
+ "reference": "ad5f774f5db114548cb7c5392454b4f78d82862b",
+ "shasum": ""
+ },
+ "require": {
+ "adhocore/cli": "^0.3.2",
+ "bee-framework/util": "^2.1",
+ "ext-pcntl": "*",
+ "ext-swoole": ">=4.2.0",
+ "php": "^7.1"
+ },
+ "require-dev": {
+ "eaglewu/swoole-ide-helper": "master-dev",
+ "phalcon/ide-stubs": "*"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Bee\\Process\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "authors": [
+ {
+ "name": "南山吴彦祖",
+ "email": "anoxia@engineer.com"
+ }
+ ],
+ "description": "Bee框架进程组件",
+ "time": "2019-03-04T07:18:35+00:00"
+ },
{
"name": "bee-framework/router",
"version": "v1.2.0",
@@ -291,16 +332,16 @@
},
{
"name": "bee-framework/util",
- "version": "v2.1.0",
+ "version": "v2.1.1",
"source": {
"type": "git",
"url": "https://github.com/NufangTechnology/bee-util.git",
- "reference": "eecc69eb0f4b87511544dd54b79fbb2fec38c1d9"
+ "reference": "c16f4b14b05e80d284438b3abcbbe2bcc71aa964"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/NufangTechnology/bee-util/zipball/eecc69eb0f4b87511544dd54b79fbb2fec38c1d9",
- "reference": "eecc69eb0f4b87511544dd54b79fbb2fec38c1d9",
+ "url": "https://api.github.com/repos/NufangTechnology/bee-util/zipball/c16f4b14b05e80d284438b3abcbbe2bcc71aa964",
+ "reference": "c16f4b14b05e80d284438b3abcbbe2bcc71aa964",
"shasum": ""
},
"require-dev": {
@@ -314,7 +355,7 @@
},
"notification-url": "https://packagist.org/downloads/",
"description": "Bee框架通用类库",
- "time": "2019-03-04T03:40:15+00:00"
+ "time": "2019-03-04T09:43:54+00:00"
}
],
"packages-dev": [
diff --git a/config/cli.php b/config/cli.php
index d5bca47..bf26959 100644
--- a/config/cli.php
+++ b/config/cli.php
@@ -7,6 +7,6 @@
'class' => \Star\Cli\Http::class
],
[
- 'class' => \Star\Cli\Worker::class
+ 'class' => \Star\Cli\Job::class
]
];
\ No newline at end of file
diff --git a/config/di.php b/config/di.php
index 34a9a7e..7ef78ea 100644
--- a/config/di.php
+++ b/config/di.php
@@ -56,5 +56,5 @@
// 注入多进程 worker程服务
$di->setShared('service.worker', function () use ($di) {
$config = $di->getShared('config.server');
- return new \Star\Worker\Master($config['worker']);
+ return new \Star\Job\Master($config['worker']);
});
\ No newline at end of file
diff --git a/config/routes.php b/config/routes.php
index 9494a98..3e5dd38 100644
--- a/config/routes.php
+++ b/config/routes.php
@@ -4,5 +4,11 @@
return call_user_func(function () {
$rules = [];
+ $rules['demo'] = new Collection(\Star\Http\Demo::class, '/');
+ $rules['demo']
+ ->get('/', 'word')
+ ->post('/', 'upload')
+ ;
+
return $rules;
});
diff --git a/config/server.php b/config/server.php
index baf9908..15f51f0 100644
--- a/config/server.php
+++ b/config/server.php
@@ -2,9 +2,9 @@
return [
// http服务配置
'http' => [
- 'name' => 'app-manage-http',
+ 'name' => 'bee-http',
'host' => '0.0.0.0',
- 'port' => 8002,
+ 'port' => 8000,
'option' => [
'pid_file' => RUNTIME_PATH . '/http.pid',
'log_file' => RUNTIME_PATH . '/http_server.log',
@@ -21,7 +21,7 @@
// 定时器配置
'worker' => [
- 'name' => 'app-manage-worker',
+ 'name' => 'bee-worker',
'pidFile' => RUNTIME_PATH . '/worker.pid',
'daemon' => true,
'redirect' => false
diff --git a/config/worker.php b/config/worker.php
index e7ddfd2..5d61d8e 100644
--- a/config/worker.php
+++ b/config/worker.php
@@ -3,6 +3,6 @@
[
// 红包退款
'name' => 'push-log',
- 'class' => \Star\Worker\PullLog::class
+ 'class' => \Star\Job\Demo::class
],
];
\ No newline at end of file
diff --git a/runtime/default/20190301.log b/runtime/default/20190301.log
deleted file mode 100644
index 69dc35b..0000000
--- a/runtime/default/20190301.log
+++ /dev/null
@@ -1,17 +0,0 @@
-2019-03-01 16:03:10 | ERROR | 11330 | 5c78e73a6efcd | 1551427390.676 |
-2019-03-01 16:03:10 | ERROR | 11330 | 5c78e73a6efcd | 1551427390.686 | {"request_uri":"\/","method":"GET","headers":{"Host":"127.0.0.1:8002","Content-Type":null,"User-Agent":"curl\/7.29.0","Referer":null,"X-Api-Version":null,"X-Client-Version":null,"X-Mini-Version":null,"X-System-Version":null,"X-Token":null},"get":null,"body":null,"context":{"result":false,"code":404000,"msg":"请求的URL不存在","info":[]},"data":[],"logs":[{"name":"app-management","message":"请求的URL不存在","code":404000,"line":48,"function":"urlNotFound","class":"Star\\Util\\ThrowException","file":"\/vagrant\/app\/Middleware\/Route.php","args":[]}]}
-2019-03-01 16:04:25 | ERROR | 11343 | 5c78e788cca6c | 1551427465.940 | Undefined variable: data
-2019-03-01 16:04:25 | ERROR | 11343 | 5c78e788cca6c | 1551427465.948 | {"request_uri":"\/","method":"GET","headers":{"Host":"127.0.0.1:8002","Content-Type":null,"User-Agent":"curl\/7.29.0","Referer":null,"X-Api-Version":null,"X-Client-Version":null,"X-Mini-Version":null,"X-System-Version":null,"X-Token":null},"get":null,"body":null,"context":{"result":false,"code":404000,"msg":"请求的URL不存在","info":[]},"data":[],"logs":[{"name":"app-management","message":"请求的URL不存在","code":404000,"line":48,"function":"urlNotFound","class":"Star\\Util\\ThrowException","file":"\/vagrant\/app\/Middleware\/Route.php","args":[]}]}
-2019-03-01 16:04:45 | ERROR | 11356 | 5c78e799ea192 | 1551427485.450 | Undefined variable: data
-2019-03-01 16:04:45 | ERROR | 11356 | 5c78e799ea192 | 1551427485.458 | {"request_uri":"\/","method":"GET","headers":{"Host":"127.0.0.1:8002","Content-Type":null,"User-Agent":"curl\/7.29.0","Referer":null,"X-Api-Version":null,"X-Client-Version":null,"X-Mini-Version":null,"X-System-Version":null,"X-Token":null},"get":null,"body":null,"context":{"result":false,"code":404000,"msg":"请求的URL不存在","info":[]},"data":[],"logs":[{"name":"app-management","message":"请求的URL不存在","code":404000,"line":48,"function":"urlNotFound","class":"Star\\Util\\ThrowException","file":"\/vagrant\/app\/Middleware\/Route.php","args":[]}]}
-2019-03-01 17:02:42 | ERROR | 11383 | 5c78f5317a606 | 1551430962.482 | {"request_uri":"\/","method":"GET","headers":{"Host":"127.0.0.1:8002","Content-Type":null,"User-Agent":"curl\/7.29.0","Referer":null,"X-Api-Version":null,"X-Client-Version":null,"X-Mini-Version":null,"X-System-Version":null,"X-Token":null},"get":null,"body":null,"context":{"result":false,"code":10,"msg":"服务异常,请稍后重试!"},"data":[],"logs":[{"name":"app-management","message":"hahah","code":10,"line":20,"function":"call","class":"Exception","file":"\/vagrant\/app\/Util\/Middleware.php","args":[{},{},null]}]}
-2019-03-01 17:03:15 | ERROR | 11396 | 5c78f552b6e88 | 1551430995.877 | {"request_uri":"\/","method":"GET","headers":{"Host":"127.0.0.1:8002","Content-Type":null,"User-Agent":"curl\/7.29.0","Referer":null,"X-Api-Version":null,"X-Client-Version":null,"X-Mini-Version":null,"X-System-Version":null,"X-Token":null},"get":null,"body":null,"context":{"result":false,"code":10,"msg":"服务异常,请稍后重试!"},"data":[],"logs":[{"name":"app-management","message":"hahah","code":10,"line":20,"function":"call","class":"Exception","file":"\/vagrant\/app\/Util\/Middleware.php","args":[{},{},null]}]}
-2019-03-01 17:10:33 | ERROR | 11409 | 5c78f708a1fd4 | 1551431433.769 | {"request_uri":"\/","method":"GET","headers":{"Host":"127.0.0.1:8002","Content-Type":null,"User-Agent":"curl\/7.29.0","Referer":null,"X-Api-Version":null,"X-Client-Version":null,"X-Mini-Version":null,"X-System-Version":null,"X-Token":null},"get":null,"body":null,"context":{"result":false,"code":10,"msg":"服务异常,请稍后重试!"},"data":[],"logs":[{"name":"app-management","message":"hahah","code":10,"line":20,"function":"call","class":"Error","file":"\/vagrant\/app\/Util\/Middleware.php","args":[{},{},null]}]}
-2019-03-01 17:14:53 | ERROR | 11422 | 5c78f80c2f456 | 1551431693.544 | {"request_uri":"\/","method":"GET","headers":{"Host":"127.0.0.1:8002","Content-Type":null,"User-Agent":"curl\/7.29.0","Referer":null,"X-Api-Version":null,"X-Client-Version":null,"X-Mini-Version":null,"X-System-Version":null,"X-Token":null},"get":null,"body":null,"context":{"result":false,"code":0,"msg":"服务异常,请稍后重试!"},"data":[],"logs":[{"name":"app-management","message":"Class 'Star\\Util\\Notice' not found","code":0,"line":25,"function":"Star\\Util\\{closure}","class":"Error","file":"\/vagrant\/app\/Middleware\/CORS.php","args":[8,"Undefined variable: data","\/vagrant\/app\/Middleware\/CORS.php",25,{"application":{},"context":{},"parameters":null}]}]}
-2019-03-01 17:15:02 | ERROR | 11422 | 5c78f80c2f456 | 1551431702.518 | {"request_uri":"\/","method":"GET","headers":{"Host":"127.0.0.1:8002","Content-Type":null,"User-Agent":"curl\/7.29.0","Referer":null,"X-Api-Version":null,"X-Client-Version":null,"X-Mini-Version":null,"X-System-Version":null,"X-Token":null},"get":null,"body":null,"context":{"result":false,"code":0,"msg":"服务异常,请稍后重试!"},"data":[],"logs":[{"name":"app-management","message":"Class 'Star\\Util\\Notice' not found","code":0,"line":25,"function":"Star\\Util\\{closure}","class":"Error","file":"\/vagrant\/app\/Middleware\/CORS.php","args":[8,"Undefined variable: data","\/vagrant\/app\/Middleware\/CORS.php",25,{"application":{},"context":{},"parameters":null}]}]}
-2019-03-01 17:15:39 | ERROR | 11436 | 5c78f834d1488 | 1551431739.720 | {"request_uri":"\/","method":"GET","headers":{"Host":"127.0.0.1:8002","Content-Type":null,"User-Agent":"curl\/7.29.0","Referer":null,"X-Api-Version":null,"X-Client-Version":null,"X-Mini-Version":null,"X-System-Version":null,"X-Token":null},"get":null,"body":null,"context":{"result":false,"code":0,"msg":"服务异常,请稍后重试!"},"data":[],"logs":[{"name":"app-management","message":"Class 'Star\\Util\\Notice' not found","code":0,"line":25,"function":"Star\\Util\\{closure}","class":"Error","file":"\/vagrant\/app\/Middleware\/CORS.php","args":[8,"Undefined variable: data","\/vagrant\/app\/Middleware\/CORS.php",25,{"application":{},"context":{},"parameters":null}]}]}
-2019-03-01 17:16:18 | ERROR | 11449 | 5c78f85cba588 | 1551431778.287 | {"request_uri":"\/","method":"GET","headers":{"Host":"127.0.0.1:8002","Content-Type":null,"User-Agent":"curl\/7.29.0","Referer":null,"X-Api-Version":null,"X-Client-Version":null,"X-Mini-Version":null,"X-System-Version":null,"X-Token":null},"get":null,"body":null,"context":{"result":false,"code":0,"msg":"服务异常,请稍后重试!"},"data":[],"logs":[{"name":"app-management","message":"Class 'Star\\Util\\Notice' not found","code":0,"line":25,"function":"Star\\Util\\{closure}","class":"Error","file":"\/vagrant\/app\/Middleware\/CORS.php","args":[8,"Undefined variable: data","\/vagrant\/app\/Middleware\/CORS.php",25,{"application":{},"context":{},"parameters":null}]}]}
-2019-03-01 17:16:44 | ERROR | 11462 | 5c78f877cd9ea | 1551431804.895 | {"request_uri":"\/","method":"GET","headers":{"Host":"127.0.0.1:8002","Content-Type":null,"User-Agent":"curl\/7.29.0","Referer":null,"X-Api-Version":null,"X-Client-Version":null,"X-Mini-Version":null,"X-System-Version":null,"X-Token":null},"get":null,"body":null,"context":{"result":false,"code":0,"msg":"服务异常,请稍后重试!"},"data":[],"logs":[{"name":"app-management","message":"Class 'Star\\Util\\Notice' not found","code":0,"line":25,"function":"Star\\Util\\{closure}","class":"Error","file":"\/vagrant\/app\/Middleware\/CORS.php","args":[8,"Undefined variable: data","\/vagrant\/app\/Middleware\/CORS.php",25,{"application":{},"context":{},"parameters":null}]}]}
-2019-03-01 17:17:14 | ERROR | 11475 | 5c78f899680ef | 1551431834.331 | {"request_uri":"\/","method":"GET","headers":{"Host":"127.0.0.1:8002","Content-Type":null,"User-Agent":"curl\/7.29.0","Referer":null,"X-Api-Version":null,"X-Client-Version":null,"X-Mini-Version":null,"X-System-Version":null,"X-Token":null},"get":null,"body":null,"context":{"result":false,"code":0,"msg":"服务异常,请稍后重试!"},"data":[],"logs":[{"name":"app-management","message":"Class 'Star\\Util\\Notice' not found","code":0,"line":25,"function":"Star\\Util\\{closure}","class":"Error","file":"\/vagrant\/app\/Middleware\/CORS.php","args":[8,"Undefined variable: data","\/vagrant\/app\/Middleware\/CORS.php",25,{"application":{},"context":{},"parameters":null}]}]}
-2019-03-01 17:17:24 | ERROR | 11475 | 5c78f899680ef | 1551431844.808 | {"request_uri":"\/","method":"GET","headers":{"Host":"127.0.0.1:8002","Content-Type":null,"User-Agent":"curl\/7.29.0","Referer":null,"X-Api-Version":null,"X-Client-Version":null,"X-Mini-Version":null,"X-System-Version":null,"X-Token":null},"get":null,"body":null,"context":{"result":false,"code":0,"msg":"服务异常,请稍后重试!"},"data":[],"logs":[{"name":"app-management","message":"Class 'Star\\Util\\Notice' not found","code":0,"line":25,"function":"Star\\Util\\{closure}","class":"Error","file":"\/vagrant\/app\/Middleware\/CORS.php","args":[8,"Undefined variable: data","\/vagrant\/app\/Middleware\/CORS.php",25,{"application":{},"context":{},"parameters":null}]}]}
-2019-03-01 17:20:09 | ERROR | 11489 | 5c78f91662501 | 1551432009.680 | {"request_uri":"\/","method":"GET","headers":{"Host":"127.0.0.1:8002","Content-Type":null,"User-Agent":"curl\/7.29.0","Referer":null,"X-Api-Version":null,"X-Client-Version":null,"X-Mini-Version":null,"X-System-Version":null,"X-Token":null},"get":null,"body":null,"context":{"result":false,"code":0,"msg":"服务异常,请稍后重试!"},"data":[],"logs":[{"name":"app-management","message":"Class 'Star\\Util\\Notice' not found","code":0,"line":25,"function":"Star\\Util\\{closure}","class":"Error","file":"\/vagrant\/app\/Middleware\/CORS.php","args":[8,"Undefined variable: data","\/vagrant\/app\/Middleware\/CORS.php",25,{"application":{},"context":{},"parameters":null}]}]}
diff --git a/runtime/default/20190304.log b/runtime/default/20190304.log
new file mode 100644
index 0000000..a620712
--- /dev/null
+++ b/runtime/default/20190304.log
@@ -0,0 +1,13 @@
+2019-03-04 18:14:21 | CRITICAL | 2450 | 5c7cfa79e3663 | 1551694461.93 | Error - type:1 - file:/vagrant/app/Util/ThrowExceptionHandler.php - line:130 - msg:Uncaught Error: Call to a member function log() on null in /vagrant/app/Util/ThrowExceptionHandler.php:130
+Stack trace:
+#0 /vagrant/app/Util/ThrowExceptionHandler.php(117): Star\Util\ThrowExceptionHandler::report('critical', Array)
+#1 /vagrant/app/Util/HttpServer.php(87): Star\Util\ThrowExceptionHandler::uncaught(Object(Error))
+#2 {main}
+ thrown
+2019-03-04 18:15:53 | notice | 2463 | 5c7cfad76249b | 1551694553.823 | {"message":"Undefined variable: data","code":8,"line":25,"class":"Bee\\Error\\Notice","file":"\/vagrant\/app\/Middleware\/CORS.php","args":[],"type":"error"}
+2019-03-04 18:21:18 | CRITICAL | 2475 | 5c7cfc1b92d2c | 1551694878.156 | Error - type:1 - file:/vagrant/app/Util/ThrowExceptionHandler.php - line:135 - msg:Uncaught Error: Call to a member function log() on null in /vagrant/app/Util/ThrowExceptionHandler.php:135
+Stack trace:
+#0 /vagrant/app/Util/ThrowExceptionHandler.php(118): Star\Util\ThrowExceptionHandler::report('critical', Array)
+#1 /vagrant/app/Util/HttpServer.php(87): Star\Util\ThrowExceptionHandler::uncaught(Object(Error))
+#2 {main}
+ thrown
diff --git a/runtime/http.pid b/runtime/http.pid
index a70ca6c..4f77648 100644
--- a/runtime/http.pid
+++ b/runtime/http.pid
@@ -1 +1 @@
-11490
\ No newline at end of file
+2489
\ No newline at end of file
diff --git a/runtime/http_server.log b/runtime/http_server.log
index 23cfd46..74b5368 100644
--- a/runtime/http_server.log
+++ b/runtime/http_server.log
@@ -129,3 +129,44 @@ PHP Warning: var_export does not handle circular references in /vagrant/app/hel
PHP Warning: var_export does not handle circular references in /vagrant/app/helper.php on line 5
PHP Warning: var_export does not handle circular references in /vagrant/app/helper.php on line 5
[2019-03-01 09:19:18 #11476.1] NOTICE Server is shutdown now.
+[2019-03-04 08:01:07 #2197.1] NOTICE Server is shutdown now.
+[2019-03-04 08:02:28 #2223.1] NOTICE Server is shutdown now.
+[2019-03-04 08:34:42 #2237.1] NOTICE Server is shutdown now.
+[2019-03-04 08:35:10 #2251.1] NOTICE Server is shutdown now.
+[2019-03-04 08:36:21 #2264.1] NOTICE Server is shutdown now.
+[2019-03-04 08:36:47 #2277.1] NOTICE Server is shutdown now.
+[2019-03-04 08:48:36 #2290.1] NOTICE Server is shutdown now.
+[2019-03-04 08:49:07 #2303.1] NOTICE Server is shutdown now.
+[2019-03-04 08:50:51 #2315.1] NOTICE Server is shutdown now.
+[2019-03-04 08:52:22 #2327.1] NOTICE Server is shutdown now.
+[2019-03-04 08:54:04 #2339.1] NOTICE Server is shutdown now.
+[2019-03-04 08:55:20 #2351.0] WARNING swPort_onRead_http: Content-Length is too big, MaxSize=[2096804].
+[2019-03-04 08:56:38 #2351.1] NOTICE Server is shutdown now.
+[2019-03-04 08:58:06 #2363.1] NOTICE Server is shutdown now.
+[2019-03-04 10:13:33 #2375.1] NOTICE Server is shutdown now.
+PHP Fatal error: Uncaught Error: Call to a member function log() on null in /vagrant/app/Util/ThrowExceptionHandler.php:130
+Stack trace:
+#0 /vagrant/app/Util/ThrowExceptionHandler.php(117): Star\Util\ThrowExceptionHandler::report('critical', Array)
+#1 /vagrant/app/Util/HttpServer.php(87): Star\Util\ThrowExceptionHandler::uncaught(Object(Error))
+#2 {main}
+ thrown in /vagrant/app/Util/ThrowExceptionHandler.php on line 130
+[2019-03-04 10:13:41 $2427.0] WARNING swManager_check_exit_status: worker#0 abnormal exit, status=255, signal=0
+[2019-03-04 10:14:10 #2426.1] NOTICE Server is shutdown now.
+[2019-03-04 10:14:17 #2439.1] NOTICE Server is shutdown now.
+PHP Fatal error: Uncaught Error: Call to a member function log() on null in /vagrant/app/Util/ThrowExceptionHandler.php:130
+Stack trace:
+#0 /vagrant/app/Util/ThrowExceptionHandler.php(117): Star\Util\ThrowExceptionHandler::report('critical', Array)
+#1 /vagrant/app/Util/HttpServer.php(87): Star\Util\ThrowExceptionHandler::uncaught(Object(Error))
+#2 {main}
+ thrown in /vagrant/app/Util/ThrowExceptionHandler.php on line 130
+[2019-03-04 10:14:21 $2452.0] WARNING swManager_check_exit_status: worker#0 abnormal exit, status=255, signal=0
+[2019-03-04 10:15:51 #2451.1] NOTICE Server is shutdown now.
+[2019-03-04 10:21:15 #2464.1] NOTICE Server is shutdown now.
+PHP Fatal error: Uncaught Error: Call to a member function log() on null in /vagrant/app/Util/ThrowExceptionHandler.php:135
+Stack trace:
+#0 /vagrant/app/Util/ThrowExceptionHandler.php(118): Star\Util\ThrowExceptionHandler::report('critical', Array)
+#1 /vagrant/app/Util/HttpServer.php(87): Star\Util\ThrowExceptionHandler::uncaught(Object(Error))
+#2 {main}
+ thrown in /vagrant/app/Util/ThrowExceptionHandler.php on line 135
+[2019-03-04 10:21:18 $2477.0] WARNING swManager_check_exit_status: worker#0 abnormal exit, status=255, signal=0
+[2019-03-04 10:22:43 #2476.1] NOTICE Server is shutdown now.
diff --git a/runtime/print_r.log b/runtime/print_r.log
deleted file mode 100644
index 02eac2a..0000000
--- a/runtime/print_r.log
+++ /dev/null
@@ -1,158 +0,0 @@
-array (
- 0 => 8,
- 1 => 'Undefined variable: data',
- 2 => '/vagrant/app/Middleware/CORS.php',
- 3 => 25,
- 4 =>
- array (
- 'application' =>
- Star\Util\Application::__set_state(array(
- 'meddlers' =>
- array (
- 0 =>
- Star\Middleware\CORS::__set_state(array(
- )),
- 1 =>
- Star\Middleware\Route::__set_state(array(
- )),
- 2 =>
- Star\Middleware\Auth::__set_state(array(
- )),
- 3 =>
- Star\Middleware\Dispatch::__set_state(array(
- )),
- ),
- 'context' =>
- Bee\Http\Context::__set_state(array(
- 'request' =>
- Bee\Http\Request::__set_state(array(
- 'request' =>
- Swoole\Http\Request::__set_state(array(
- 'fd' => 1,
- 'header' =>
- array (
- 'user-agent' => 'curl/7.29.0',
- 'host' => '127.0.0.1:8002',
- 'accept' => '*/*',
- ),
- 'server' =>
- array (
- 'request_method' => 'GET',
- 'request_uri' => '/',
- 'path_info' => '/',
- 'request_time' => 1551432009,
- 'request_time_float' => 1551432009.654493,
- 'server_port' => 8002,
- 'remote_port' => 55882,
- 'remote_addr' => '127.0.0.1',
- 'master_time' => 1551432009,
- 'server_protocol' => 'HTTP/1.1',
- ),
- 'request' => NULL,
- 'cookie' => NULL,
- 'get' => NULL,
- 'files' => NULL,
- 'post' => NULL,
- 'tmpfiles' => NULL,
- )),
- 'putCache' => NULL,
- )),
- 'response' =>
- Bee\Http\Response::__set_state(array(
- 'response' =>
- Swoole\Http\Response::__set_state(array(
- 'fd' => 1,
- 'header' => NULL,
- 'cookie' => NULL,
- 'trailer' => NULL,
- )),
- 'headers' =>
- Bee\Http\Response\Headers::__set_state(array(
- 'headers' =>
- array (
- 'Content-Type' => 'application/json; charset=utf-8',
- ),
- )),
- 'content' => NULL,
- 'file' => NULL,
- 'sent' => false,
- )),
- 'content' => NULL,
- 'data' =>
- array (
- ),
- 'logs' =>
- array (
- ),
- 'outputJson' => true,
- )),
- 'routeHandler' => NULL,
- )),
- 'context' =>
- Bee\Http\Context::__set_state(array(
- 'request' =>
- Bee\Http\Request::__set_state(array(
- 'request' =>
- Swoole\Http\Request::__set_state(array(
- 'fd' => 1,
- 'header' =>
- array (
- 'user-agent' => 'curl/7.29.0',
- 'host' => '127.0.0.1:8002',
- 'accept' => '*/*',
- ),
- 'server' =>
- array (
- 'request_method' => 'GET',
- 'request_uri' => '/',
- 'path_info' => '/',
- 'request_time' => 1551432009,
- 'request_time_float' => 1551432009.654493,
- 'server_port' => 8002,
- 'remote_port' => 55882,
- 'remote_addr' => '127.0.0.1',
- 'master_time' => 1551432009,
- 'server_protocol' => 'HTTP/1.1',
- ),
- 'request' => NULL,
- 'cookie' => NULL,
- 'get' => NULL,
- 'files' => NULL,
- 'post' => NULL,
- 'tmpfiles' => NULL,
- )),
- 'putCache' => NULL,
- )),
- 'response' =>
- Bee\Http\Response::__set_state(array(
- 'response' =>
- Swoole\Http\Response::__set_state(array(
- 'fd' => 1,
- 'header' => NULL,
- 'cookie' => NULL,
- 'trailer' => NULL,
- )),
- 'headers' =>
- Bee\Http\Response\Headers::__set_state(array(
- 'headers' =>
- array (
- 'Content-Type' => 'application/json; charset=utf-8',
- ),
- )),
- 'content' => NULL,
- 'file' => NULL,
- 'sent' => false,
- )),
- 'content' => NULL,
- 'data' =>
- array (
- ),
- 'logs' =>
- array (
- ),
- 'outputJson' => true,
- )),
- 'parameters' => NULL,
- ),
-)
-
diff --git a/vendor/bee-framework/process/.gitignore b/vendor/bee-framework/process/.gitignore
new file mode 100644
index 0000000..7686503
--- /dev/null
+++ b/vendor/bee-framework/process/.gitignore
@@ -0,0 +1,8 @@
+.*
+!.gitignore
+.idea/
+*.log
+nbproject/
+.htaccess
+vendor/
+Vagrantfile
\ No newline at end of file
diff --git a/vendor/bee-framework/process/README.md b/vendor/bee-framework/process/README.md
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/bee-framework/process/composer.json b/vendor/bee-framework/process/composer.json
new file mode 100644
index 0000000..d43d753
--- /dev/null
+++ b/vendor/bee-framework/process/composer.json
@@ -0,0 +1,32 @@
+{
+ "name": "bee-framework/process",
+ "description": "Bee框架进程组件",
+ "type": "library",
+ "authors": [
+ {
+ "name": "南山吴彦祖",
+ "email": "anoxia@engineer.com"
+ }
+ ],
+ "require": {
+ "php": "^7.1",
+ "adhocore/cli": "^0.3.2",
+ "ext-swoole": ">=4.2.0",
+ "ext-pcntl": "*",
+ "bee-framework/util": "^2.1"
+ },
+ "require-dev": {
+ "phalcon/ide-stubs": "*",
+ "eaglewu/swoole-ide-helper": "master-dev"
+ },
+ "autoload": {
+ "psr-4": {
+ "Bee\\Process\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Bee\\Process\\Tests\\": "tests/"
+ }
+ }
+}
diff --git a/vendor/bee-framework/process/composer.lock b/vendor/bee-framework/process/composer.lock
new file mode 100644
index 0000000..cc13b04
--- /dev/null
+++ b/vendor/bee-framework/process/composer.lock
@@ -0,0 +1,196 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "5b8264f656ec00fadafd5ce6ea825eaa",
+ "packages": [
+ {
+ "name": "adhocore/cli",
+ "version": "0.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/adhocore/php-cli.git",
+ "reference": "9dbab2581b1797b9b37caf83102ec0335e046f7d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/adhocore/php-cli/zipball/9dbab2581b1797b9b37caf83102ec0335e046f7d",
+ "reference": "9dbab2581b1797b9b37caf83102ec0335e046f7d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Ahc\\Cli\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jitendra Adhikari",
+ "email": "jiten.adhikary@gmail.com"
+ }
+ ],
+ "description": "Command line interface library for PHP",
+ "keywords": [
+ "PHP7",
+ "argument-parser",
+ "argv-parser",
+ "cli",
+ "cli-action",
+ "cli-app",
+ "cli-color",
+ "cli-option",
+ "cli-writer",
+ "command",
+ "console",
+ "console-app",
+ "php-cli",
+ "stream-input",
+ "stream-output"
+ ],
+ "time": "2018-09-06T15:32:22+00:00"
+ },
+ {
+ "name": "bee-framework/util",
+ "version": "v2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/NufangTechnology/bee-util.git",
+ "reference": "eecc69eb0f4b87511544dd54b79fbb2fec38c1d9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/NufangTechnology/bee-util/zipball/eecc69eb0f4b87511544dd54b79fbb2fec38c1d9",
+ "reference": "eecc69eb0f4b87511544dd54b79fbb2fec38c1d9",
+ "shasum": ""
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Bee\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "description": "Bee框架通用类库",
+ "time": "2019-03-04T03:40:15+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "eaglewu/swoole-ide-helper",
+ "version": "dev-master",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/wudi/swoole-ide-helper.git",
+ "reference": "fae3d09e7494245a5bab0adcd09a1612fc4112b5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/wudi/swoole-ide-helper/zipball/fae3d09e7494245a5bab0adcd09a1612fc4112b5",
+ "reference": "fae3d09e7494245a5bab0adcd09a1612fc4112b5",
+ "shasum": ""
+ },
+ "type": "library",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "eagle",
+ "email": "eaglewudi@gmail.com",
+ "role": "lead"
+ }
+ ],
+ "description": "Swoole IDE Helper, to improve auto-completion",
+ "keywords": [
+ "autocomplete",
+ "codeintel",
+ "helper",
+ "ide",
+ "netbeans",
+ "phpdoc",
+ "phpstorm",
+ "sublime",
+ "swoole"
+ ],
+ "time": "2019-02-12T03:03:41+00:00"
+ },
+ {
+ "name": "phalcon/ide-stubs",
+ "version": "v3.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phalcon/ide-stubs.git",
+ "reference": "65144f2b0fad32b182ccb062b1efc1b4edea5d44"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phalcon/ide-stubs/zipball/65144f2b0fad32b182ccb062b1efc1b4edea5d44",
+ "reference": "65144f2b0fad32b182ccb062b1efc1b4edea5d44",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Phalcon Team",
+ "email": "team@phalconphp.com",
+ "homepage": "https://phalconphp.com/en/team"
+ },
+ {
+ "name": "Contributors",
+ "homepage": "https://github.com/phalcon/ide-stubs/graphs/contributors"
+ }
+ ],
+ "description": "The most complete Phalcon Framework IDE stubs library which enables autocompletion in modern IDEs.",
+ "homepage": "https://phalconphp.com",
+ "keywords": [
+ "Devtools",
+ "Eclipse",
+ "autocomplete",
+ "ide",
+ "netbeans",
+ "phalcon",
+ "phpstorm",
+ "stub",
+ "stubs"
+ ],
+ "time": "2018-12-09T14:11:06+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {
+ "eaglewu/swoole-ide-helper": 20
+ },
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": "^7.1",
+ "ext-swoole": ">=4.2.0",
+ "ext-pcntl": "*"
+ },
+ "platform-dev": []
+}
diff --git a/vendor/bee-framework/process/src/Exception.php b/vendor/bee-framework/process/src/Exception.php
new file mode 100644
index 0000000..14999d9
--- /dev/null
+++ b/vendor/bee-framework/process/src/Exception.php
@@ -0,0 +1,9 @@
+prefix = $runtime['name'];
+ }
+ if (isset($runtime['pidFile'])) {
+ $this->pidFile = $runtime['pidFile'];
+ }
+ if (isset($runtime['daemon'])) {
+ $this->daemon = boolval($runtime['daemon']);
+ }
+ if (isset($runtime['pipe'])) {
+ $this->pipe = boolval($runtime['pipe']);
+ }
+ if (isset($runtime['redirect'])) {
+ $this->redirect = $runtime['redirect'];
+ }
+ if (isset($runtime['logFile'])) {
+ $this->logFile = $runtime['logFile'];
+ }
+
+ $this->output = new Writer;
+ }
+
+ /**
+ * 启用进程及相关业务
+ */
+ public function start()
+ {
+ if ($this->isRunning()) {
+ $this->output->warn('应用启动失败,服务已在运行中', true);
+ return;
+ }
+
+ if ($this->daemon) {
+ Process::daemon(true);
+ }
+
+ // 记录进程信息
+ $this->log('', '进程组启动', 'group');
+
+ // 标记主进程状态
+ $this->waitExit = false;
+ // 注册信号处理函数
+ $this->signal();
+ // 设置当前进程名称
+ $this->name("master", true);
+ // 获取当前进程ID
+ $this->pid = getmypid();
+ // 执行自定义启动事件
+ $this->configure();
+ // 写入pid文件
+ $this->createPidFile();
+ // 定时检查子进程状态
+ $this->checkChildAlive();
+ // 输出进程状态
+ $this->status();
+
+ // 记录进程信息
+ $this->log($this->pid, '主进程启动', 'master');
+ }
+
+ /**
+ * 重新worker进程
+ * - 该操作只能重新载入Worker进程启动后加载的PHP文件,
+ */
+ public function reload()
+ {
+ if ($this->isRunning() == false) {
+ $this->output->warn('未找到运行中的服务', true);
+ return;
+ }
+
+ // 记录进程信息
+ $this->log('', 'worker平滑重启');
+ // 发送信号重启子进程
+ Process::kill($this->pid(), SIGUSR1);
+ }
+
+ /**
+ * 重启服务
+ *
+ * @param bool $force 强制重启
+ */
+ public function restart($force = false)
+ {
+ if ($force) {
+ $this->shutdown();
+ } else {
+ $this->stop();
+ }
+
+ // 记录进程信息
+ $this->log('', '服务平滑重启');
+
+ $this->start();
+ }
+
+ /**
+ * 平滑停止
+ */
+ public function stop()
+ {
+ if ($this->isRunning() == false) {
+ $this->output->warn('未找到运行中的服务', true);
+ return;
+ }
+
+ // 强制停止主进程(子进程会自动检测退出)
+ Process::kill($this->pid(), SIGTERM);
+ // 等待进程退出,删除进程PID文件
+ while (true) {
+ if ($this->isRunning() == false) {
+ // 删除进程pid
+ $this->deletePidFile();
+ break;
+ }
+ }
+
+ // 记录进程信息
+ $this->log('', '服务平滑停止', true);
+ }
+
+ /**
+ * 强制退出主进程及子进程
+ */
+ public function shutdown()
+ {
+ // 强制杀死进程
+ exec("ps -ef | grep {$this->prefix} | grep -vE 'grep|watcher' | cut -c 9-15 | xargs kill -s 9");
+ // 等待主进程退出删除进程PID文件
+ while (true) {
+ if ($this->isRunning() == false) {
+ // 删除进程pid文件
+ $this->deletePidFile();
+ break;
+ }
+ }
+
+ // 记录进程信息
+ $this->log($this->pid, '进程组退出', 'master');
+ }
+
+ /**
+ * 获取应用进程状态信息
+ */
+ public function status()
+ {
+ if (!$this->isRunning()) {
+ $this->output->warn('没有运行中的服务', true);
+ return;
+ }
+
+ $pid = $this->pid();
+
+ // 根据主进程ID获取相关进程(子进程)运行信息
+ exec("ps -A -o user,pid,ppid,pmem,pcpu,stat,comm,cmd | grep -E '{$pid}|%MEM|{$this->prefix}:watcher'", $result);
+ // 删除最后两行(shell指令自身)
+ array_pop($result);
+ array_pop($result);
+ // 提取并输出菜单栏
+ $this->output->ok(array_shift($result), true);
+ // 输出进程状态明细
+ foreach ($result as $line) {
+ $this->output->write($line, true);
+ }
+ }
+
+ /**
+ * 获取当主进程pid
+ *
+ * @return int
+ */
+ public function pid() : int
+ {
+ if ($this->isRunning()) {
+ if (!empty($this->pid)) {
+ return $this->pid;
+ }
+
+ $pid = @file_get_contents($this->pidFile);
+
+ return intval($pid);
+ }
+
+ return 0;
+ }
+
+ /**
+ * 检查主进程是否运行
+ *
+ * @return bool
+ */
+ public function isRunning()
+ {
+ if ($this->pid) {
+ return true;
+ }
+
+ if (!is_file($this->pidFile)) {
+ return false;
+ }
+
+ $pid = @file_get_contents($this->pidFile);
+
+ if (empty($pid)) {
+ return false;
+ }
+
+ return Process::kill(intval($pid), SIG_DFL);
+ }
+
+ /**
+ * 创建子进程
+ *
+ * @param callable $callback
+ * @param string $name
+ * @return Process
+ */
+ public function fork(callable $callback, $name = 'worker')
+ {
+ // 实例化进程
+ $process = new Process(
+ function (Process $process) use ($callback, $name) {
+ // 设置进程名称
+ $this->name($name, true);
+ // 获取进程名称
+ $this->log($process->pid, '子进程启动', $name);
+ // 执行worker业务代码
+ call_user_func($callback, $process, $this->pid);
+ },
+ $this->redirect,
+ $this->pipe
+ );
+ // 启动进程
+ $pid = $process->start();
+
+ // 保存子进程类handler
+ $this->configs[$pid] = ['callback' => $callback, 'name' => $name];
+
+ return $process;
+ }
+
+ /**
+ * 定时检查子进程状态
+ * - 每10秒检查子进程状态,如果子进程退出,重新拉起子进程
+ */
+ protected function checkChildAlive()
+ {
+ $id = Timer::tick(10000, function () {
+ foreach ($this->configs as $pid => $config) {
+ if (!Process::kill($pid, SIG_DFL)) {
+ $this->bootChild($pid);
+ }
+ }
+ });
+
+ $this->childTimerId = $id;
+ }
+
+ /**
+ * 重启子进程
+ *
+ * @param int $pid
+ */
+ protected function bootChild($pid)
+ {
+ // 进程信息
+ if (!isset($this->configs[$pid])) {
+ return;
+ }
+ // 获取worker(子进程)信息
+ $worker = $this->configs[$pid];
+
+ // 记录进程信息
+ $this->log($pid, '子进程退出', $worker['name']);
+
+ // waitExit = true
+ // 意味着主进程准备退出,改状态下不再拉起子进程
+ if ($this->waitExit) {
+ return;
+ }
+
+ // 启动新的子进程
+ $this->fork($worker['callback'], $worker['name']);
+ // 删除相关配置
+ unset($this->configs[$pid]);
+ }
+
+ /**
+ * 平滑退出子进程
+ */
+ protected function exitChild()
+ {
+ // 给子进程发送结束信号
+ foreach ($this->configs as $pid => $worker) {
+ Process::kill($pid, SIGUSR1);
+ // 记录进程信息
+ $this->log($pid, '子进程退出', $worker['name']);
+ }
+ }
+
+ /**
+ * 注册信号处理
+ */
+ protected function signal()
+ {
+ // 强制退出(系统信号)
+ Process::signal(SIGKILL, [$this, 'shutdown']);
+
+ // 平滑重启
+ Process::signal(SIGTERM, function () {
+ // 标记主进程状态为准备退出
+ $this->waitExit = true;
+ // 平滑退出子进程
+ $this->exitChild();
+ // 记录进程信息
+ $this->log($this->pid, '主进程退出', 'master');
+ // 退出当前进程
+ exit(1);
+ });
+
+ // 平滑重启子进程
+ Process::signal(SIGUSR1, function () {
+ // 平滑退出子进程
+ $this->exitChild();
+ });
+
+ // 获取运行状态
+ Process::signal(SIGUSR2, [$this, 'status']);
+
+ // 子进程退出,重新创建子进程
+ Process::signal(SIGCHLD, function () {
+ // 接受子进程数据
+ while ($data = Process::wait(false)) {
+ // 进程ID
+ if (!isset($data['pid'])) {
+ break;
+ }
+ // 重启子进程
+ $this->bootChild($data['pid']);
+ }
+ });
+ }
+
+ /**
+ * 创建pid文件
+ */
+ private function createPidFile()
+ {
+ @file_put_contents($this->pidFile, $this->pid);
+
+ // 检查pid文件是否写入成功
+ if (!is_file($this->pidFile)) {
+ $this->output->error('进程pid文件创建失败');
+ }
+ }
+
+ /**
+ * 删除进程pid文件
+ */
+ private function deletePidFile()
+ {
+ if (!is_file($this->pidFile)) {
+ return;
+ }
+
+ @unlink($this->pidFile);
+ }
+
+ /**
+ * 设置进程名称
+ *
+ * @param string $name
+ * @param bool $set
+ * @return string
+ */
+ protected function name($name = 'child', $set = false)
+ {
+ $processName = "{$this->prefix}:{$name}";
+
+ // 设置进程名称
+ if ($set) {
+ swoole_set_process_name($processName);
+ }
+
+ return $processName;
+ }
+
+ /**
+ * 记录进程信息
+ * @param int $pid
+ * @param string $desc
+ * @param string $name
+ */
+ protected function log($pid, $desc, $name = '')
+ {
+ $processName = $this->name($name);
+ $date = date('Y-m-d H:i:s');
+ $content = "{$desc}: {$date} [{$pid} {$processName}]" . PHP_EOL;
+
+ @file_put_contents($this->logFile, $content, FILE_APPEND);
+ }
+
+ /**
+ * 主进程业务配置
+ */
+ abstract public function configure();
+}
diff --git a/vendor/bee-framework/process/src/Worker.php b/vendor/bee-framework/process/src/Worker.php
new file mode 100644
index 0000000..5f0dd4f
--- /dev/null
+++ b/vendor/bee-framework/process/src/Worker.php
@@ -0,0 +1,134 @@
+idle) {
+ $this->workerExit();
+ }
+ });
+ }
+
+ /**
+ * 检查父进程运行状态(父进程退出,子进程自动退出)
+ */
+ protected function checkMaster()
+ {
+ if (!$this->masterStatus()) {
+ $this->workerExit();
+ }
+ }
+
+ /**
+ * 获取主进程状态
+ *
+ * @return mixed
+ */
+ protected function masterStatus()
+ {
+ return Process::kill($this->ppid, SIG_DFL);
+ }
+
+ /**
+ * 设置定制器检查主进程状态
+ */
+ protected function setTickCheckAlive()
+ {
+ Timer::tick(10000, function ($id) {
+ // 主进程已结束并且当前进程处于空闲状态
+ // 退出当前进程
+ if (!$this->masterStatus() && !$this->idle) {
+ $this->workerExit();
+ // 清除当前定时器
+ Timer::clear($id);
+ }
+ });
+ }
+
+ /**
+ * 使用管道发送数据
+ * - 进程间
+ *
+ * @param $target
+ * @param array $data
+ */
+ protected function send($target, array $data = [])
+ {
+ $this->process->write(igbinary_serialize(
+ [
+ 'target' => $target,
+ 'data' => $data
+ ]
+ ));
+ }
+
+ /**
+ * 退出当前进程
+ */
+ protected function exit()
+ {
+ $this->process->exit(1);
+ }
+
+ /**
+ * 进程退出时回调方法
+ * - 资源释放
+ */
+ protected function workerExit()
+ {
+ $this->exit();
+ }
+
+ /**
+ * @param Process $process
+ * @param $ppid
+ */
+ public function __invoke(Process $process, $ppid)
+ {
+ Coroutine::create(function () use ($process, $ppid) {
+ $this->handle($process, $ppid);
+ });
+ }
+
+ /**
+ * Worker业务代码
+ *
+ * @param Process $process 当前进程信息
+ * @param int $ppid 父进程pid
+ */
+ abstract public function handle(Process $process, $ppid);
+}
diff --git a/vendor/bee-framework/process/tests/bootstrap.php b/vendor/bee-framework/process/tests/bootstrap.php
new file mode 100644
index 0000000..4f32ec4
--- /dev/null
+++ b/vendor/bee-framework/process/tests/bootstrap.php
@@ -0,0 +1,35 @@
+watch(
+ [
+ __DIR__ . '/../src'
+ ],
+ function () {
+ echo time() . PHP_EOL;
+ }
+);
+$watcher->run();
+
+//class Mater extends \Ant\Process\Master
+//{
+// public function handle()
+// {
+// }
+//
+// public function error()
+// {
+// }
+//
+// public function exception(\Ahc\Cli\Exception $e)
+// {
+// }
+//
+// public function shutdown()
+// {
+// }
+//}
+
+
diff --git a/vendor/bee-framework/process/tests/exec.php b/vendor/bee-framework/process/tests/exec.php
new file mode 100644
index 0000000..0e9ed9a
--- /dev/null
+++ b/vendor/bee-framework/process/tests/exec.php
@@ -0,0 +1,39 @@
+ $var) {
+// if (empty($var)) {
+// continue;
+// }
+//
+// $line[$flag++ . 'fuck'] = $var;
+//
+// }
+//
+// $data[] = $line;
+//}
+
+//print_r($reslut);
+
+//(new \Ahc\Cli\Output\Writer)->table($data);
+
+require 'process.php';
+
+//(new p([]))->reload();
+(new p([]))->status();
diff --git a/vendor/bee-framework/process/tests/process.php b/vendor/bee-framework/process/tests/process.php
new file mode 100644
index 0000000..48f7708
--- /dev/null
+++ b/vendor/bee-framework/process/tests/process.php
@@ -0,0 +1,146 @@
+pid, PHP_EOL;
+//
+// sleep(1);
+//
+//// $process = new \swoole\process(function (\swoole\process $process) {
+//// echo $process->pid , php_eol;
+////
+//// sleep(1);
+//// });
+//
+//// $process->start();
+// }
+//
+//// swoole_timer_ick(1000, function () {
+//// echo time(), PHP_EOL;
+//// });
+//
+// });
+//
+// $process->start();
+//
+// $processes[$i] = $process->pid;
+//}
+//
+////while ($data = \Swoole\Process::wait()) {
+//// print_r($data);
+////}
+//
+//
+//\Swoole\Process::signal(SIGTERM, function () use ($processes) {
+//
+// var_dump($processes);
+//
+// foreach ($processes as $process) {
+// \Swoole\Process::kill($process, SIGTERM);
+// }
+//});
+//
+//\Swoole\Process::wait(false);
+//
+//\Swoole\Process::daemon(true);
+
+//echo $process->pid;
+
+//echo posix_getppid(), PHP_EOL;
+
+//exit();
+
+require __DIR__ . '/../vendor/autoload.php';
+
+class Job1 extends \Bee\Process\Worker
+{
+ const NAME = 'Job1';
+
+ public function handle(\Swoole\Process $process, $ppid)
+ {
+ $this->process = $process;
+ $this->signal();
+
+ try {
+ \Swoole\Event::add(
+ $process->pipe,
+ function ($pipe) use ($process) {
+ $data = $process->read();
+ print_r(self::NAME . ': ' . $data . PHP_EOL);
+// $process->write('子进程发来的消息:' . time());
+
+ });
+
+// \Swoole\Timer::tick(1000, function () {
+// file_put_contents(__DIR__ . '/job1.log', time() . PHP_EOL, 8);
+// });
+ } catch (\Throwable $e) {
+ print_r($e);
+ }
+ }
+}
+
+class Job2 extends \Bee\Process\Worker
+{
+ const NAME = 'Job2';
+
+ protected $ha;
+
+ public function handle(\Swoole\Process $process, $ppid)
+ {
+ $this->process = $process;
+
+ $this->signal();
+
+ \Swoole\Timer::tick(5000, function () {
+ throw new \Bee\Process\Exception('故意');
+ });
+ }
+}
+
+class p extends \Bee\Process\Master
+{
+ public function configure()
+ {
+ $this->fork([new Job1, 'handle'], Job1::NAME);
+ $this->fork([new Job2, 'handle'], Job2::NAME);
+ }
+
+ public function fork(callable $callback, $name = 'worker')
+ {
+ $process = parent::fork($callback, $name);
+
+// \Swoole\Timer::tick(2000, function ($id) use ($process) {
+// $process->write('来自父进程的数据:' . time());
+// });
+
+ $this->processes[$name] = $process;
+
+ return $process;
+ }
+}
+
+$di = new Phalcon\Di;
+
+$process = new p([
+ 'name' => 'Bee',
+ 'logFile' => __DIR__ . '/bee.log'
+]);
+
+//$process->reload();
+//$process->restart();
+$process->stop();
+//$process->shutdown();
+$process->status();
diff --git a/vendor/bee-framework/util/src/Exception.php b/vendor/bee-framework/util/src/Exception.php
index 0aa611e..13f0cdc 100644
--- a/vendor/bee-framework/util/src/Exception.php
+++ b/vendor/bee-framework/util/src/Exception.php
@@ -50,11 +50,11 @@ public function getData(): array
}
/**
- * @return array
+ * @return mixed
*/
- public function getArgs(): array
+ public function getRuntime()
{
- return $this->args;
+ return $this->runtime;
}
/**
@@ -81,6 +81,7 @@ public function toArray(): array
'line' => $trace[0]['line'] ?? 0,
'file' => $trace[0]['file'] ?? '',
'args' => $trace[0] ?? [],
+ 'data' => $this->data,
'runtime' => $this->runtime,
];
}
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index 2241124..52b1e85 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -8,6 +8,7 @@
return array(
'Star\\' => array($baseDir . '/app'),
'Bee\\Router\\' => array($vendorDir . '/bee-framework/router/src'),
+ 'Bee\\Process\\' => array($vendorDir . '/bee-framework/process/src'),
'Bee\\Logger\\' => array($vendorDir . '/bee-framework/logger/src'),
'Bee\\Http\\' => array($vendorDir . '/bee-framework/http/src'),
'Bee\\Di\\' => array($vendorDir . '/bee-framework/di/src'),
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index 10b8401..05b6af7 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -18,6 +18,7 @@ class ComposerStaticInitdbf9585cffb3f9979d2dc9aef6e99796
'B' =>
array (
'Bee\\Router\\' => 11,
+ 'Bee\\Process\\' => 12,
'Bee\\Logger\\' => 11,
'Bee\\Http\\' => 9,
'Bee\\Di\\' => 7,
@@ -40,6 +41,10 @@ class ComposerStaticInitdbf9585cffb3f9979d2dc9aef6e99796
array (
0 => __DIR__ . '/..' . '/bee-framework/router/src',
),
+ 'Bee\\Process\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/bee-framework/process/src',
+ ),
'Bee\\Logger\\' =>
array (
0 => __DIR__ . '/..' . '/bee-framework/logger/src',
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 7ef216f..9d44f7c 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -257,6 +257,49 @@
],
"description": "Bee框架日志件"
},
+ {
+ "name": "bee-framework/process",
+ "version": "v1.1.1",
+ "version_normalized": "1.1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/NufangTechnology/bee-process.git",
+ "reference": "ad5f774f5db114548cb7c5392454b4f78d82862b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/NufangTechnology/bee-process/zipball/ad5f774f5db114548cb7c5392454b4f78d82862b",
+ "reference": "ad5f774f5db114548cb7c5392454b4f78d82862b",
+ "shasum": ""
+ },
+ "require": {
+ "adhocore/cli": "^0.3.2",
+ "bee-framework/util": "^2.1",
+ "ext-pcntl": "*",
+ "ext-swoole": ">=4.2.0",
+ "php": "^7.1"
+ },
+ "require-dev": {
+ "eaglewu/swoole-ide-helper": "master-dev",
+ "phalcon/ide-stubs": "*"
+ },
+ "time": "2019-03-04T07:18:35+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Bee\\Process\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "authors": [
+ {
+ "name": "南山吴彦祖",
+ "email": "anoxia@engineer.com"
+ }
+ ],
+ "description": "Bee框架进程组件"
+ },
{
"name": "bee-framework/router",
"version": "v1.2.0",
@@ -298,23 +341,23 @@
},
{
"name": "bee-framework/util",
- "version": "v2.1.0",
- "version_normalized": "2.1.0.0",
+ "version": "v2.1.1",
+ "version_normalized": "2.1.1.0",
"source": {
"type": "git",
"url": "https://github.com/NufangTechnology/bee-util.git",
- "reference": "eecc69eb0f4b87511544dd54b79fbb2fec38c1d9"
+ "reference": "c16f4b14b05e80d284438b3abcbbe2bcc71aa964"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/NufangTechnology/bee-util/zipball/eecc69eb0f4b87511544dd54b79fbb2fec38c1d9",
- "reference": "eecc69eb0f4b87511544dd54b79fbb2fec38c1d9",
+ "url": "https://api.github.com/repos/NufangTechnology/bee-util/zipball/c16f4b14b05e80d284438b3abcbbe2bcc71aa964",
+ "reference": "c16f4b14b05e80d284438b3abcbbe2bcc71aa964",
"shasum": ""
},
"require-dev": {
"phpunit/phpunit": "^7.2"
},
- "time": "2019-03-04T03:40:15+00:00",
+ "time": "2019-03-04T09:43:54+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {