新建p_ysk
This commit is contained in:
commit
ad1b530842
|
|
@ -0,0 +1,8 @@
|
||||||
|
/runtime
|
||||||
|
/.idea
|
||||||
|
/.vscode
|
||||||
|
/vendor
|
||||||
|
*.log
|
||||||
|
.env
|
||||||
|
/tests/tmp
|
||||||
|
/tests/.phpunit.result.cache
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021 walkor<walkor@workerman.net> and contributors (see https://github.com/walkor/webman/contributors)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
@ -0,0 +1,70 @@
|
||||||
|
<div style="padding:18px;max-width: 1024px;margin:0 auto;background-color:#fff;color:#333">
|
||||||
|
<h1>webman</h1>
|
||||||
|
|
||||||
|
基于<a href="https://www.workerman.net" target="__blank">workerman</a>开发的超高性能PHP框架
|
||||||
|
|
||||||
|
|
||||||
|
<h1>学习</h1>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="https://www.workerman.net/webman" target="__blank">主页 / Home page</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="https://webman.workerman.net" target="__blank">文档 / Document</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="https://www.workerman.net/doc/webman/install.html" target="__blank">安装 / Install</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="https://www.workerman.net/questions" target="__blank">问答 / Questions</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="https://www.workerman.net/apps" target="__blank">市场 / Apps</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="https://www.workerman.net/sponsor" target="__blank">赞助 / Sponsors</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="https://www.workerman.net/doc/webman/thanks.html" target="__blank">致谢 / Thanks</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<div style="float:left;padding-bottom:30px;">
|
||||||
|
|
||||||
|
<h1>赞助商</h1>
|
||||||
|
|
||||||
|
<h4>特别赞助</h4>
|
||||||
|
<a href="https://www.crmeb.com/?form=workerman" target="__blank">
|
||||||
|
<img src="https://www.workerman.net/img/sponsors/6429/20230719111500.svg" width="200">
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<h4>铂金赞助</h4>
|
||||||
|
<a href="https://www.fadetask.com/?from=workerman" target="__blank"><img src="https://www.workerman.net/img/sponsors/1/20230719084316.png" width="200"></a>
|
||||||
|
<a href="https://www.yilianyun.net/?from=workerman" target="__blank" style="margin-left:20px;"><img src="https://www.workerman.net/img/sponsors/6218/20230720114049.png" width="200"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div style="float:left;padding-bottom:30px;clear:both">
|
||||||
|
|
||||||
|
<h1>请作者喝咖啡</h1>
|
||||||
|
|
||||||
|
<img src="https://www.workerman.net/img/wx_donate.png" width="200">
|
||||||
|
<img src="https://www.workerman.net/img/ali_donate.png" width="200">
|
||||||
|
<br>
|
||||||
|
<b>如果您觉得webman对您有所帮助,欢迎捐赠。</b>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div style="clear: both">
|
||||||
|
<h1>LICENSE</h1>
|
||||||
|
The webman is open-sourced software licensed under the MIT.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace app\controller;
|
||||||
|
|
||||||
|
use support\Request;
|
||||||
|
|
||||||
|
class IndexController
|
||||||
|
{
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
return <<<EOF
|
||||||
|
<style>
|
||||||
|
* {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
iframe {
|
||||||
|
border: none;
|
||||||
|
overflow: scroll;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<iframe
|
||||||
|
src="https://www.workerman.net/wellcome"
|
||||||
|
width="100%"
|
||||||
|
height="100%"
|
||||||
|
allow="*"
|
||||||
|
sandbox="allow-scripts allow-same-origin"
|
||||||
|
></iframe>
|
||||||
|
EOF;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function view(Request $request)
|
||||||
|
{
|
||||||
|
return view('index/view', ['name' => 'webman']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function json(Request $request)
|
||||||
|
{
|
||||||
|
return json(['code' => 0, 'msg' => 'ok']);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Here is your custom functions.
|
||||||
|
*/
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of webman.
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @author walkor<walkor@workerman.net>
|
||||||
|
* @copyright walkor<walkor@workerman.net>
|
||||||
|
* @link http://www.workerman.net/
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace app\middleware;
|
||||||
|
|
||||||
|
use Webman\MiddlewareInterface;
|
||||||
|
use Webman\Http\Response;
|
||||||
|
use Webman\Http\Request;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class StaticFile
|
||||||
|
* @package app\middleware
|
||||||
|
*/
|
||||||
|
class StaticFile implements MiddlewareInterface
|
||||||
|
{
|
||||||
|
public function process(Request $request, callable $handler): Response
|
||||||
|
{
|
||||||
|
// Access to files beginning with. Is prohibited
|
||||||
|
if (strpos($request->path(), '/.') !== false) {
|
||||||
|
return response('<h1>403 forbidden</h1>', 403);
|
||||||
|
}
|
||||||
|
/** @var Response $response */
|
||||||
|
$response = $handler($request);
|
||||||
|
// Add cross domain HTTP header
|
||||||
|
/*$response->withHeaders([
|
||||||
|
'Access-Control-Allow-Origin' => '*',
|
||||||
|
'Access-Control-Allow-Credentials' => 'true',
|
||||||
|
]);*/
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace app\model;
|
||||||
|
|
||||||
|
use support\Model;
|
||||||
|
|
||||||
|
class Test extends Model
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The table associated with the model.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $table = 'test';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The primary key associated with the table.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $primaryKey = 'id';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates if the model should be timestamped.
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
public $timestamps = false;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace app\process;
|
||||||
|
|
||||||
|
use Webman\App;
|
||||||
|
|
||||||
|
class Http extends App
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,305 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of webman.
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @author walkor<walkor@workerman.net>
|
||||||
|
* @copyright walkor<walkor@workerman.net>
|
||||||
|
* @link http://www.workerman.net/
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace app\process;
|
||||||
|
|
||||||
|
use FilesystemIterator;
|
||||||
|
use RecursiveDirectoryIterator;
|
||||||
|
use RecursiveIteratorIterator;
|
||||||
|
use SplFileInfo;
|
||||||
|
use Workerman\Timer;
|
||||||
|
use Workerman\Worker;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class FileMonitor
|
||||||
|
* @package process
|
||||||
|
*/
|
||||||
|
class Monitor
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected array $paths = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected array $extensions = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected array $loadedFiles = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
protected int $ppid = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pause monitor
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function pause(): void
|
||||||
|
{
|
||||||
|
file_put_contents(static::lockFile(), time());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resume monitor
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function resume(): void
|
||||||
|
{
|
||||||
|
clearstatcache();
|
||||||
|
if (is_file(static::lockFile())) {
|
||||||
|
unlink(static::lockFile());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether monitor is paused
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function isPaused(): bool
|
||||||
|
{
|
||||||
|
clearstatcache();
|
||||||
|
return file_exists(static::lockFile());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lock file
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected static function lockFile(): string
|
||||||
|
{
|
||||||
|
return runtime_path('monitor.lock');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FileMonitor constructor.
|
||||||
|
* @param $monitorDir
|
||||||
|
* @param $monitorExtensions
|
||||||
|
* @param array $options
|
||||||
|
*/
|
||||||
|
public function __construct($monitorDir, $monitorExtensions, array $options = [])
|
||||||
|
{
|
||||||
|
$this->ppid = function_exists('posix_getppid') ? posix_getppid() : 0;
|
||||||
|
static::resume();
|
||||||
|
$this->paths = (array)$monitorDir;
|
||||||
|
$this->extensions = $monitorExtensions;
|
||||||
|
foreach (get_included_files() as $index => $file) {
|
||||||
|
$this->loadedFiles[$file] = $index;
|
||||||
|
if (strpos($file, 'webman-framework/src/support/App.php')) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!Worker::getAllWorkers()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$disableFunctions = explode(',', ini_get('disable_functions'));
|
||||||
|
if (in_array('exec', $disableFunctions, true)) {
|
||||||
|
echo "\nMonitor file change turned off because exec() has been disabled by disable_functions setting in " . PHP_CONFIG_FILE_PATH . "/php.ini\n";
|
||||||
|
} else {
|
||||||
|
if ($options['enable_file_monitor'] ?? true) {
|
||||||
|
Timer::add(1, function () {
|
||||||
|
$this->checkAllFilesChange();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$memoryLimit = $this->getMemoryLimit($options['memory_limit'] ?? null);
|
||||||
|
if ($memoryLimit && ($options['enable_memory_monitor'] ?? true)) {
|
||||||
|
Timer::add(60, [$this, 'checkMemory'], [$memoryLimit]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $monitorDir
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function checkFilesChange($monitorDir): bool
|
||||||
|
{
|
||||||
|
static $lastMtime, $tooManyFilesCheck;
|
||||||
|
if (!$lastMtime) {
|
||||||
|
$lastMtime = time();
|
||||||
|
}
|
||||||
|
clearstatcache();
|
||||||
|
if (!is_dir($monitorDir)) {
|
||||||
|
if (!is_file($monitorDir)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$iterator = [new SplFileInfo($monitorDir)];
|
||||||
|
} else {
|
||||||
|
// recursive traversal directory
|
||||||
|
$dirIterator = new RecursiveDirectoryIterator($monitorDir, FilesystemIterator::SKIP_DOTS | FilesystemIterator::FOLLOW_SYMLINKS);
|
||||||
|
$iterator = new RecursiveIteratorIterator($dirIterator);
|
||||||
|
}
|
||||||
|
$count = 0;
|
||||||
|
foreach ($iterator as $file) {
|
||||||
|
$count ++;
|
||||||
|
/** var SplFileInfo $file */
|
||||||
|
if (is_dir($file->getRealPath())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// check mtime
|
||||||
|
if (in_array($file->getExtension(), $this->extensions, true) && $lastMtime < $file->getMTime()) {
|
||||||
|
$lastMtime = $file->getMTime();
|
||||||
|
if (DIRECTORY_SEPARATOR === '/' && isset($this->loadedFiles[$file->getRealPath()])) {
|
||||||
|
echo "$file updated but cannot be reloaded because only auto-loaded files support reload.\n";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$var = 0;
|
||||||
|
exec('"'.PHP_BINARY . '" -l ' . $file, $out, $var);
|
||||||
|
if ($var) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// send SIGUSR1 signal to master process for reload
|
||||||
|
if (DIRECTORY_SEPARATOR === '/') {
|
||||||
|
if ($masterPid = $this->getMasterPid()) {
|
||||||
|
echo $file . " updated and reload\n";
|
||||||
|
posix_kill($masterPid, SIGUSR1);
|
||||||
|
} else {
|
||||||
|
echo "Master process has gone away and can not reload\n";
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
echo $file . " updated and reload\n";
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!$tooManyFilesCheck && $count > 1000) {
|
||||||
|
echo "Monitor: There are too many files ($count files) in $monitorDir which makes file monitoring very slow\n";
|
||||||
|
$tooManyFilesCheck = 1;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function getMasterPid(): int
|
||||||
|
{
|
||||||
|
if ($this->ppid === 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (function_exists('posix_kill') && !posix_kill($this->ppid, 0)) {
|
||||||
|
echo "Master process has gone away\n";
|
||||||
|
return $this->ppid = 0;
|
||||||
|
}
|
||||||
|
if (PHP_OS_FAMILY !== 'Linux') {
|
||||||
|
return $this->ppid;
|
||||||
|
}
|
||||||
|
$cmdline = "/proc/$this->ppid/cmdline";
|
||||||
|
if (!is_readable($cmdline) || !($content = file_get_contents($cmdline)) || (!str_contains($content, 'WorkerMan') && !str_contains($content, 'php'))) {
|
||||||
|
// Process not exist
|
||||||
|
$this->ppid = 0;
|
||||||
|
}
|
||||||
|
return $this->ppid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function checkAllFilesChange(): bool
|
||||||
|
{
|
||||||
|
if (static::isPaused()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
foreach ($this->paths as $path) {
|
||||||
|
if ($this->checkFilesChange($path)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $memoryLimit
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function checkMemory($memoryLimit): void
|
||||||
|
{
|
||||||
|
if (static::isPaused() || $memoryLimit <= 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$masterPid = $this->getMasterPid();
|
||||||
|
if ($masterPid <= 0) {
|
||||||
|
echo "Master process has gone away\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$childrenFile = "/proc/$masterPid/task/$masterPid/children";
|
||||||
|
if (!is_file($childrenFile) || !($children = file_get_contents($childrenFile))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
foreach (explode(' ', $children) as $pid) {
|
||||||
|
$pid = (int)$pid;
|
||||||
|
$statusFile = "/proc/$pid/status";
|
||||||
|
if (!is_file($statusFile) || !($status = file_get_contents($statusFile))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$mem = 0;
|
||||||
|
if (preg_match('/VmRSS\s*?:\s*?(\d+?)\s*?kB/', $status, $match)) {
|
||||||
|
$mem = $match[1];
|
||||||
|
}
|
||||||
|
$mem = (int)($mem / 1024);
|
||||||
|
if ($mem >= $memoryLimit) {
|
||||||
|
posix_kill($pid, SIGINT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get memory limit
|
||||||
|
* @param $memoryLimit
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
protected function getMemoryLimit($memoryLimit): int
|
||||||
|
{
|
||||||
|
if ($memoryLimit === 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
$usePhpIni = false;
|
||||||
|
if (!$memoryLimit) {
|
||||||
|
$memoryLimit = ini_get('memory_limit');
|
||||||
|
$usePhpIni = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($memoryLimit == -1) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
$unit = strtolower($memoryLimit[strlen($memoryLimit) - 1]);
|
||||||
|
$memoryLimit = (int)$memoryLimit;
|
||||||
|
if ($unit === 'g') {
|
||||||
|
$memoryLimit = 1024 * $memoryLimit;
|
||||||
|
} else if ($unit === 'k') {
|
||||||
|
$memoryLimit = ($memoryLimit / 1024);
|
||||||
|
} else if ($unit === 'm') {
|
||||||
|
$memoryLimit = (int)($memoryLimit);
|
||||||
|
} else if ($unit === 't') {
|
||||||
|
$memoryLimit = (1024 * 1024 * $memoryLimit);
|
||||||
|
} else {
|
||||||
|
$memoryLimit = ($memoryLimit / (1024 * 1024));
|
||||||
|
}
|
||||||
|
if ($memoryLimit < 50) {
|
||||||
|
$memoryLimit = 50;
|
||||||
|
}
|
||||||
|
if ($usePhpIni) {
|
||||||
|
$memoryLimit = (0.8 * $memoryLimit);
|
||||||
|
}
|
||||||
|
return (int)$memoryLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link rel="shortcut icon" href="/favicon.ico"/>
|
||||||
|
<title>webman</title>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
hello <?=htmlspecialchars($name)?>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
{
|
||||||
|
"name": "workerman/webman",
|
||||||
|
"type": "project",
|
||||||
|
"keywords": [
|
||||||
|
"high performance",
|
||||||
|
"http service"
|
||||||
|
],
|
||||||
|
"homepage": "https://www.workerman.net",
|
||||||
|
"license": "MIT",
|
||||||
|
"description": "High performance HTTP Service Framework.",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "walkor",
|
||||||
|
"email": "walkor@workerman.net",
|
||||||
|
"homepage": "https://www.workerman.net",
|
||||||
|
"role": "Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"email": "walkor@workerman.net",
|
||||||
|
"issues": "https://github.com/walkor/webman/issues",
|
||||||
|
"forum": "https://wenda.workerman.net/",
|
||||||
|
"wiki": "https://workerman.net/doc/webman",
|
||||||
|
"source": "https://github.com/walkor/webman"
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=8.1",
|
||||||
|
"workerman/webman-framework": "^2.1",
|
||||||
|
"monolog/monolog": "^2.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-event": "For better performance. "
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"": "./",
|
||||||
|
"app\\": "./app",
|
||||||
|
"App\\": "./app",
|
||||||
|
"app\\View\\Components\\": "./app/view/components"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"post-package-install": [
|
||||||
|
"support\\Plugin::install"
|
||||||
|
],
|
||||||
|
"post-package-update": [
|
||||||
|
"support\\Plugin::install"
|
||||||
|
],
|
||||||
|
"pre-package-uninstall": [
|
||||||
|
"support\\Plugin::uninstall"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"minimum-stability": "dev",
|
||||||
|
"prefer-stable": true
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,499 @@
|
||||||
|
{
|
||||||
|
"_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#installing-dependencies",
|
||||||
|
"This file is @generated automatically"
|
||||||
|
],
|
||||||
|
"content-hash": "691f538563ac6695008ddc51b7722c80",
|
||||||
|
"packages": [
|
||||||
|
{
|
||||||
|
"name": "monolog/monolog",
|
||||||
|
"version": "2.10.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/Seldaek/monolog.git",
|
||||||
|
"reference": "5cf826f2991858b54d5c3809bee745560a1042a7"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/Seldaek/monolog/zipball/5cf826f2991858b54d5c3809bee745560a1042a7",
|
||||||
|
"reference": "5cf826f2991858b54d5c3809bee745560a1042a7",
|
||||||
|
"shasum": "",
|
||||||
|
"mirrors": [
|
||||||
|
{
|
||||||
|
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
|
||||||
|
"preferred": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=7.2",
|
||||||
|
"psr/log": "^1.0.1 || ^2.0 || ^3.0"
|
||||||
|
},
|
||||||
|
"provide": {
|
||||||
|
"psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"aws/aws-sdk-php": "^2.4.9 || ^3.0",
|
||||||
|
"doctrine/couchdb": "~1.0@dev",
|
||||||
|
"elasticsearch/elasticsearch": "^7 || ^8",
|
||||||
|
"ext-json": "*",
|
||||||
|
"graylog2/gelf-php": "^1.4.2 || ^2@dev",
|
||||||
|
"guzzlehttp/guzzle": "^7.4",
|
||||||
|
"guzzlehttp/psr7": "^2.2",
|
||||||
|
"mongodb/mongodb": "^1.8",
|
||||||
|
"php-amqplib/php-amqplib": "~2.4 || ^3",
|
||||||
|
"phpspec/prophecy": "^1.15",
|
||||||
|
"phpstan/phpstan": "^1.10",
|
||||||
|
"phpunit/phpunit": "^8.5.38 || ^9.6.19",
|
||||||
|
"predis/predis": "^1.1 || ^2.0",
|
||||||
|
"rollbar/rollbar": "^1.3 || ^2 || ^3",
|
||||||
|
"ruflin/elastica": "^7",
|
||||||
|
"swiftmailer/swiftmailer": "^5.3|^6.0",
|
||||||
|
"symfony/mailer": "^5.4 || ^6",
|
||||||
|
"symfony/mime": "^5.4 || ^6"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
|
||||||
|
"doctrine/couchdb": "Allow sending log messages to a CouchDB server",
|
||||||
|
"elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
|
||||||
|
"ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
|
||||||
|
"ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",
|
||||||
|
"ext-mbstring": "Allow to work properly with unicode symbols",
|
||||||
|
"ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
|
||||||
|
"ext-openssl": "Required to send log messages using SSL",
|
||||||
|
"ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",
|
||||||
|
"graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
|
||||||
|
"mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
|
||||||
|
"php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
|
||||||
|
"rollbar/rollbar": "Allow sending log messages to Rollbar",
|
||||||
|
"ruflin/elastica": "Allow sending log messages to an Elastic Search server"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-main": "2.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Monolog\\": "src/Monolog"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Jordi Boggiano",
|
||||||
|
"email": "j.boggiano@seld.be",
|
||||||
|
"homepage": "https://seld.be"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Sends your logs to files, sockets, inboxes, databases and various web services",
|
||||||
|
"homepage": "https://github.com/Seldaek/monolog",
|
||||||
|
"keywords": [
|
||||||
|
"log",
|
||||||
|
"logging",
|
||||||
|
"psr-3"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/Seldaek/monolog/issues",
|
||||||
|
"source": "https://github.com/Seldaek/monolog/tree/2.10.0"
|
||||||
|
},
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"url": "https://github.com/Seldaek",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
|
||||||
|
"type": "tidelift"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"time": "2024-11-12T12:43:37+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "nikic/fast-route",
|
||||||
|
"version": "v1.3.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/nikic/FastRoute.git",
|
||||||
|
"reference": "181d480e08d9476e61381e04a71b34dc0432e812"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812",
|
||||||
|
"reference": "181d480e08d9476e61381e04a71b34dc0432e812",
|
||||||
|
"shasum": "",
|
||||||
|
"mirrors": [
|
||||||
|
{
|
||||||
|
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
|
||||||
|
"preferred": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.4.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^4.8.35|~5.7"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"files": [
|
||||||
|
"src/functions.php"
|
||||||
|
],
|
||||||
|
"psr-4": {
|
||||||
|
"FastRoute\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Nikita Popov",
|
||||||
|
"email": "nikic@php.net"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Fast request router for PHP",
|
||||||
|
"keywords": [
|
||||||
|
"router",
|
||||||
|
"routing"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/nikic/FastRoute/issues",
|
||||||
|
"source": "https://github.com/nikic/FastRoute/tree/master"
|
||||||
|
},
|
||||||
|
"time": "2018-02-13T20:26:39+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "psr/container",
|
||||||
|
"version": "2.0.2",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/php-fig/container.git",
|
||||||
|
"reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
|
||||||
|
"reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
|
||||||
|
"shasum": "",
|
||||||
|
"mirrors": [
|
||||||
|
{
|
||||||
|
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
|
||||||
|
"preferred": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=7.4.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Psr\\Container\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "PHP-FIG",
|
||||||
|
"homepage": "https://www.php-fig.org/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Common Container Interface (PHP FIG PSR-11)",
|
||||||
|
"homepage": "https://github.com/php-fig/container",
|
||||||
|
"keywords": [
|
||||||
|
"PSR-11",
|
||||||
|
"container",
|
||||||
|
"container-interface",
|
||||||
|
"container-interop",
|
||||||
|
"psr"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/php-fig/container/issues",
|
||||||
|
"source": "https://github.com/php-fig/container/tree/2.0.2"
|
||||||
|
},
|
||||||
|
"time": "2021-11-05T16:47:00+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "psr/log",
|
||||||
|
"version": "3.0.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/php-fig/log.git",
|
||||||
|
"reference": "79dff0b268932c640297f5208d6298f71855c03e"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/php-fig/log/zipball/79dff0b268932c640297f5208d6298f71855c03e",
|
||||||
|
"reference": "79dff0b268932c640297f5208d6298f71855c03e",
|
||||||
|
"shasum": "",
|
||||||
|
"mirrors": [
|
||||||
|
{
|
||||||
|
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
|
||||||
|
"preferred": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=8.0.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "3.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Psr\\Log\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "PHP-FIG",
|
||||||
|
"homepage": "https://www.php-fig.org/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Common interface for logging libraries",
|
||||||
|
"homepage": "https://github.com/php-fig/log",
|
||||||
|
"keywords": [
|
||||||
|
"log",
|
||||||
|
"psr",
|
||||||
|
"psr-3"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"source": "https://github.com/php-fig/log/tree/3.0.1"
|
||||||
|
},
|
||||||
|
"time": "2024-08-21T13:31:24+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "workerman/coroutine",
|
||||||
|
"version": "v1.1.3",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/workerman-php/coroutine.git",
|
||||||
|
"reference": "df8fc428967d512a74a8a7d80355c1d40228c9fa"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/workerman-php/coroutine/zipball/df8fc428967d512a74a8a7d80355c1d40228c9fa",
|
||||||
|
"reference": "df8fc428967d512a74a8a7d80355c1d40228c9fa",
|
||||||
|
"shasum": "",
|
||||||
|
"mirrors": [
|
||||||
|
{
|
||||||
|
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
|
||||||
|
"preferred": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=8.1"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^11.0",
|
||||||
|
"psr/log": "*"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Workerman\\": "src",
|
||||||
|
"Workerman\\Coroutine\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"description": "Workerman coroutine",
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/workerman-php/coroutine/issues",
|
||||||
|
"source": "https://github.com/workerman-php/coroutine/tree/v1.1.3"
|
||||||
|
},
|
||||||
|
"time": "2025-02-17T03:34:21+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "workerman/webman-framework",
|
||||||
|
"version": "v2.1.2",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/walkor/webman-framework.git",
|
||||||
|
"reference": "f803bd867f07bb0929faef060b59a19a44186bfc"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/walkor/webman-framework/zipball/f803bd867f07bb0929faef060b59a19a44186bfc",
|
||||||
|
"reference": "f803bd867f07bb0929faef060b59a19a44186bfc",
|
||||||
|
"shasum": "",
|
||||||
|
"mirrors": [
|
||||||
|
{
|
||||||
|
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
|
||||||
|
"preferred": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-json": "*",
|
||||||
|
"nikic/fast-route": "^1.3",
|
||||||
|
"php": ">=8.1",
|
||||||
|
"psr/container": ">=1.0",
|
||||||
|
"psr/log": "^3.0",
|
||||||
|
"workerman/workerman": "^5.1 || dev-master"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-event": "For better performance. "
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"files": [
|
||||||
|
"./src/support/helpers.php"
|
||||||
|
],
|
||||||
|
"psr-4": {
|
||||||
|
"Webman\\": "./src",
|
||||||
|
"Support\\": "./src/support",
|
||||||
|
"support\\": "./src/support",
|
||||||
|
"Support\\View\\": "./src/support/view",
|
||||||
|
"Support\\Bootstrap\\": "./src/support/bootstrap",
|
||||||
|
"Support\\Exception\\": "./src/support/exception"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "walkor",
|
||||||
|
"email": "walkor@workerman.net",
|
||||||
|
"homepage": "https://www.workerman.net",
|
||||||
|
"role": "Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "High performance HTTP Service Framework.",
|
||||||
|
"homepage": "https://www.workerman.net",
|
||||||
|
"keywords": [
|
||||||
|
"High Performance",
|
||||||
|
"http service"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"email": "walkor@workerman.net",
|
||||||
|
"forum": "https://wenda.workerman.net/",
|
||||||
|
"issues": "https://github.com/walkor/webman/issues",
|
||||||
|
"source": "https://github.com/walkor/webman-framework",
|
||||||
|
"wiki": "https://doc.workerman.net/"
|
||||||
|
},
|
||||||
|
"time": "2025-03-10T11:52:22+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "workerman/workerman",
|
||||||
|
"version": "v5.1.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/walkor/workerman.git",
|
||||||
|
"reference": "5ce17bc71dfdad0e9eba8cd658342da793d2f581"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/walkor/workerman/zipball/5ce17bc71dfdad0e9eba8cd658342da793d2f581",
|
||||||
|
"reference": "5ce17bc71dfdad0e9eba8cd658342da793d2f581",
|
||||||
|
"shasum": "",
|
||||||
|
"mirrors": [
|
||||||
|
{
|
||||||
|
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
|
||||||
|
"preferred": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-json": "*",
|
||||||
|
"php": ">=8.1",
|
||||||
|
"workerman/coroutine": "^1.1 || dev-main"
|
||||||
|
},
|
||||||
|
"conflict": {
|
||||||
|
"ext-swow": "<v1.0.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"guzzlehttp/guzzle": "^7.0",
|
||||||
|
"mockery/mockery": "^1.6",
|
||||||
|
"pestphp/pest": "2.x-dev",
|
||||||
|
"phpstan/phpstan": "1.11.x-dev"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-event": "For better performance. "
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Workerman\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "walkor",
|
||||||
|
"email": "walkor@workerman.net",
|
||||||
|
"homepage": "https://www.workerman.net",
|
||||||
|
"role": "Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "An asynchronous event driven PHP framework for easily building fast, scalable network applications.",
|
||||||
|
"homepage": "https://www.workerman.net",
|
||||||
|
"keywords": [
|
||||||
|
"asynchronous",
|
||||||
|
"event-loop",
|
||||||
|
"framework",
|
||||||
|
"http"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"email": "walkor@workerman.net",
|
||||||
|
"forum": "https://www.workerman.net/questions",
|
||||||
|
"issues": "https://github.com/walkor/workerman/issues",
|
||||||
|
"source": "https://github.com/walkor/workerman",
|
||||||
|
"wiki": "https://www.workerman.net/doc/workerman/"
|
||||||
|
},
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"url": "https://opencollective.com/workerman",
|
||||||
|
"type": "open_collective"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://www.patreon.com/walkor",
|
||||||
|
"type": "patreon"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"time": "2025-02-05T14:25:44+00:00"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"packages-dev": [],
|
||||||
|
"aliases": [],
|
||||||
|
"minimum-stability": "dev",
|
||||||
|
"stability-flags": [],
|
||||||
|
"prefer-stable": true,
|
||||||
|
"prefer-lowest": false,
|
||||||
|
"platform": {
|
||||||
|
"php": ">=8.1"
|
||||||
|
},
|
||||||
|
"platform-dev": [],
|
||||||
|
"plugin-api-version": "2.6.0"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of webman.
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @author walkor<walkor@workerman.net>
|
||||||
|
* @copyright walkor<walkor@workerman.net>
|
||||||
|
* @link http://www.workerman.net/
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
use support\Request;
|
||||||
|
|
||||||
|
return [
|
||||||
|
'debug' => true,
|
||||||
|
'error_reporting' => E_ALL,
|
||||||
|
'default_timezone' => 'Asia/Shanghai',
|
||||||
|
'request_class' => Request::class,
|
||||||
|
'public_path' => base_path() . DIRECTORY_SEPARATOR . 'public',
|
||||||
|
'runtime_path' => base_path(false) . DIRECTORY_SEPARATOR . 'runtime',
|
||||||
|
'controller_suffix' => 'Controller',
|
||||||
|
'controller_reuse' => false,
|
||||||
|
];
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of webman.
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @author walkor<walkor@workerman.net>
|
||||||
|
* @copyright walkor<walkor@workerman.net>
|
||||||
|
* @link http://www.workerman.net/
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'files' => [
|
||||||
|
base_path() . '/app/functions.php',
|
||||||
|
base_path() . '/support/Request.php',
|
||||||
|
base_path() . '/support/Response.php',
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of webman.
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @author walkor<walkor@workerman.net>
|
||||||
|
* @copyright walkor<walkor@workerman.net>
|
||||||
|
* @link http://www.workerman.net/
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
support\bootstrap\Session::class,
|
||||||
|
];
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of webman.
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @author walkor<walkor@workerman.net>
|
||||||
|
* @copyright walkor<walkor@workerman.net>
|
||||||
|
* @link http://www.workerman.net/
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
return new Webman\Container;
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of webman.
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @author walkor<walkor@workerman.net>
|
||||||
|
* @copyright walkor<walkor@workerman.net>
|
||||||
|
* @link http://www.workerman.net/
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [];
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of webman.
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @author walkor<walkor@workerman.net>
|
||||||
|
* @copyright walkor<walkor@workerman.net>
|
||||||
|
* @link http://www.workerman.net/
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'' => support\exception\Handler::class,
|
||||||
|
];
|
||||||
|
|
@ -0,0 +1,32 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of webman.
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @author walkor<walkor@workerman.net>
|
||||||
|
* @copyright walkor<walkor@workerman.net>
|
||||||
|
* @link http://www.workerman.net/
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'default' => [
|
||||||
|
'handlers' => [
|
||||||
|
[
|
||||||
|
'class' => Monolog\Handler\RotatingFileHandler::class,
|
||||||
|
'constructor' => [
|
||||||
|
runtime_path() . '/logs/webman.log',
|
||||||
|
7, //$maxFiles
|
||||||
|
Monolog\Logger::DEBUG,
|
||||||
|
],
|
||||||
|
'formatter' => [
|
||||||
|
'class' => Monolog\Formatter\LineFormatter::class,
|
||||||
|
'constructor' => [null, 'Y-m-d H:i:s', true],
|
||||||
|
],
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of webman.
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @author walkor<walkor@workerman.net>
|
||||||
|
* @copyright walkor<walkor@workerman.net>
|
||||||
|
* @link http://www.workerman.net/
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [];
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of webman.
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @author walkor<walkor@workerman.net>
|
||||||
|
* @copyright walkor<walkor@workerman.net>
|
||||||
|
* @link http://www.workerman.net/
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
use support\Log;
|
||||||
|
use support\Request;
|
||||||
|
use app\process\Http;
|
||||||
|
|
||||||
|
global $argv;
|
||||||
|
|
||||||
|
return [
|
||||||
|
'webman' => [
|
||||||
|
'handler' => Http::class,
|
||||||
|
'listen' => 'http://0.0.0.0:8787',
|
||||||
|
'count' => cpu_count() * 4,
|
||||||
|
'user' => '',
|
||||||
|
'group' => '',
|
||||||
|
'reusePort' => false,
|
||||||
|
// 'eventLoop' => '',
|
||||||
|
'eventLoop' => \Workerman\Events\Swoole::class,
|
||||||
|
'context' => [],
|
||||||
|
'constructor' => [
|
||||||
|
'requestClass' => Request::class,
|
||||||
|
'logger' => Log::channel('default'),
|
||||||
|
'appPath' => app_path(),
|
||||||
|
'publicPath' => public_path()
|
||||||
|
]
|
||||||
|
],
|
||||||
|
// File update detection and automatic reload
|
||||||
|
'monitor' => [
|
||||||
|
'handler' => app\process\Monitor::class,
|
||||||
|
'reloadable' => false,
|
||||||
|
'constructor' => [
|
||||||
|
// Monitor these directories
|
||||||
|
'monitorDir' => array_merge([
|
||||||
|
app_path(),
|
||||||
|
config_path(),
|
||||||
|
base_path() . '/process',
|
||||||
|
base_path() . '/support',
|
||||||
|
base_path() . '/resource',
|
||||||
|
base_path() . '/.env',
|
||||||
|
], glob(base_path() . '/plugin/*/app'), glob(base_path() . '/plugin/*/config'), glob(base_path() . '/plugin/*/api')),
|
||||||
|
// Files with these suffixes will be monitored
|
||||||
|
'monitorExtensions' => [
|
||||||
|
'php', 'html', 'htm', 'env'
|
||||||
|
],
|
||||||
|
'options' => [
|
||||||
|
'enable_file_monitor' => !in_array('-d', $argv) && DIRECTORY_SEPARATOR === '/',
|
||||||
|
'enable_memory_monitor' => DIRECTORY_SEPARATOR === '/',
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of webman.
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @author walkor<walkor@workerman.net>
|
||||||
|
* @copyright walkor<walkor@workerman.net>
|
||||||
|
* @link http://www.workerman.net/
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
use Webman\Route;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of webman.
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @author walkor<walkor@workerman.net>
|
||||||
|
* @copyright walkor<walkor@workerman.net>
|
||||||
|
* @link http://www.workerman.net/
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'event_loop' => '',
|
||||||
|
'stop_timeout' => 2,
|
||||||
|
'pid_file' => runtime_path() . '/webman.pid',
|
||||||
|
'status_file' => runtime_path() . '/webman.status',
|
||||||
|
'stdout_file' => runtime_path() . '/logs/stdout.log',
|
||||||
|
'log_file' => runtime_path() . '/logs/workerman.log',
|
||||||
|
'max_package_size' => 10 * 1024 * 1024
|
||||||
|
];
|
||||||
|
|
@ -0,0 +1,65 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of webman.
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @author walkor<walkor@workerman.net>
|
||||||
|
* @copyright walkor<walkor@workerman.net>
|
||||||
|
* @link http://www.workerman.net/
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
use Webman\Session\FileSessionHandler;
|
||||||
|
use Webman\Session\RedisSessionHandler;
|
||||||
|
use Webman\Session\RedisClusterSessionHandler;
|
||||||
|
|
||||||
|
return [
|
||||||
|
|
||||||
|
'type' => 'file', // or redis or redis_cluster
|
||||||
|
|
||||||
|
'handler' => FileSessionHandler::class,
|
||||||
|
|
||||||
|
'config' => [
|
||||||
|
'file' => [
|
||||||
|
'save_path' => runtime_path() . '/sessions',
|
||||||
|
],
|
||||||
|
'redis' => [
|
||||||
|
'host' => '127.0.0.1',
|
||||||
|
'port' => 6379,
|
||||||
|
'auth' => '',
|
||||||
|
'timeout' => 2,
|
||||||
|
'database' => '',
|
||||||
|
'prefix' => 'redis_session_',
|
||||||
|
],
|
||||||
|
'redis_cluster' => [
|
||||||
|
'host' => ['127.0.0.1:7000', '127.0.0.1:7001', '127.0.0.1:7001'],
|
||||||
|
'timeout' => 2,
|
||||||
|
'auth' => '',
|
||||||
|
'prefix' => 'redis_session_',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
|
||||||
|
'session_name' => 'PHPSID',
|
||||||
|
|
||||||
|
'auto_update_timestamp' => false,
|
||||||
|
|
||||||
|
'lifetime' => 7*24*60*60,
|
||||||
|
|
||||||
|
'cookie_lifetime' => 365*24*60*60,
|
||||||
|
|
||||||
|
'cookie_path' => '/',
|
||||||
|
|
||||||
|
'domain' => '',
|
||||||
|
|
||||||
|
'http_only' => true,
|
||||||
|
|
||||||
|
'secure' => false,
|
||||||
|
|
||||||
|
'same_site' => '',
|
||||||
|
|
||||||
|
'gc_probability' => [1, 1000],
|
||||||
|
|
||||||
|
];
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of webman.
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @author walkor<walkor@workerman.net>
|
||||||
|
* @copyright walkor<walkor@workerman.net>
|
||||||
|
* @link http://www.workerman.net/
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static file settings
|
||||||
|
*/
|
||||||
|
return [
|
||||||
|
'enable' => true,
|
||||||
|
'middleware' => [ // Static file Middleware
|
||||||
|
//app\middleware\StaticFile::class,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of webman.
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @author walkor<walkor@workerman.net>
|
||||||
|
* @copyright walkor<walkor@workerman.net>
|
||||||
|
* @link http://www.workerman.net/
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Multilingual configuration
|
||||||
|
*/
|
||||||
|
return [
|
||||||
|
// Default language
|
||||||
|
'locale' => 'zh_CN',
|
||||||
|
// Fallback language
|
||||||
|
'fallback_locale' => ['zh_CN', 'en'],
|
||||||
|
// Folder where language files are stored
|
||||||
|
'path' => base_path() . '/resource/translations',
|
||||||
|
];
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of webman.
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @author walkor<walkor@workerman.net>
|
||||||
|
* @copyright walkor<walkor@workerman.net>
|
||||||
|
* @link http://www.workerman.net/
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
use support\view\Raw;
|
||||||
|
use support\view\Twig;
|
||||||
|
use support\view\Blade;
|
||||||
|
use support\view\ThinkPHP;
|
||||||
|
|
||||||
|
return [
|
||||||
|
'handler' => Raw::class
|
||||||
|
];
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 4.2 KiB |
|
|
@ -0,0 +1,5 @@
|
||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
chdir(__DIR__);
|
||||||
|
require_once __DIR__ . '/vendor/autoload.php';
|
||||||
|
support\App::run();
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of webman.
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @author walkor<walkor@workerman.net>
|
||||||
|
* @copyright walkor<walkor@workerman.net>
|
||||||
|
* @link http://www.workerman.net/
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace support;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Request
|
||||||
|
* @package support
|
||||||
|
*/
|
||||||
|
class Request extends \Webman\Http\Request
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of webman.
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @author walkor<walkor@workerman.net>
|
||||||
|
* @copyright walkor<walkor@workerman.net>
|
||||||
|
* @link http://www.workerman.net/
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace support;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Response
|
||||||
|
* @package support
|
||||||
|
*/
|
||||||
|
class Response extends \Webman\Http\Response
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,139 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is part of webman.
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @author walkor<walkor@workerman.net>
|
||||||
|
* @copyright walkor<walkor@workerman.net>
|
||||||
|
* @link http://www.workerman.net/
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
use Dotenv\Dotenv;
|
||||||
|
use support\Log;
|
||||||
|
use Webman\Bootstrap;
|
||||||
|
use Webman\Config;
|
||||||
|
use Webman\Middleware;
|
||||||
|
use Webman\Route;
|
||||||
|
use Webman\Util;
|
||||||
|
use Workerman\Events\Select;
|
||||||
|
use Workerman\Worker;
|
||||||
|
|
||||||
|
$worker = $worker ?? null;
|
||||||
|
|
||||||
|
if (empty(Worker::$eventLoopClass)) {
|
||||||
|
Worker::$eventLoopClass = Select::class;
|
||||||
|
}
|
||||||
|
|
||||||
|
set_error_handler(function ($level, $message, $file = '', $line = 0) {
|
||||||
|
if (error_reporting() & $level) {
|
||||||
|
throw new ErrorException($message, 0, $level, $file, $line);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if ($worker) {
|
||||||
|
register_shutdown_function(function ($startTime) {
|
||||||
|
if (time() - $startTime <= 0.1) {
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
}, time());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (class_exists('Dotenv\Dotenv') && file_exists(base_path(false) . '/.env')) {
|
||||||
|
if (method_exists('Dotenv\Dotenv', 'createUnsafeMutable')) {
|
||||||
|
Dotenv::createUnsafeMutable(base_path(false))->load();
|
||||||
|
} else {
|
||||||
|
Dotenv::createMutable(base_path(false))->load();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Config::clear();
|
||||||
|
support\App::loadAllConfig(['route']);
|
||||||
|
if ($timezone = config('app.default_timezone')) {
|
||||||
|
date_default_timezone_set($timezone);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (config('autoload.files', []) as $file) {
|
||||||
|
include_once $file;
|
||||||
|
}
|
||||||
|
foreach (config('plugin', []) as $firm => $projects) {
|
||||||
|
foreach ($projects as $name => $project) {
|
||||||
|
if (!is_array($project)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
foreach ($project['autoload']['files'] ?? [] as $file) {
|
||||||
|
include_once $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach ($projects['autoload']['files'] ?? [] as $file) {
|
||||||
|
include_once $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Middleware::load(config('middleware', []));
|
||||||
|
foreach (config('plugin', []) as $firm => $projects) {
|
||||||
|
foreach ($projects as $name => $project) {
|
||||||
|
if (!is_array($project) || $name === 'static') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Middleware::load($project['middleware'] ?? []);
|
||||||
|
}
|
||||||
|
Middleware::load($projects['middleware'] ?? [], $firm);
|
||||||
|
if ($staticMiddlewares = config("plugin.$firm.static.middleware")) {
|
||||||
|
Middleware::load(['__static__' => $staticMiddlewares], $firm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Middleware::load(['__static__' => config('static.middleware', [])]);
|
||||||
|
|
||||||
|
foreach (config('bootstrap', []) as $className) {
|
||||||
|
if (!class_exists($className)) {
|
||||||
|
$log = "Warning: Class $className setting in config/bootstrap.php not found\r\n";
|
||||||
|
echo $log;
|
||||||
|
Log::error($log);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/** @var Bootstrap $className */
|
||||||
|
$className::start($worker);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (config('plugin', []) as $firm => $projects) {
|
||||||
|
foreach ($projects as $name => $project) {
|
||||||
|
if (!is_array($project)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
foreach ($project['bootstrap'] ?? [] as $className) {
|
||||||
|
if (!class_exists($className)) {
|
||||||
|
$log = "Warning: Class $className setting in config/plugin/$firm/$name/bootstrap.php not found\r\n";
|
||||||
|
echo $log;
|
||||||
|
Log::error($log);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/** @var Bootstrap $className */
|
||||||
|
$className::start($worker);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach ($projects['bootstrap'] ?? [] as $className) {
|
||||||
|
/** @var string $className */
|
||||||
|
if (!class_exists($className)) {
|
||||||
|
$log = "Warning: Class $className setting in plugin/$firm/config/bootstrap.php not found\r\n";
|
||||||
|
echo $log;
|
||||||
|
Log::error($log);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/** @var Bootstrap $className */
|
||||||
|
$className::start($worker);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$directory = base_path() . '/plugin';
|
||||||
|
$paths = [config_path()];
|
||||||
|
foreach (Util::scanDir($directory) as $path) {
|
||||||
|
if (is_dir($path = "$path/config")) {
|
||||||
|
$paths[] = $path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Route::load($paths);
|
||||||
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
CHCP 65001
|
||||||
|
php windows.php
|
||||||
|
pause
|
||||||
|
|
@ -0,0 +1,136 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Start file for windows
|
||||||
|
*/
|
||||||
|
chdir(__DIR__);
|
||||||
|
require_once __DIR__ . '/vendor/autoload.php';
|
||||||
|
|
||||||
|
use Dotenv\Dotenv;
|
||||||
|
use support\App;
|
||||||
|
use Workerman\Worker;
|
||||||
|
|
||||||
|
ini_set('display_errors', 'on');
|
||||||
|
error_reporting(E_ALL);
|
||||||
|
|
||||||
|
if (class_exists('Dotenv\Dotenv') && file_exists(base_path() . '/.env')) {
|
||||||
|
if (method_exists('Dotenv\Dotenv', 'createUnsafeImmutable')) {
|
||||||
|
Dotenv::createUnsafeImmutable(base_path())->load();
|
||||||
|
} else {
|
||||||
|
Dotenv::createMutable(base_path())->load();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
App::loadAllConfig(['route']);
|
||||||
|
|
||||||
|
$errorReporting = config('app.error_reporting');
|
||||||
|
if (isset($errorReporting)) {
|
||||||
|
error_reporting($errorReporting);
|
||||||
|
}
|
||||||
|
|
||||||
|
$runtimeProcessPath = runtime_path() . DIRECTORY_SEPARATOR . '/windows';
|
||||||
|
$paths = [
|
||||||
|
$runtimeProcessPath,
|
||||||
|
runtime_path('logs'),
|
||||||
|
runtime_path('views')
|
||||||
|
];
|
||||||
|
foreach ($paths as $path) {
|
||||||
|
if (!is_dir($path)) {
|
||||||
|
mkdir($path, 0777, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$processFiles = [];
|
||||||
|
if (config('server.listen')) {
|
||||||
|
$processFiles[] = __DIR__ . DIRECTORY_SEPARATOR . 'start.php';
|
||||||
|
}
|
||||||
|
foreach (config('process', []) as $processName => $config) {
|
||||||
|
$processFiles[] = write_process_file($runtimeProcessPath, $processName, '');
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (config('plugin', []) as $firm => $projects) {
|
||||||
|
foreach ($projects as $name => $project) {
|
||||||
|
if (!is_array($project)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
foreach ($project['process'] ?? [] as $processName => $config) {
|
||||||
|
$processFiles[] = write_process_file($runtimeProcessPath, $processName, "$firm.$name");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach ($projects['process'] ?? [] as $processName => $config) {
|
||||||
|
$processFiles[] = write_process_file($runtimeProcessPath, $processName, $firm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function write_process_file($runtimeProcessPath, $processName, $firm): string
|
||||||
|
{
|
||||||
|
$processParam = $firm ? "plugin.$firm.$processName" : $processName;
|
||||||
|
$configParam = $firm ? "config('plugin.$firm.process')['$processName']" : "config('process')['$processName']";
|
||||||
|
$fileContent = <<<EOF
|
||||||
|
<?php
|
||||||
|
require_once __DIR__ . '/../../vendor/autoload.php';
|
||||||
|
|
||||||
|
use Workerman\Worker;
|
||||||
|
use Workerman\Connection\TcpConnection;
|
||||||
|
use Webman\Config;
|
||||||
|
use support\App;
|
||||||
|
|
||||||
|
ini_set('display_errors', 'on');
|
||||||
|
error_reporting(E_ALL);
|
||||||
|
|
||||||
|
if (is_callable('opcache_reset')) {
|
||||||
|
opcache_reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!\$appConfigFile = config_path('app.php')) {
|
||||||
|
throw new RuntimeException('Config file not found: app.php');
|
||||||
|
}
|
||||||
|
\$appConfig = require \$appConfigFile;
|
||||||
|
if (\$timezone = \$appConfig['default_timezone'] ?? '') {
|
||||||
|
date_default_timezone_set(\$timezone);
|
||||||
|
}
|
||||||
|
|
||||||
|
App::loadAllConfig(['route']);
|
||||||
|
|
||||||
|
worker_start('$processParam', $configParam);
|
||||||
|
|
||||||
|
if (DIRECTORY_SEPARATOR != "/") {
|
||||||
|
Worker::\$logFile = config('server')['log_file'] ?? Worker::\$logFile;
|
||||||
|
TcpConnection::\$defaultMaxPackageSize = config('server')['max_package_size'] ?? 10*1024*1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
Worker::runAll();
|
||||||
|
|
||||||
|
EOF;
|
||||||
|
$processFile = $runtimeProcessPath . DIRECTORY_SEPARATOR . "start_$processParam.php";
|
||||||
|
file_put_contents($processFile, $fileContent);
|
||||||
|
return $processFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($monitorConfig = config('process.monitor.constructor')) {
|
||||||
|
$monitorHandler = config('process.monitor.handler');
|
||||||
|
$monitor = new $monitorHandler(...array_values($monitorConfig));
|
||||||
|
}
|
||||||
|
|
||||||
|
function popen_processes($processFiles)
|
||||||
|
{
|
||||||
|
$cmd = '"' . PHP_BINARY . '" ' . implode(' ', $processFiles);
|
||||||
|
$descriptorspec = [STDIN, STDOUT, STDOUT];
|
||||||
|
$resource = proc_open($cmd, $descriptorspec, $pipes, null, null, ['bypass_shell' => true]);
|
||||||
|
if (!$resource) {
|
||||||
|
exit("Can not execute $cmd\r\n");
|
||||||
|
}
|
||||||
|
return $resource;
|
||||||
|
}
|
||||||
|
|
||||||
|
$resource = popen_processes($processFiles);
|
||||||
|
echo "\r\n";
|
||||||
|
while (1) {
|
||||||
|
sleep(1);
|
||||||
|
if (!empty($monitor) && $monitor->checkAllFilesChange()) {
|
||||||
|
$status = proc_get_status($resource);
|
||||||
|
$pid = $status['pid'];
|
||||||
|
shell_exec("taskkill /F /T /PID $pid");
|
||||||
|
proc_close($resource);
|
||||||
|
$resource = popen_processes($processFiles);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue