Zory 3 viikkoa sitten
vanhempi
sitoutus
a30513060a
100 muutettua tiedostoa jossa 11148 lisäystä ja 1 poistoa
  1. BIN
      .DS_Store
  2. 21 0
      LICENSE
  3. 69 1
      README.md
  4. 50 0
      app/command/ShopwwiAuthCommand.php
  5. 42 0
      app/controller/IndexController.php
  6. 4 0
      app/functions.php
  7. 42 0
      app/middleware/StaticFile.php
  8. 29 0
      app/model/Test.php
  9. 10 0
      app/process/Http.php
  10. 305 0
      app/process/Monitor.php
  11. 14 0
      app/view/index/view.html
  12. 79 0
      composer.json
  13. 4883 0
      composer.lock
  14. 26 0
      config/app.php
  15. 21 0
      config/autoload.php
  16. 18 0
      config/bootstrap.php
  17. 15 0
      config/container.php
  18. 15 0
      config/dependence.php
  19. 5 0
      config/event.php
  20. 17 0
      config/exception.php
  21. 32 0
      config/log.php
  22. 15 0
      config/middleware.php
  23. 32 0
      config/plugin/hhink/webman-sms/app.php
  24. 35 0
      config/plugin/linfly/annotation/annotation.php
  25. 4 0
      config/plugin/linfly/annotation/app.php
  26. 19 0
      config/plugin/linfly/annotation/bootstrap.php
  27. 17 0
      config/plugin/linfly/annotation/route.php
  28. 71 0
      config/plugin/shopwwi/auth/app.php
  29. 11 0
      config/plugin/tinywan/captcha/app.php
  30. 76 0
      config/plugin/tinywan/storage/app.php
  31. 24 0
      config/plugin/webman/console/app.php
  32. 4 0
      config/plugin/webman/event/app.php
  33. 17 0
      config/plugin/webman/event/bootstrap.php
  34. 7 0
      config/plugin/webman/event/command.php
  35. 14 0
      config/plugin/webman/rate-limiter/app.php
  36. 17 0
      config/plugin/webman/rate-limiter/bootstrap.php
  37. 8 0
      config/plugin/webman/rate-limiter/middleware.php
  38. 4 0
      config/plugin/webman/redis-queue/app.php
  39. 7 0
      config/plugin/webman/redis-queue/command.php
  40. 32 0
      config/plugin/webman/redis-queue/log.php
  41. 11 0
      config/plugin/webman/redis-queue/process.php
  42. 21 0
      config/plugin/webman/redis-queue/redis.php
  43. 62 0
      config/process.php
  44. 29 0
      config/redis.php
  45. 21 0
      config/route.php
  46. 23 0
      config/server.php
  47. 65 0
      config/session.php
  48. 23 0
      config/static.php
  49. 38 0
      config/think-cache.php
  50. 42 0
      config/think-orm.php
  51. 25 0
      config/translation.php
  52. 22 0
      config/view.php
  53. BIN
      public/favicon.ico
  54. 4 0
      runtime/.gitignore
  55. 2 0
      runtime/logs/.gitignore
  56. 2 0
      runtime/views/.gitignore
  57. 5 0
      start.php
  58. 24 0
      support/Request.php
  59. 24 0
      support/Response.php
  60. 139 0
      support/bootstrap.php
  61. 2 0
      vendor/aliyuncs/oss-sdk-php/.coveralls.yml
  62. 8 0
      vendor/aliyuncs/oss-sdk-php/.gitignore
  63. 21 0
      vendor/aliyuncs/oss-sdk-php/.travis.yml
  64. 159 0
      vendor/aliyuncs/oss-sdk-php/CHANGELOG.md
  65. 21 0
      vendor/aliyuncs/oss-sdk-php/LICENSE.md
  66. 149 0
      vendor/aliyuncs/oss-sdk-php/README-CN.md
  67. 150 0
      vendor/aliyuncs/oss-sdk-php/README.md
  68. 11 0
      vendor/aliyuncs/oss-sdk-php/autoload.php
  69. 13 0
      vendor/aliyuncs/oss-sdk-php/build-phar.sh
  70. 24 0
      vendor/aliyuncs/oss-sdk-php/composer.json
  71. BIN
      vendor/aliyuncs/oss-sdk-php/example.jpg
  72. 3 0
      vendor/aliyuncs/oss-sdk-php/index.php
  73. 19 0
      vendor/aliyuncs/oss-sdk-php/phpunit.xml
  74. 254 0
      vendor/aliyuncs/oss-sdk-php/samples/Bucket.php
  75. 91 0
      vendor/aliyuncs/oss-sdk-php/samples/BucketCname.php
  76. 171 0
      vendor/aliyuncs/oss-sdk-php/samples/BucketCors.php
  77. 98 0
      vendor/aliyuncs/oss-sdk-php/samples/BucketEncryption.php
  78. 109 0
      vendor/aliyuncs/oss-sdk-php/samples/BucketLifecycle.php
  79. 95 0
      vendor/aliyuncs/oss-sdk-php/samples/BucketLogging.php
  80. 116 0
      vendor/aliyuncs/oss-sdk-php/samples/BucketPayment.php
  81. 123 0
      vendor/aliyuncs/oss-sdk-php/samples/BucketPolicy.php
  82. 101 0
      vendor/aliyuncs/oss-sdk-php/samples/BucketReferer.php
  83. 65 0
      vendor/aliyuncs/oss-sdk-php/samples/BucketStat.php
  84. 112 0
      vendor/aliyuncs/oss-sdk-php/samples/BucketTags.php
  85. 61 0
      vendor/aliyuncs/oss-sdk-php/samples/BucketTransferAcceleration.php
  86. 235 0
      vendor/aliyuncs/oss-sdk-php/samples/BucketVersion.php
  87. 92 0
      vendor/aliyuncs/oss-sdk-php/samples/BucketWebsite.php
  88. 145 0
      vendor/aliyuncs/oss-sdk-php/samples/BucketWorm.php
  89. 83 0
      vendor/aliyuncs/oss-sdk-php/samples/Callback.php
  90. 84 0
      vendor/aliyuncs/oss-sdk-php/samples/Common.php
  91. 15 0
      vendor/aliyuncs/oss-sdk-php/samples/Config.php
  92. 76 0
      vendor/aliyuncs/oss-sdk-php/samples/CredentialsPhp.php
  93. 63 0
      vendor/aliyuncs/oss-sdk-php/samples/CredentialsProvider.php
  94. 87 0
      vendor/aliyuncs/oss-sdk-php/samples/Image.php
  95. 131 0
      vendor/aliyuncs/oss-sdk-php/samples/LiveChannel.php
  96. 182 0
      vendor/aliyuncs/oss-sdk-php/samples/MultipartUpload.php
  97. 765 0
      vendor/aliyuncs/oss-sdk-php/samples/Object.php
  98. 366 0
      vendor/aliyuncs/oss-sdk-php/samples/ObjectTagging.php
  99. 13 0
      vendor/aliyuncs/oss-sdk-php/samples/RunAll.php
  100. 142 0
      vendor/aliyuncs/oss-sdk-php/samples/Signature.php

BIN
.DS_Store


+ 21 - 0
LICENSE

@@ -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.

+ 69 - 1
README.md

@@ -1,2 +1,70 @@
-# saas-api
+<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>
+
 

+ 50 - 0
app/command/ShopwwiAuthCommand.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace app\command;
+
+use Shopwwi\WebmanAuth\Facade\Str;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Output\OutputInterface;
+
+
+class ShopwwiAuthCommand extends Command
+{
+    protected static $defaultName = 'shopwwi:auth';
+    protected static $defaultDescription = 'shopwwi auth';
+
+    /**
+     * @return void
+     */
+    protected function configure()
+    {
+        $this->addArgument('name', InputArgument::OPTIONAL, 'Name description');
+    }
+
+    /**
+     * @param InputInterface $input
+     * @param OutputInterface $output
+     * @return int
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $name = $input->getArgument('name');
+        $output->writeln('生成jwtKey 开始');
+        $key = Str::random(64);
+        file_put_contents(base_path()."/config/plugin/shopwwi/auth/app.php", str_replace(
+            "'access_secret_key' => '".config('plugin.shopwwi.auth.app.jwt.access_secret_key')."'",
+            "'access_secret_key' => '".$key."'",
+            file_get_contents(base_path()."/config/plugin/shopwwi/auth/app.php")
+        ));
+        file_put_contents(base_path()."/config/plugin/shopwwi/auth/app.php", str_replace(
+            "'refresh_secret_key' => '".config('plugin.shopwwi.auth.app.jwt.refresh_secret_key')."'",
+            "'refresh_secret_key' => '".$key."'",
+            file_get_contents(base_path()."/config/plugin/shopwwi/auth/app.php")
+        ));
+        $output->writeln('生成jwtKey 结束'.$key);
+        return self::SUCCESS;
+    }
+
+}

+ 42 - 0
app/controller/IndexController.php

@@ -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="clipboard-write"
+  sandbox="allow-scripts allow-same-origin allow-popups"
+></iframe>
+EOF;
+    }
+
+    public function view(Request $request)
+    {
+        return view('index/view', ['name' => 'webman']);
+    }
+
+    public function json(Request $request)
+    {
+        return json(['code' => 0, 'msg' => 'ok']);
+    }
+
+}

+ 4 - 0
app/functions.php

@@ -0,0 +1,4 @@
+<?php
+/**
+ * Here is your custom functions.
+ */

+ 42 - 0
app/middleware/StaticFile.php

@@ -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;
+    }
+}

+ 29 - 0
app/model/Test.php

@@ -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;
+}

+ 10 - 0
app/process/Http.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace app\process;
+
+use Webman\App;
+
+class Http extends App
+{
+
+}

+ 305 - 0
app/process/Monitor.php

@@ -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;
+    }
+
+}

+ 14 - 0
app/view/index/view.html

@@ -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>

+ 79 - 0
composer.json

@@ -0,0 +1,79 @@
+{
+  "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",
+    "topthink/think-template": "^3.0",
+    "webman/think-orm": "^2.1",
+    "webman/think-cache": "^2.1",
+    "webman/redis": "^2.1",
+    "illuminate/events": "^12.38",
+    "webman/redis-queue": "^2.1",
+    "webman/rate-limiter": "^1.1",
+    "symfony/translation": "^7.3",
+    "intervention/image": "^3.11",
+    "webman/event": "^1.0",
+    "vlucas/phpdotenv": "^5.6",
+    "workerman/crontab": "^1.0",
+    "phpoffice/phpspreadsheet": "^5.2",
+    "webman/console": "^2.1",
+    "yzh52521/easyhttp": "^1.1",
+    "xiaosongshu/elasticsearch": "^2.0",
+    "kkokk/poster": "^3.0",
+    "linfly/annotation": "1.x",
+    "hhink/webman-sms": "^1.0",
+    "tinywan/captcha": "^0.0.4",
+    "shopwwi/webman-auth": "^2.0",
+    "tinywan/storage": "^1.1",
+    "aliyuncs/oss-sdk-php": "^2.7",
+    "qcloud/cos-sdk-v5": "^2.6"
+  },
+  "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
+}

+ 4883 - 0
composer.lock

@@ -0,0 +1,4883 @@
+{
+    "_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": "e7bc46d1b5c0f68926aaa972977f7bde",
+    "packages": [
+        {
+            "name": "aliyuncs/oss-sdk-php",
+            "version": "v2.7.2",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/aliyuncs/oss-sdk-php/v2.7.2/aliyuncs-oss-sdk-php-v2.7.2.zip",
+                "reference": "483dd0b8bff5d47f0e4ffc99f6077a295c5ccbb5",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3"
+            },
+            "require-dev": {
+                "php-coveralls/php-coveralls": "*",
+                "phpunit/phpunit": "*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "OSS\\": "src/OSS"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Aliyuncs",
+                    "homepage": "http://www.aliyun.com"
+                }
+            ],
+            "description": "Aliyun OSS SDK for PHP",
+            "homepage": "http://www.aliyun.com/product/oss/",
+            "support": {
+                "issues": "https://github.com/aliyun/aliyun-oss-php-sdk/issues",
+                "source": "https://github.com/aliyun/aliyun-oss-php-sdk/tree/v2.7.2"
+            },
+            "time": "2024-10-28T10:41:12+00:00"
+        },
+        {
+            "name": "carbonphp/carbon-doctrine-types",
+            "version": "3.2.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/carbonphp/carbon-doctrine-types/3.2.0/carbonphp-carbon-doctrine-types-3.2.0.zip",
+                "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^8.1"
+            },
+            "conflict": {
+                "doctrine/dbal": "<4.0.0 || >=5.0.0"
+            },
+            "require-dev": {
+                "doctrine/dbal": "^4.0.0",
+                "nesbot/carbon": "^2.71.0 || ^3.0.0",
+                "phpunit/phpunit": "^10.3"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Carbon\\Doctrine\\": "src/Carbon/Doctrine/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "KyleKatarn",
+                    "email": "kylekatarnls@gmail.com"
+                }
+            ],
+            "description": "Types to use Carbon in Doctrine",
+            "keywords": [
+                "carbon",
+                "date",
+                "datetime",
+                "doctrine",
+                "time"
+            ],
+            "support": {
+                "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues",
+                "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0"
+            },
+            "time": "2024-02-09T16:56:22+00:00"
+        },
+        {
+            "name": "composer/pcre",
+            "version": "3.3.2",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/composer/pcre/3.3.2/composer-pcre-3.3.2.zip",
+                "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.4 || ^8.0"
+            },
+            "conflict": {
+                "phpstan/phpstan": "<1.11.10"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "^1.12 || ^2",
+                "phpstan/phpstan-strict-rules": "^1 || ^2",
+                "phpunit/phpunit": "^8 || ^9"
+            },
+            "type": "library",
+            "extra": {
+                "phpstan": {
+                    "includes": [
+                        "extension.neon"
+                    ]
+                },
+                "branch-alias": {
+                    "dev-main": "3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Composer\\Pcre\\": "src"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                }
+            ],
+            "description": "PCRE wrapping library that offers type-safe preg_* replacements.",
+            "keywords": [
+                "PCRE",
+                "preg",
+                "regex",
+                "regular expression"
+            ],
+            "support": {
+                "issues": "https://github.com/composer/pcre/issues",
+                "source": "https://github.com/composer/pcre/tree/3.3.2"
+            },
+            "time": "2024-11-12T16:29:46+00:00"
+        },
+        {
+            "name": "doctrine/annotations",
+            "version": "1.14.4",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/doctrine/annotations/1.14.4/doctrine-annotations-1.14.4.zip",
+                "reference": "253dca476f70808a5aeed3a47cc2cc88c5cab915",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/lexer": "^1 || ^2",
+                "ext-tokenizer": "*",
+                "php": "^7.1 || ^8.0",
+                "psr/cache": "^1 || ^2 || ^3"
+            },
+            "require-dev": {
+                "doctrine/cache": "^1.11 || ^2.0",
+                "doctrine/coding-standard": "^9 || ^12",
+                "phpstan/phpstan": "~1.4.10 || ^1.10.28",
+                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+                "symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7",
+                "vimeo/psalm": "^4.30 || ^5.14"
+            },
+            "suggest": {
+                "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Guilherme Blanco",
+                    "email": "guilhermeblanco@gmail.com"
+                },
+                {
+                    "name": "Roman Borschel",
+                    "email": "roman@code-factory.org"
+                },
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de"
+                },
+                {
+                    "name": "Jonathan Wage",
+                    "email": "jonwage@gmail.com"
+                },
+                {
+                    "name": "Johannes Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "Docblock Annotations Parser",
+            "homepage": "https://www.doctrine-project.org/projects/annotations.html",
+            "keywords": [
+                "annotations",
+                "docblock",
+                "parser"
+            ],
+            "support": {
+                "issues": "https://github.com/doctrine/annotations/issues",
+                "source": "https://github.com/doctrine/annotations/tree/1.14.4"
+            },
+            "time": "2024-09-05T10:15:52+00:00"
+        },
+        {
+            "name": "doctrine/deprecations",
+            "version": "1.1.5",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/doctrine/deprecations/1.1.5/doctrine-deprecations-1.1.5.zip",
+                "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0"
+            },
+            "conflict": {
+                "phpunit/phpunit": "<=7.5 || >=13"
+            },
+            "require-dev": {
+                "doctrine/coding-standard": "^9 || ^12 || ^13",
+                "phpstan/phpstan": "1.4.10 || 2.1.11",
+                "phpstan/phpstan-phpunit": "^1.0 || ^2",
+                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12",
+                "psr/log": "^1 || ^2 || ^3"
+            },
+            "suggest": {
+                "psr/log": "Allows logging deprecations via PSR-3 logger implementation"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Deprecations\\": "src"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.",
+            "homepage": "https://www.doctrine-project.org/",
+            "support": {
+                "issues": "https://github.com/doctrine/deprecations/issues",
+                "source": "https://github.com/doctrine/deprecations/tree/1.1.5"
+            },
+            "time": "2025-04-07T20:06:18+00:00"
+        },
+        {
+            "name": "doctrine/inflector",
+            "version": "2.1.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/doctrine/inflector/2.1.0/doctrine-inflector-2.1.0.zip",
+                "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "require-dev": {
+                "doctrine/coding-standard": "^12.0 || ^13.0",
+                "phpstan/phpstan": "^1.12 || ^2.0",
+                "phpstan/phpstan-phpunit": "^1.4 || ^2.0",
+                "phpstan/phpstan-strict-rules": "^1.6 || ^2.0",
+                "phpunit/phpunit": "^8.5 || ^12.2"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Inflector\\": "src"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Guilherme Blanco",
+                    "email": "guilhermeblanco@gmail.com"
+                },
+                {
+                    "name": "Roman Borschel",
+                    "email": "roman@code-factory.org"
+                },
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de"
+                },
+                {
+                    "name": "Jonathan Wage",
+                    "email": "jonwage@gmail.com"
+                },
+                {
+                    "name": "Johannes Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.",
+            "homepage": "https://www.doctrine-project.org/projects/inflector.html",
+            "keywords": [
+                "inflection",
+                "inflector",
+                "lowercase",
+                "manipulation",
+                "php",
+                "plural",
+                "singular",
+                "strings",
+                "uppercase",
+                "words"
+            ],
+            "support": {
+                "issues": "https://github.com/doctrine/inflector/issues",
+                "source": "https://github.com/doctrine/inflector/tree/2.1.0"
+            },
+            "time": "2025-08-10T19:31:58+00:00"
+        },
+        {
+            "name": "doctrine/lexer",
+            "version": "2.1.1",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/doctrine/lexer/2.1.1/doctrine-lexer-2.1.1.zip",
+                "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/deprecations": "^1.0",
+                "php": "^7.1 || ^8.0"
+            },
+            "require-dev": {
+                "doctrine/coding-standard": "^9 || ^12",
+                "phpstan/phpstan": "^1.3",
+                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6",
+                "psalm/plugin-phpunit": "^0.18.3",
+                "vimeo/psalm": "^4.11 || ^5.21"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Common\\Lexer\\": "src"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Guilherme Blanco",
+                    "email": "guilhermeblanco@gmail.com"
+                },
+                {
+                    "name": "Roman Borschel",
+                    "email": "roman@code-factory.org"
+                },
+                {
+                    "name": "Johannes Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
+            "homepage": "https://www.doctrine-project.org/projects/lexer.html",
+            "keywords": [
+                "annotations",
+                "docblock",
+                "lexer",
+                "parser",
+                "php"
+            ],
+            "support": {
+                "issues": "https://github.com/doctrine/lexer/issues",
+                "source": "https://github.com/doctrine/lexer/tree/2.1.1"
+            },
+            "time": "2024-02-05T11:35:39+00:00"
+        },
+        {
+            "name": "elasticsearch/elasticsearch",
+            "version": "v7.17.3",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/elasticsearch/elasticsearch/v7.17.3/elasticsearch-elasticsearch-v7.17.3.zip",
+                "reference": "b8a60b4136ee31117d1aa1b19879530eb6d11efb",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": ">=1.3.7",
+                "ezimuel/ringphp": "^1.1.2",
+                "php": "^7.3 || ^8.0",
+                "psr/log": "^1|^2|^3"
+            },
+            "require-dev": {
+                "ext-yaml": "*",
+                "ext-zip": "*",
+                "mockery/mockery": "^1.2",
+                "phpstan/phpstan": "^1.10",
+                "phpunit/phpunit": "^9.3",
+                "squizlabs/php_codesniffer": "^3.4",
+                "symfony/finder": "~4.0"
+            },
+            "suggest": {
+                "ext-curl": "*",
+                "monolog/monolog": "Allows for client-level logging and tracing"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/autoload.php"
+                ],
+                "psr-4": {
+                    "Elasticsearch\\": "src/Elasticsearch/"
+                }
+            },
+            "license": [
+                "Apache-2.0",
+                "LGPL-2.1-only"
+            ],
+            "authors": [
+                {
+                    "name": "Zachary Tong"
+                },
+                {
+                    "name": "Enrico Zimuel"
+                }
+            ],
+            "description": "PHP Client for Elasticsearch",
+            "keywords": [
+                "client",
+                "elasticsearch",
+                "search"
+            ],
+            "support": {
+                "issues": "https://github.com/elastic/elasticsearch-php/issues",
+                "source": "https://github.com/elastic/elasticsearch-php/tree/v7.17.3"
+            },
+            "time": "2025-07-14T09:07:02+00:00"
+        },
+        {
+            "name": "ezimuel/guzzlestreams",
+            "version": "4.1.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/ezimuel/guzzlestreams/4.1.0/ezimuel-guzzlestreams-4.1.0.zip",
+                "reference": "903161be81e9f497cc42fb7db982404a4e6441b0",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.4.0"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "^2.1",
+                "phpunit/phpunit": "~9.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Stream\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "Fork of guzzle/streams (abandoned) to be used with elasticsearch-php",
+            "homepage": "http://guzzlephp.org/",
+            "keywords": [
+                "Guzzle",
+                "stream"
+            ],
+            "support": {
+                "source": "https://github.com/ezimuel/guzzlestreams/tree/4.1.0"
+            },
+            "time": "2025-08-05T06:44:46+00:00"
+        },
+        {
+            "name": "ezimuel/ringphp",
+            "version": "1.4.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/ezimuel/ringphp/1.4.0/ezimuel-ringphp-1.4.0.zip",
+                "reference": "bc983599ec7add50c00e420e867c403c8ed16ae7",
+                "shasum": ""
+            },
+            "require": {
+                "ezimuel/guzzlestreams": "^3.0.1 || ^4.0.0",
+                "php": ">=5.4.0",
+                "react/promise": "^2.0 || ^3.0"
+            },
+            "replace": {
+                "guzzlehttp/ringphp": "self.version"
+            },
+            "require-dev": {
+                "ext-curl": "*",
+                "phpunit/phpunit": "~9.0"
+            },
+            "suggest": {
+                "ext-curl": "Guzzle will use specific adapters if cURL is present"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Ring\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "Fork of guzzle/RingPHP (abandoned) to be used with elasticsearch-php",
+            "support": {
+                "source": "https://github.com/ezimuel/ringphp/tree/1.4.0"
+            },
+            "time": "2025-08-07T09:30:38+00:00"
+        },
+        {
+            "name": "firebase/php-jwt",
+            "version": "v6.11.1",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/firebase/php-jwt/v6.11.1/firebase-php-jwt-v6.11.1.zip",
+                "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^8.0"
+            },
+            "require-dev": {
+                "guzzlehttp/guzzle": "^7.4",
+                "phpspec/prophecy-phpunit": "^2.0",
+                "phpunit/phpunit": "^9.5",
+                "psr/cache": "^2.0||^3.0",
+                "psr/http-client": "^1.0",
+                "psr/http-factory": "^1.0"
+            },
+            "suggest": {
+                "ext-sodium": "Support EdDSA (Ed25519) signatures",
+                "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Firebase\\JWT\\": "src"
+                }
+            },
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Neuman Vong",
+                    "email": "neuman+pear@twilio.com",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Anant Narayanan",
+                    "email": "anant@php.net",
+                    "role": "Developer"
+                }
+            ],
+            "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
+            "homepage": "https://github.com/firebase/php-jwt",
+            "keywords": [
+                "jwt",
+                "php"
+            ],
+            "support": {
+                "issues": "https://github.com/firebase/php-jwt/issues",
+                "source": "https://github.com/firebase/php-jwt/tree/v6.11.1"
+            },
+            "time": "2025-04-09T20:32:01+00:00"
+        },
+        {
+            "name": "graham-campbell/result-type",
+            "version": "v1.1.3",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/graham-campbell/result-type/v1.1.3/graham-campbell-result-type-v1.1.3.zip",
+                "reference": "3ba905c11371512af9d9bdd27d99b782216b6945",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2.5 || ^8.0",
+                "phpoption/phpoption": "^1.9.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "GrahamCampbell\\ResultType\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                }
+            ],
+            "description": "An Implementation Of The Result Type",
+            "keywords": [
+                "Graham Campbell",
+                "GrahamCampbell",
+                "Result Type",
+                "Result-Type",
+                "result"
+            ],
+            "support": {
+                "issues": "https://github.com/GrahamCampbell/Result-Type/issues",
+                "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3"
+            },
+            "time": "2024-07-20T21:45:45+00:00"
+        },
+        {
+            "name": "guzzlehttp/command",
+            "version": "1.3.2",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/guzzlehttp/command/1.3.2/guzzlehttp-command-1.3.2.zip",
+                "reference": "888e74fc1d82a499c1fd6726248ed0bc0886395e",
+                "shasum": ""
+            },
+            "require": {
+                "guzzlehttp/guzzle": "^7.9.2",
+                "guzzlehttp/promises": "^1.5.3 || ^2.0.3",
+                "guzzlehttp/psr7": "^2.7.0",
+                "php": "^7.2.5 || ^8.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.8.2",
+                "phpunit/phpunit": "^8.5.19 || ^9.5.8"
+            },
+            "type": "library",
+            "extra": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": false
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Command\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Jeremy Lindblom",
+                    "email": "jeremeamia@gmail.com",
+                    "homepage": "https://github.com/jeremeamia"
+                },
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "tobias.nyholm@gmail.com",
+                    "homepage": "https://github.com/Nyholm"
+                }
+            ],
+            "description": "Provides the foundation for building command-based web service clients",
+            "support": {
+                "issues": "https://github.com/guzzle/command/issues",
+                "source": "https://github.com/guzzle/command/tree/1.3.2"
+            },
+            "time": "2025-02-04T09:56:46+00:00"
+        },
+        {
+            "name": "guzzlehttp/guzzle",
+            "version": "7.10.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/guzzlehttp/guzzle/7.10.0/guzzlehttp-guzzle-7.10.0.zip",
+                "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "guzzlehttp/promises": "^2.3",
+                "guzzlehttp/psr7": "^2.8",
+                "php": "^7.2.5 || ^8.0",
+                "psr/http-client": "^1.0",
+                "symfony/deprecation-contracts": "^2.2 || ^3.0"
+            },
+            "provide": {
+                "psr/http-client-implementation": "1.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.8.2",
+                "ext-curl": "*",
+                "guzzle/client-integration-tests": "3.0.2",
+                "php-http/message-factory": "^1.1",
+                "phpunit/phpunit": "^8.5.39 || ^9.6.20",
+                "psr/log": "^1.1 || ^2.0 || ^3.0"
+            },
+            "suggest": {
+                "ext-curl": "Required for CURL handler support",
+                "ext-intl": "Required for Internationalized Domain Name (IDN) support",
+                "psr/log": "Required for using the Log middleware"
+            },
+            "type": "library",
+            "extra": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": false
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/functions_include.php"
+                ],
+                "psr-4": {
+                    "GuzzleHttp\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Jeremy Lindblom",
+                    "email": "jeremeamia@gmail.com",
+                    "homepage": "https://github.com/jeremeamia"
+                },
+                {
+                    "name": "George Mponos",
+                    "email": "gmponos@gmail.com",
+                    "homepage": "https://github.com/gmponos"
+                },
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "tobias.nyholm@gmail.com",
+                    "homepage": "https://github.com/Nyholm"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com",
+                    "homepage": "https://github.com/sagikazarmark"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "email": "webmaster@tubo-world.de",
+                    "homepage": "https://github.com/Tobion"
+                }
+            ],
+            "description": "Guzzle is a PHP HTTP client library",
+            "keywords": [
+                "client",
+                "curl",
+                "framework",
+                "http",
+                "http client",
+                "psr-18",
+                "psr-7",
+                "rest",
+                "web service"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/guzzle/issues",
+                "source": "https://github.com/guzzle/guzzle/tree/7.10.0"
+            },
+            "time": "2025-08-23T22:36:01+00:00"
+        },
+        {
+            "name": "guzzlehttp/guzzle-services",
+            "version": "1.4.2",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/guzzlehttp/guzzle-services/1.4.2/guzzlehttp-guzzle-services-1.4.2.zip",
+                "reference": "45bfeb80d5ed072bb39e9f6ed1ec5d650edae961",
+                "shasum": ""
+            },
+            "require": {
+                "guzzlehttp/command": "^1.3.2",
+                "guzzlehttp/guzzle": "^7.9.2",
+                "guzzlehttp/psr7": "^2.7.0",
+                "guzzlehttp/uri-template": "^1.0.4",
+                "php": "^7.2.5 || ^8.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.8.2",
+                "phpunit/phpunit": "^8.5.19 || ^9.5.8"
+            },
+            "suggest": {
+                "gimler/guzzle-description-loader": "^0.0.4"
+            },
+            "type": "library",
+            "extra": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": false
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Command\\Guzzle\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Stefano Kowalke",
+                    "email": "blueduck@mail.org",
+                    "homepage": "https://github.com/Konafets"
+                },
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "tobias.nyholm@gmail.com",
+                    "homepage": "https://github.com/Nyholm"
+                }
+            ],
+            "description": "Provides an implementation of the Guzzle Command library that uses Guzzle service descriptions to describe web services, serialize requests, and parse responses into easy to use model structures.",
+            "support": {
+                "issues": "https://github.com/guzzle/guzzle-services/issues",
+                "source": "https://github.com/guzzle/guzzle-services/tree/1.4.2"
+            },
+            "time": "2025-02-04T09:59:21+00:00"
+        },
+        {
+            "name": "guzzlehttp/promises",
+            "version": "2.3.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/guzzlehttp/promises/2.3.0/guzzlehttp-promises-2.3.0.zip",
+                "reference": "481557b130ef3790cf82b713667b43030dc9c957",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2.5 || ^8.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.8.2",
+                "phpunit/phpunit": "^8.5.44 || ^9.6.25"
+            },
+            "type": "library",
+            "extra": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": false
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Promise\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "tobias.nyholm@gmail.com",
+                    "homepage": "https://github.com/Nyholm"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "email": "webmaster@tubo-world.de",
+                    "homepage": "https://github.com/Tobion"
+                }
+            ],
+            "description": "Guzzle promises library",
+            "keywords": [
+                "promise"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/promises/issues",
+                "source": "https://github.com/guzzle/promises/tree/2.3.0"
+            },
+            "time": "2025-08-22T14:34:08+00:00"
+        },
+        {
+            "name": "guzzlehttp/psr7",
+            "version": "2.8.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/guzzlehttp/psr7/2.8.0/guzzlehttp-psr7-2.8.0.zip",
+                "reference": "21dc724a0583619cd1652f673303492272778051",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2.5 || ^8.0",
+                "psr/http-factory": "^1.0",
+                "psr/http-message": "^1.1 || ^2.0",
+                "ralouphie/getallheaders": "^3.0"
+            },
+            "provide": {
+                "psr/http-factory-implementation": "1.0",
+                "psr/http-message-implementation": "1.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.8.2",
+                "http-interop/http-factory-tests": "0.9.0",
+                "phpunit/phpunit": "^8.5.44 || ^9.6.25"
+            },
+            "suggest": {
+                "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+            },
+            "type": "library",
+            "extra": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": false
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Psr7\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "George Mponos",
+                    "email": "gmponos@gmail.com",
+                    "homepage": "https://github.com/gmponos"
+                },
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "tobias.nyholm@gmail.com",
+                    "homepage": "https://github.com/Nyholm"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com",
+                    "homepage": "https://github.com/sagikazarmark"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "email": "webmaster@tubo-world.de",
+                    "homepage": "https://github.com/Tobion"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com",
+                    "homepage": "https://sagikazarmark.hu"
+                }
+            ],
+            "description": "PSR-7 message implementation that also provides common utility methods",
+            "keywords": [
+                "http",
+                "message",
+                "psr-7",
+                "request",
+                "response",
+                "stream",
+                "uri",
+                "url"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/psr7/issues",
+                "source": "https://github.com/guzzle/psr7/tree/2.8.0"
+            },
+            "time": "2025-08-23T21:21:41+00:00"
+        },
+        {
+            "name": "guzzlehttp/uri-template",
+            "version": "v1.0.5",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/guzzlehttp/uri-template/v1.0.5/guzzlehttp-uri-template-v1.0.5.zip",
+                "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2.5 || ^8.0",
+                "symfony/polyfill-php80": "^1.24"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.8.2",
+                "phpunit/phpunit": "^8.5.44 || ^9.6.25",
+                "uri-template/tests": "1.0.0"
+            },
+            "type": "library",
+            "extra": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": false
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\UriTemplate\\": "src"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "George Mponos",
+                    "email": "gmponos@gmail.com",
+                    "homepage": "https://github.com/gmponos"
+                },
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "tobias.nyholm@gmail.com",
+                    "homepage": "https://github.com/Nyholm"
+                }
+            ],
+            "description": "A polyfill class for uri_template of PHP",
+            "keywords": [
+                "guzzlehttp",
+                "uri-template"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/uri-template/issues",
+                "source": "https://github.com/guzzle/uri-template/tree/v1.0.5"
+            },
+            "time": "2025-08-22T14:27:06+00:00"
+        },
+        {
+            "name": "hhink/webman-sms",
+            "version": "v1.0.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/hhink/webman-sms/v1.0.0/hhink-webman-sms-v1.0.0.zip",
+                "reference": "91ddcd4cf26d5d5531cb5c2bc9c27ce9f2dbb237",
+                "shasum": ""
+            },
+            "require": {
+                "overtrue/easy-sms": ">=2.2.0",
+                "php": ">=7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Hhink\\WebmanSms\\": "src"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "description": "Webman plugin hhink/webman-sms",
+            "support": {
+                "issues": "https://github.com/hh-Ink/webman-sms/issues",
+                "source": "https://github.com/hh-Ink/webman-sms/tree/v1.0.0"
+            },
+            "time": "2022-09-07T08:00:40+00:00"
+        },
+        {
+            "name": "illuminate/bus",
+            "version": "v12.38.1",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/bus/v12.38.1/illuminate-bus-v12.38.1.zip",
+                "reference": "7845b735651ffb734b8b064e7d0349490adf4564",
+                "shasum": ""
+            },
+            "require": {
+                "illuminate/collections": "^12.0",
+                "illuminate/contracts": "^12.0",
+                "illuminate/pipeline": "^12.0",
+                "illuminate/support": "^12.0",
+                "php": "^8.2"
+            },
+            "suggest": {
+                "illuminate/queue": "Required to use closures when chaining jobs (^12.0)."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "12.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Illuminate\\Bus\\": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "taylor@laravel.com"
+                }
+            ],
+            "description": "The Illuminate Bus package.",
+            "homepage": "https://laravel.com",
+            "support": {
+                "issues": "https://github.com/laravel/framework/issues",
+                "source": "https://github.com/laravel/framework"
+            },
+            "time": "2025-11-04T15:31:54+00:00"
+        },
+        {
+            "name": "illuminate/collections",
+            "version": "v12.38.1",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/collections/v12.38.1/illuminate-collections-v12.38.1.zip",
+                "reference": "deb291b109b6f7fd776a3550a120771137b3c5d1",
+                "shasum": ""
+            },
+            "require": {
+                "illuminate/conditionable": "^12.0",
+                "illuminate/contracts": "^12.0",
+                "illuminate/macroable": "^12.0",
+                "php": "^8.2",
+                "symfony/polyfill-php84": "^1.33",
+                "symfony/polyfill-php85": "^1.33"
+            },
+            "suggest": {
+                "illuminate/http": "Required to convert collections to API resources (^12.0).",
+                "symfony/var-dumper": "Required to use the dump method (^7.2)."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "12.x-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "functions.php",
+                    "helpers.php"
+                ],
+                "psr-4": {
+                    "Illuminate\\Support\\": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "taylor@laravel.com"
+                }
+            ],
+            "description": "The Illuminate Collections package.",
+            "homepage": "https://laravel.com",
+            "support": {
+                "issues": "https://github.com/laravel/framework/issues",
+                "source": "https://github.com/laravel/framework"
+            },
+            "time": "2025-10-30T12:22:05+00:00"
+        },
+        {
+            "name": "illuminate/conditionable",
+            "version": "v12.38.1",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/conditionable/v12.38.1/illuminate-conditionable-v12.38.1.zip",
+                "reference": "ec677967c1f2faf90b8428919124d2184a4c9b49",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^8.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "12.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Illuminate\\Support\\": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "taylor@laravel.com"
+                }
+            ],
+            "description": "The Illuminate Conditionable package.",
+            "homepage": "https://laravel.com",
+            "support": {
+                "issues": "https://github.com/laravel/framework/issues",
+                "source": "https://github.com/laravel/framework"
+            },
+            "time": "2025-05-13T15:08:45+00:00"
+        },
+        {
+            "name": "illuminate/container",
+            "version": "v12.38.1",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/container/v12.38.1/illuminate-container-v12.38.1.zip",
+                "reference": "d6eaa8afd48dbe16b6b3c412a87479cad67eeb12",
+                "shasum": ""
+            },
+            "require": {
+                "illuminate/contracts": "^12.0",
+                "php": "^8.2",
+                "psr/container": "^1.1.1|^2.0.1",
+                "symfony/polyfill-php84": "^1.33",
+                "symfony/polyfill-php85": "^1.33"
+            },
+            "provide": {
+                "psr/container-implementation": "1.1|2.0"
+            },
+            "suggest": {
+                "illuminate/auth": "Required to use the Auth attribute",
+                "illuminate/cache": "Required to use the Cache attribute",
+                "illuminate/config": "Required to use the Config attribute",
+                "illuminate/database": "Required to use the DB attribute",
+                "illuminate/filesystem": "Required to use the Storage attribute",
+                "illuminate/log": "Required to use the Log or Context attributes"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "12.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Illuminate\\Container\\": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "taylor@laravel.com"
+                }
+            ],
+            "description": "The Illuminate Container package.",
+            "homepage": "https://laravel.com",
+            "support": {
+                "issues": "https://github.com/laravel/framework/issues",
+                "source": "https://github.com/laravel/framework"
+            },
+            "time": "2025-09-12T14:35:11+00:00"
+        },
+        {
+            "name": "illuminate/contracts",
+            "version": "v12.38.1",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/contracts/v12.38.1/illuminate-contracts-v12.38.1.zip",
+                "reference": "5ab717c8f0dd4e84be703796bbb415ccff8de57a",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^8.2",
+                "psr/container": "^1.1.1|^2.0.1",
+                "psr/simple-cache": "^1.0|^2.0|^3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "12.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Illuminate\\Contracts\\": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "taylor@laravel.com"
+                }
+            ],
+            "description": "The Illuminate Contracts package.",
+            "homepage": "https://laravel.com",
+            "support": {
+                "issues": "https://github.com/laravel/framework/issues",
+                "source": "https://github.com/laravel/framework"
+            },
+            "time": "2025-10-07T19:59:08+00:00"
+        },
+        {
+            "name": "illuminate/events",
+            "version": "v12.38.1",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/events/v12.38.1/illuminate-events-v12.38.1.zip",
+                "reference": "e0de667c68040d59a6ffc09e914536a1186870f0",
+                "shasum": ""
+            },
+            "require": {
+                "illuminate/bus": "^12.0",
+                "illuminate/collections": "^12.0",
+                "illuminate/container": "^12.0",
+                "illuminate/contracts": "^12.0",
+                "illuminate/macroable": "^12.0",
+                "illuminate/support": "^12.0",
+                "php": "^8.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "12.x-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "functions.php"
+                ],
+                "psr-4": {
+                    "Illuminate\\Events\\": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "taylor@laravel.com"
+                }
+            ],
+            "description": "The Illuminate Events package.",
+            "homepage": "https://laravel.com",
+            "support": {
+                "issues": "https://github.com/laravel/framework/issues",
+                "source": "https://github.com/laravel/framework"
+            },
+            "time": "2025-10-21T15:10:34+00:00"
+        },
+        {
+            "name": "illuminate/macroable",
+            "version": "v12.38.1",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/macroable/v12.38.1/illuminate-macroable-v12.38.1.zip",
+                "reference": "e862e5648ee34004fa56046b746f490dfa86c613",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^8.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "12.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Illuminate\\Support\\": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "taylor@laravel.com"
+                }
+            ],
+            "description": "The Illuminate Macroable package.",
+            "homepage": "https://laravel.com",
+            "support": {
+                "issues": "https://github.com/laravel/framework/issues",
+                "source": "https://github.com/laravel/framework"
+            },
+            "time": "2024-07-23T16:31:01+00:00"
+        },
+        {
+            "name": "illuminate/pipeline",
+            "version": "v12.38.1",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/pipeline/v12.38.1/illuminate-pipeline-v12.38.1.zip",
+                "reference": "b6a14c20d69a44bf0a6fba664a00d23ca71770ee",
+                "shasum": ""
+            },
+            "require": {
+                "illuminate/contracts": "^12.0",
+                "illuminate/macroable": "^12.0",
+                "illuminate/support": "^12.0",
+                "php": "^8.2"
+            },
+            "suggest": {
+                "illuminate/database": "Required to use database transactions (^12.0)."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "12.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Illuminate\\Pipeline\\": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "taylor@laravel.com"
+                }
+            ],
+            "description": "The Illuminate Pipeline package.",
+            "homepage": "https://laravel.com",
+            "support": {
+                "issues": "https://github.com/laravel/framework/issues",
+                "source": "https://github.com/laravel/framework"
+            },
+            "time": "2025-08-20T13:36:50+00:00"
+        },
+        {
+            "name": "illuminate/redis",
+            "version": "v12.38.1",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/redis/v12.38.1/illuminate-redis-v12.38.1.zip",
+                "reference": "7e70e89db07e4bc3b0271a7a820a0d85b746c069",
+                "shasum": ""
+            },
+            "require": {
+                "illuminate/collections": "^12.0",
+                "illuminate/contracts": "^12.0",
+                "illuminate/macroable": "^12.0",
+                "illuminate/support": "^12.0",
+                "php": "^8.2"
+            },
+            "suggest": {
+                "ext-redis": "Required to use the phpredis connector (^4.0|^5.0|^6.0).",
+                "predis/predis": "Required to use the predis connector (^2.3|^3.0)."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "12.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Illuminate\\Redis\\": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "taylor@laravel.com"
+                }
+            ],
+            "description": "The Illuminate Redis package.",
+            "homepage": "https://laravel.com",
+            "support": {
+                "issues": "https://github.com/laravel/framework/issues",
+                "source": "https://github.com/laravel/framework"
+            },
+            "time": "2025-11-07T20:17:43+00:00"
+        },
+        {
+            "name": "illuminate/support",
+            "version": "v12.38.1",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/support/v12.38.1/illuminate-support-v12.38.1.zip",
+                "reference": "008b6c0d45f548de0f801d60a5854a7f9e4dd32f",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/inflector": "^2.0",
+                "ext-ctype": "*",
+                "ext-filter": "*",
+                "ext-mbstring": "*",
+                "illuminate/collections": "^12.0",
+                "illuminate/conditionable": "^12.0",
+                "illuminate/contracts": "^12.0",
+                "illuminate/macroable": "^12.0",
+                "nesbot/carbon": "^3.8.4",
+                "php": "^8.2",
+                "symfony/polyfill-php83": "^1.33",
+                "symfony/polyfill-php85": "^1.33",
+                "voku/portable-ascii": "^2.0.2"
+            },
+            "conflict": {
+                "tightenco/collect": "<5.5.33"
+            },
+            "replace": {
+                "spatie/once": "*"
+            },
+            "suggest": {
+                "illuminate/filesystem": "Required to use the Composer class (^12.0).",
+                "laravel/serializable-closure": "Required to use the once function (^1.3|^2.0).",
+                "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.7).",
+                "league/uri": "Required to use the Uri class (^7.5.1).",
+                "ramsey/uuid": "Required to use Str::uuid() (^4.7).",
+                "symfony/process": "Required to use the Composer class (^7.2).",
+                "symfony/uid": "Required to use Str::ulid() (^7.2).",
+                "symfony/var-dumper": "Required to use the dd function (^7.2).",
+                "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "12.x-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "functions.php",
+                    "helpers.php"
+                ],
+                "psr-4": {
+                    "Illuminate\\Support\\": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "taylor@laravel.com"
+                }
+            ],
+            "description": "The Illuminate Support package.",
+            "homepage": "https://laravel.com",
+            "support": {
+                "issues": "https://github.com/laravel/framework/issues",
+                "source": "https://github.com/laravel/framework"
+            },
+            "time": "2025-11-06T14:27:18+00:00"
+        },
+        {
+            "name": "intervention/gif",
+            "version": "4.2.2",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/intervention/gif/4.2.2/intervention-gif-4.2.2.zip",
+                "reference": "5999eac6a39aa760fb803bc809e8909ee67b451a",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^8.1"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "^2.1",
+                "phpunit/phpunit": "^10.0 || ^11.0  || ^12.0",
+                "slevomat/coding-standard": "~8.0",
+                "squizlabs/php_codesniffer": "^3.8"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Intervention\\Gif\\": "src"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Oliver Vogel",
+                    "email": "oliver@intervention.io",
+                    "homepage": "https://intervention.io/"
+                }
+            ],
+            "description": "Native PHP GIF Encoder/Decoder",
+            "homepage": "https://github.com/intervention/gif",
+            "keywords": [
+                "animation",
+                "gd",
+                "gif",
+                "image"
+            ],
+            "support": {
+                "issues": "https://github.com/Intervention/gif/issues",
+                "source": "https://github.com/Intervention/gif/tree/4.2.2"
+            },
+            "time": "2025-03-29T07:46:21+00:00"
+        },
+        {
+            "name": "intervention/image",
+            "version": "3.11.4",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/intervention/image/3.11.4/intervention-image-3.11.4.zip",
+                "reference": "8c49eb21a6d2572532d1bc425964264f3e496846",
+                "shasum": ""
+            },
+            "require": {
+                "ext-mbstring": "*",
+                "intervention/gif": "^4.2",
+                "php": "^8.1"
+            },
+            "require-dev": {
+                "mockery/mockery": "^1.6",
+                "phpstan/phpstan": "^2.1",
+                "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0",
+                "slevomat/coding-standard": "~8.0",
+                "squizlabs/php_codesniffer": "^3.8"
+            },
+            "suggest": {
+                "ext-exif": "Recommended to be able to read EXIF data properly."
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Intervention\\Image\\": "src"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Oliver Vogel",
+                    "email": "oliver@intervention.io",
+                    "homepage": "https://intervention.io/"
+                }
+            ],
+            "description": "PHP image manipulation",
+            "homepage": "https://image.intervention.io/",
+            "keywords": [
+                "gd",
+                "image",
+                "imagick",
+                "resize",
+                "thumbnail",
+                "watermark"
+            ],
+            "support": {
+                "issues": "https://github.com/Intervention/image/issues",
+                "source": "https://github.com/Intervention/image/tree/3.11.4"
+            },
+            "time": "2025-07-30T13:13:19+00:00"
+        },
+        {
+            "name": "kkokk/poster",
+            "version": "v3.0.4",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/kkokk/poster/v3.0.4/kkokk-poster-v3.0.4.zip",
+                "reference": "ccca8b1766fa41ecd6ec0c3ec79d1a77b6a1a2b6",
+                "shasum": ""
+            },
+            "require": {
+                "ext-gd": "*",
+                "ext-iconv": "*",
+                "ext-mbstring": "*",
+                "php": ">=5.6.0"
+            },
+            "type": "project",
+            "autoload": {
+                "files": [
+                    "src/helpers.php"
+                ],
+                "psr-4": {
+                    "Kkokk\\Poster\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "lang",
+                    "email": "732853989@qq.com"
+                }
+            ],
+            "description": "PHP生成海报、验证码、行为验证码",
+            "support": {
+                "issues": "https://github.com/kkokk/poster/issues",
+                "source": "https://github.com/kkokk/poster/tree/v3.0.4"
+            },
+            "time": "2025-10-22T09:02:34+00:00"
+        },
+        {
+            "name": "linfly/annotation",
+            "version": "1.0.12",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/linfly/annotation/1.0.12/linfly-annotation-1.0.12.zip",
+                "reference": "56bf93293c395f78b32f889a875155a6c8ed6897",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/annotations": "^1.13",
+                "linfly/container": "^1.0",
+                "php": "^8.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "LinFly\\Annotation\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "description": "Webman plugin linfly/annotation",
+            "support": {
+                "issues": "https://github.com/imlinfly/webman-annotation/issues",
+                "source": "https://github.com/imlinfly/webman-annotation/tree/1.0.12"
+            },
+            "time": "2023-10-07T03:15:14+00:00"
+        },
+        {
+            "name": "linfly/container",
+            "version": "1.0.4",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/linfly/container/1.0.4/linfly-container-1.0.4.zip",
+                "reference": "9f3d3f9d35de6587c4870bedb130e17596a2f7b4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.0",
+                "psr/container": ">=1.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "LinFly\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "description": "linfly-container",
+            "support": {
+                "issues": "https://github.com/imlinfly/php-container/issues",
+                "source": "https://github.com/imlinfly/php-container/tree/1.0.4"
+            },
+            "time": "2023-05-16T08:03:31+00:00"
+        },
+        {
+            "name": "maennchen/zipstream-php",
+            "version": "3.1.2",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/maennchen/zipstream-php/3.1.2/maennchen-zipstream-php-3.1.2.zip",
+                "reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f",
+                "shasum": ""
+            },
+            "require": {
+                "ext-mbstring": "*",
+                "ext-zlib": "*",
+                "php-64bit": "^8.2"
+            },
+            "require-dev": {
+                "brianium/paratest": "^7.7",
+                "ext-zip": "*",
+                "friendsofphp/php-cs-fixer": "^3.16",
+                "guzzlehttp/guzzle": "^7.5",
+                "mikey179/vfsstream": "^1.6",
+                "php-coveralls/php-coveralls": "^2.5",
+                "phpunit/phpunit": "^11.0",
+                "vimeo/psalm": "^6.0"
+            },
+            "suggest": {
+                "guzzlehttp/psr7": "^2.4",
+                "psr/http-message": "^2.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "ZipStream\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Paul Duncan",
+                    "email": "pabs@pablotron.org"
+                },
+                {
+                    "name": "Jonatan Männchen",
+                    "email": "jonatan@maennchen.ch"
+                },
+                {
+                    "name": "Jesse Donat",
+                    "email": "donatj@gmail.com"
+                },
+                {
+                    "name": "András Kolesár",
+                    "email": "kolesar@kolesar.hu"
+                }
+            ],
+            "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.",
+            "keywords": [
+                "stream",
+                "zip"
+            ],
+            "support": {
+                "issues": "https://github.com/maennchen/ZipStream-PHP/issues",
+                "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.2"
+            },
+            "time": "2025-01-27T12:07:53+00:00"
+        },
+        {
+            "name": "markbaker/complex",
+            "version": "3.0.2",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/markbaker/complex/3.0.2/markbaker-complex-3.0.2.zip",
+                "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "require-dev": {
+                "dealerdirect/phpcodesniffer-composer-installer": "dev-master",
+                "phpcompatibility/php-compatibility": "^9.3",
+                "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
+                "squizlabs/php_codesniffer": "^3.7"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Complex\\": "classes/src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mark Baker",
+                    "email": "mark@lange.demon.co.uk"
+                }
+            ],
+            "description": "PHP Class for working with complex numbers",
+            "homepage": "https://github.com/MarkBaker/PHPComplex",
+            "keywords": [
+                "complex",
+                "mathematics"
+            ],
+            "support": {
+                "issues": "https://github.com/MarkBaker/PHPComplex/issues",
+                "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2"
+            },
+            "time": "2022-12-06T16:21:08+00:00"
+        },
+        {
+            "name": "markbaker/matrix",
+            "version": "3.0.1",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/markbaker/matrix/3.0.1/markbaker-matrix-3.0.1.zip",
+                "reference": "728434227fe21be27ff6d86621a1b13107a2562c",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0"
+            },
+            "require-dev": {
+                "dealerdirect/phpcodesniffer-composer-installer": "dev-master",
+                "phpcompatibility/php-compatibility": "^9.3",
+                "phpdocumentor/phpdocumentor": "2.*",
+                "phploc/phploc": "^4.0",
+                "phpmd/phpmd": "2.*",
+                "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
+                "sebastian/phpcpd": "^4.0",
+                "squizlabs/php_codesniffer": "^3.7"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Matrix\\": "classes/src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mark Baker",
+                    "email": "mark@demon-angel.eu"
+                }
+            ],
+            "description": "PHP Class for working with matrices",
+            "homepage": "https://github.com/MarkBaker/PHPMatrix",
+            "keywords": [
+                "mathematics",
+                "matrix",
+                "vector"
+            ],
+            "support": {
+                "issues": "https://github.com/MarkBaker/PHPMatrix/issues",
+                "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1"
+            },
+            "time": "2022-12-02T22:17:43+00:00"
+        },
+        {
+            "name": "monolog/monolog",
+            "version": "2.10.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/monolog/monolog/2.10.0/monolog-monolog-2.10.0.zip",
+                "reference": "5cf826f2991858b54d5c3809bee745560a1042a7",
+                "shasum": ""
+            },
+            "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"
+                }
+            },
+            "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"
+            },
+            "time": "2024-11-12T12:43:37+00:00"
+        },
+        {
+            "name": "nesbot/carbon",
+            "version": "3.10.3",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/nesbot/carbon/3.10.3/nesbot-carbon-3.10.3.zip",
+                "reference": "8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f",
+                "shasum": ""
+            },
+            "require": {
+                "carbonphp/carbon-doctrine-types": "<100.0",
+                "ext-json": "*",
+                "php": "^8.1",
+                "psr/clock": "^1.0",
+                "symfony/clock": "^6.3.12 || ^7.0",
+                "symfony/polyfill-mbstring": "^1.0",
+                "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0"
+            },
+            "provide": {
+                "psr/clock-implementation": "1.0"
+            },
+            "require-dev": {
+                "doctrine/dbal": "^3.6.3 || ^4.0",
+                "doctrine/orm": "^2.15.2 || ^3.0",
+                "friendsofphp/php-cs-fixer": "^v3.87.1",
+                "kylekatarnls/multi-tester": "^2.5.3",
+                "phpmd/phpmd": "^2.15.0",
+                "phpstan/extension-installer": "^1.4.3",
+                "phpstan/phpstan": "^2.1.22",
+                "phpunit/phpunit": "^10.5.53",
+                "squizlabs/php_codesniffer": "^3.13.4"
+            },
+            "bin": [
+                "bin/carbon"
+            ],
+            "type": "library",
+            "extra": {
+                "laravel": {
+                    "providers": [
+                        "Carbon\\Laravel\\ServiceProvider"
+                    ]
+                },
+                "phpstan": {
+                    "includes": [
+                        "extension.neon"
+                    ]
+                },
+                "branch-alias": {
+                    "dev-2.x": "2.x-dev",
+                    "dev-master": "3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Carbon\\": "src/Carbon/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Brian Nesbitt",
+                    "email": "brian@nesbot.com",
+                    "homepage": "https://markido.com"
+                },
+                {
+                    "name": "kylekatarnls",
+                    "homepage": "https://github.com/kylekatarnls"
+                }
+            ],
+            "description": "An API extension for DateTime that supports 281 different languages.",
+            "homepage": "https://carbon.nesbot.com",
+            "keywords": [
+                "date",
+                "datetime",
+                "time"
+            ],
+            "support": {
+                "docs": "https://carbon.nesbot.com/docs",
+                "issues": "https://github.com/CarbonPHP/carbon/issues",
+                "source": "https://github.com/CarbonPHP/carbon"
+            },
+            "time": "2025-09-06T13:39:36+00:00"
+        },
+        {
+            "name": "nikic/fast-route",
+            "version": "v1.3.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/nikic/fast-route/v1.3.0/nikic-fast-route-v1.3.0.zip",
+                "reference": "181d480e08d9476e61381e04a71b34dc0432e812",
+                "shasum": ""
+            },
+            "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/"
+                }
+            },
+            "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": "overtrue/easy-sms",
+            "version": "3.2.1",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/overtrue/easy-sms/3.2.1/overtrue-easy-sms-3.2.1.zip",
+                "reference": "110d3a5fe43af7d3fe80c06b1a0cbf955648a922",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "guzzlehttp/guzzle": "^6.2 || ^7.0",
+                "php": ">=8.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^3.54",
+                "jetbrains/phpstorm-attributes": "^1.0",
+                "mockery/mockery": "^1.4.2",
+                "phpunit/phpunit": "^9.5.8"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Overtrue\\EasySms\\": "src"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "overtrue",
+                    "email": "i@overtrue.me"
+                }
+            ],
+            "description": "The easiest way to send short message.",
+            "support": {
+                "issues": "https://github.com/overtrue/easy-sms/issues",
+                "source": "https://github.com/overtrue/easy-sms/tree/3.2.1"
+            },
+            "time": "2025-07-17T07:07:58+00:00"
+        },
+        {
+            "name": "phpoffice/phpspreadsheet",
+            "version": "5.2.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/phpoffice/phpspreadsheet/5.2.0/phpoffice-phpspreadsheet-5.2.0.zip",
+                "reference": "3b8994b3aac4b61018bc04fc8c441f4fd68c18eb",
+                "shasum": ""
+            },
+            "require": {
+                "composer/pcre": "^1||^2||^3",
+                "ext-ctype": "*",
+                "ext-dom": "*",
+                "ext-fileinfo": "*",
+                "ext-gd": "*",
+                "ext-iconv": "*",
+                "ext-libxml": "*",
+                "ext-mbstring": "*",
+                "ext-simplexml": "*",
+                "ext-xml": "*",
+                "ext-xmlreader": "*",
+                "ext-xmlwriter": "*",
+                "ext-zip": "*",
+                "ext-zlib": "*",
+                "maennchen/zipstream-php": "^2.1 || ^3.0",
+                "markbaker/complex": "^3.0",
+                "markbaker/matrix": "^3.0",
+                "php": "^8.1",
+                "psr/http-client": "^1.0",
+                "psr/http-factory": "^1.0",
+                "psr/simple-cache": "^1.0 || ^2.0 || ^3.0"
+            },
+            "require-dev": {
+                "dealerdirect/phpcodesniffer-composer-installer": "dev-main",
+                "dompdf/dompdf": "^2.0 || ^3.0",
+                "friendsofphp/php-cs-fixer": "^3.2",
+                "mitoteam/jpgraph": "^10.5",
+                "mpdf/mpdf": "^8.1.1",
+                "phpcompatibility/php-compatibility": "^9.3",
+                "phpstan/phpstan": "^1.1 || ^2.0",
+                "phpstan/phpstan-deprecation-rules": "^1.0 || ^2.0",
+                "phpstan/phpstan-phpunit": "^1.0 || ^2.0",
+                "phpunit/phpunit": "^10.5",
+                "squizlabs/php_codesniffer": "^3.7",
+                "tecnickcom/tcpdf": "^6.5"
+            },
+            "suggest": {
+                "dompdf/dompdf": "Option for rendering PDF with PDF Writer",
+                "ext-intl": "PHP Internationalization Functions, regquired for NumberFormat Wizard",
+                "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
+                "mpdf/mpdf": "Option for rendering PDF with PDF Writer",
+                "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Maarten Balliauw",
+                    "homepage": "https://blog.maartenballiauw.be"
+                },
+                {
+                    "name": "Mark Baker",
+                    "homepage": "https://markbakeruk.net"
+                },
+                {
+                    "name": "Franck Lefevre",
+                    "homepage": "https://rootslabs.net"
+                },
+                {
+                    "name": "Erik Tilt"
+                },
+                {
+                    "name": "Adrien Crivelli"
+                }
+            ],
+            "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
+            "homepage": "https://github.com/PHPOffice/PhpSpreadsheet",
+            "keywords": [
+                "OpenXML",
+                "excel",
+                "gnumeric",
+                "ods",
+                "php",
+                "spreadsheet",
+                "xls",
+                "xlsx"
+            ],
+            "support": {
+                "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues",
+                "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/5.2.0"
+            },
+            "time": "2025-10-26T15:54:22+00:00"
+        },
+        {
+            "name": "phpoption/phpoption",
+            "version": "1.9.4",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/phpoption/phpoption/1.9.4/phpoption-phpoption-1.9.4.zip",
+                "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2.5 || ^8.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.8.2",
+                "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34"
+            },
+            "type": "library",
+            "extra": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": false
+                },
+                "branch-alias": {
+                    "dev-master": "1.9-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "PhpOption\\": "src/PhpOption/"
+                }
+            },
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Johannes M. Schmitt",
+                    "email": "schmittjoh@gmail.com",
+                    "homepage": "https://github.com/schmittjoh"
+                },
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                }
+            ],
+            "description": "Option Type for PHP",
+            "keywords": [
+                "language",
+                "option",
+                "php",
+                "type"
+            ],
+            "support": {
+                "issues": "https://github.com/schmittjoh/php-option/issues",
+                "source": "https://github.com/schmittjoh/php-option/tree/1.9.4"
+            },
+            "time": "2025-08-21T11:53:16+00:00"
+        },
+        {
+            "name": "psr/cache",
+            "version": "3.0.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/cache/3.0.0/psr-cache-3.0.0.zip",
+                "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.0.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Cache\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for caching libraries",
+            "keywords": [
+                "cache",
+                "psr",
+                "psr-6"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/cache/tree/3.0.0"
+            },
+            "time": "2021-02-03T23:26:27+00:00"
+        },
+        {
+            "name": "psr/clock",
+            "version": "1.0.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/clock/1.0.0/psr-clock-1.0.0.zip",
+                "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.0 || ^8.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Clock\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for reading the clock.",
+            "homepage": "https://github.com/php-fig/clock",
+            "keywords": [
+                "clock",
+                "now",
+                "psr",
+                "psr-20",
+                "time"
+            ],
+            "support": {
+                "issues": "https://github.com/php-fig/clock/issues",
+                "source": "https://github.com/php-fig/clock/tree/1.0.0"
+            },
+            "time": "2022-11-25T14:36:26+00:00"
+        },
+        {
+            "name": "psr/container",
+            "version": "2.0.2",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/container/2.0.2/psr-container-2.0.2.zip",
+                "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.4.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Container\\": "src/"
+                }
+            },
+            "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/http-client",
+            "version": "1.0.3",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/http-client/1.0.3/psr-http-client-1.0.3.zip",
+                "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.0 || ^8.0",
+                "psr/http-message": "^1.0 || ^2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Client\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for HTTP clients",
+            "homepage": "https://github.com/php-fig/http-client",
+            "keywords": [
+                "http",
+                "http-client",
+                "psr",
+                "psr-18"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/http-client"
+            },
+            "time": "2023-09-23T14:17:50+00:00"
+        },
+        {
+            "name": "psr/http-factory",
+            "version": "1.1.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/http-factory/1.1.0/psr-http-factory-1.1.0.zip",
+                "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1",
+                "psr/http-message": "^1.0 || ^2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Message\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories",
+            "keywords": [
+                "factory",
+                "http",
+                "message",
+                "psr",
+                "psr-17",
+                "psr-7",
+                "request",
+                "response"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/http-factory"
+            },
+            "time": "2024-04-15T12:06:14+00:00"
+        },
+        {
+            "name": "psr/http-message",
+            "version": "2.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/http-message/2.0/psr-http-message-2.0.zip",
+                "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Message\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for HTTP messages",
+            "homepage": "https://github.com/php-fig/http-message",
+            "keywords": [
+                "http",
+                "http-message",
+                "psr",
+                "psr-7",
+                "request",
+                "response"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/http-message/tree/2.0"
+            },
+            "time": "2023-04-04T09:54:51+00:00"
+        },
+        {
+            "name": "psr/log",
+            "version": "3.0.2",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/log/3.0.2/psr-log-3.0.2.zip",
+                "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.0.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Log\\": "src"
+                }
+            },
+            "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.2"
+            },
+            "time": "2024-09-11T13:17:53+00:00"
+        },
+        {
+            "name": "psr/simple-cache",
+            "version": "3.0.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/simple-cache/3.0.0/psr-simple-cache-3.0.0.zip",
+                "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.0.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\SimpleCache\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interfaces for simple caching",
+            "keywords": [
+                "cache",
+                "caching",
+                "psr",
+                "psr-16",
+                "simple-cache"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/simple-cache/tree/3.0.0"
+            },
+            "time": "2021-10-29T13:26:27+00:00"
+        },
+        {
+            "name": "qcloud/cos-sdk-v5",
+            "version": "v2.6.16",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/qcloud/cos-sdk-v5/v2.6.16/qcloud-cos-sdk-v5-v2.6.16.zip",
+                "reference": "22366f4b4f7f277e67aa72eea8d1e02a5f9943e2",
+                "shasum": ""
+            },
+            "require": {
+                "ext-curl": "*",
+                "ext-json": "*",
+                "ext-libxml": "*",
+                "ext-mbstring": "*",
+                "ext-simplexml": "*",
+                "guzzlehttp/guzzle": "^6.2.1 || ^7.0",
+                "guzzlehttp/guzzle-services": "^1.1",
+                "guzzlehttp/psr7": "^1.3.1 || ^2.0",
+                "php": ">=5.6"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.4-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/Common.php"
+                ],
+                "psr-4": {
+                    "Qcloud\\Cos\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "yaozongyou",
+                    "email": "yaozongyou@vip.qq.com"
+                },
+                {
+                    "name": "lewzylu",
+                    "email": "327874225@qq.com"
+                },
+                {
+                    "name": "tuunalai",
+                    "email": "550566181@qq.com"
+                }
+            ],
+            "description": "PHP SDK for QCloud COS",
+            "keywords": [
+                "cos",
+                "php",
+                "qcloud"
+            ],
+            "support": {
+                "issues": "https://github.com/tencentyun/cos-php-sdk-v5/issues",
+                "source": "https://github.com/tencentyun/cos-php-sdk-v5/tree/v2.6.16"
+            },
+            "time": "2025-01-21T12:49:21+00:00"
+        },
+        {
+            "name": "ralouphie/getallheaders",
+            "version": "3.0.3",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/ralouphie/getallheaders/3.0.3/ralouphie-getallheaders-3.0.3.zip",
+                "reference": "120b605dfeb996808c31b6477290a714d356e822",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.6"
+            },
+            "require-dev": {
+                "php-coveralls/php-coveralls": "^2.1",
+                "phpunit/phpunit": "^5 || ^6.5"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/getallheaders.php"
+                ]
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ralph Khattar",
+                    "email": "ralph.khattar@gmail.com"
+                }
+            ],
+            "description": "A polyfill for getallheaders.",
+            "support": {
+                "issues": "https://github.com/ralouphie/getallheaders/issues",
+                "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+            },
+            "time": "2019-03-08T08:55:37+00:00"
+        },
+        {
+            "name": "react/promise",
+            "version": "v3.3.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/react/promise/v3.3.0/react-promise-v3.3.0.zip",
+                "reference": "23444f53a813a3296c1368bb104793ce8d88f04a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.0"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "1.12.28 || 1.4.10",
+                "phpunit/phpunit": "^9.6 || ^7.5"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/functions_include.php"
+                ],
+                "psr-4": {
+                    "React\\Promise\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "jsorgalla@gmail.com",
+                    "homepage": "https://sorgalla.com/"
+                },
+                {
+                    "name": "Christian Lück",
+                    "email": "christian@clue.engineering",
+                    "homepage": "https://clue.engineering/"
+                },
+                {
+                    "name": "Cees-Jan Kiewiet",
+                    "email": "reactphp@ceesjankiewiet.nl",
+                    "homepage": "https://wyrihaximus.net/"
+                },
+                {
+                    "name": "Chris Boden",
+                    "email": "cboden@gmail.com",
+                    "homepage": "https://cboden.dev/"
+                }
+            ],
+            "description": "A lightweight implementation of CommonJS Promises/A for PHP",
+            "keywords": [
+                "promise",
+                "promises"
+            ],
+            "support": {
+                "issues": "https://github.com/reactphp/promise/issues",
+                "source": "https://github.com/reactphp/promise/tree/v3.3.0"
+            },
+            "time": "2025-08-19T18:57:03+00:00"
+        },
+        {
+            "name": "shopwwi/webman-auth",
+            "version": "v2.0.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/shopwwi/webman-auth/v2.0.0/shopwwi-webman-auth-v2.0.0.zip",
+                "reference": "eaaa6aee6932dfc7a6ffdb245b3ecf031e587362",
+                "shasum": ""
+            },
+            "require": {
+                "firebase/php-jwt": ">=5.4|^6.0",
+                "php": ">=7.2",
+                "webman/console": "^1.0 || ^2.0 || dev-master"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Shopwwi\\WebmanAuth\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Tycoon Song",
+                    "email": "8988354@qq.com"
+                }
+            ],
+            "description": "webman auth",
+            "keywords": [
+                "auth",
+                "webman"
+            ],
+            "support": {
+                "issues": "https://github.com/shopwwi/webman-auth/issues",
+                "source": "https://github.com/shopwwi/webman-auth/tree/v2.0.0"
+            },
+            "time": "2025-03-17T10:35:57+00:00"
+        },
+        {
+            "name": "symfony/clock",
+            "version": "v7.3.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/clock/v7.3.0/symfony-clock-v7.3.0.zip",
+                "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.2",
+                "psr/clock": "^1.0",
+                "symfony/polyfill-php83": "^1.28"
+            },
+            "provide": {
+                "psr/clock-implementation": "1.0"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "Resources/now.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Component\\Clock\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Decouples applications from the system clock",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "clock",
+                "psr20",
+                "time"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/clock/tree/v7.3.0"
+            },
+            "time": "2024-09-25T14:21:43+00:00"
+        },
+        {
+            "name": "symfony/console",
+            "version": "v7.3.6",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/console/v7.3.6/symfony-console-v7.3.6.zip",
+                "reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.2",
+                "symfony/deprecation-contracts": "^2.5|^3",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/service-contracts": "^2.5|^3",
+                "symfony/string": "^7.2"
+            },
+            "conflict": {
+                "symfony/dependency-injection": "<6.4",
+                "symfony/dotenv": "<6.4",
+                "symfony/event-dispatcher": "<6.4",
+                "symfony/lock": "<6.4",
+                "symfony/process": "<6.4"
+            },
+            "provide": {
+                "psr/log-implementation": "1.0|2.0|3.0"
+            },
+            "require-dev": {
+                "psr/log": "^1|^2|^3",
+                "symfony/config": "^6.4|^7.0",
+                "symfony/dependency-injection": "^6.4|^7.0",
+                "symfony/event-dispatcher": "^6.4|^7.0",
+                "symfony/http-foundation": "^6.4|^7.0",
+                "symfony/http-kernel": "^6.4|^7.0",
+                "symfony/lock": "^6.4|^7.0",
+                "symfony/messenger": "^6.4|^7.0",
+                "symfony/process": "^6.4|^7.0",
+                "symfony/stopwatch": "^6.4|^7.0",
+                "symfony/var-dumper": "^6.4|^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Console\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Eases the creation of beautiful and testable command line interfaces",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "cli",
+                "command-line",
+                "console",
+                "terminal"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/console/tree/v7.3.6"
+            },
+            "time": "2025-11-04T01:21:42+00:00"
+        },
+        {
+            "name": "symfony/deprecation-contracts",
+            "version": "v3.6.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/deprecation-contracts/v3.6.0/symfony-deprecation-contracts-v3.6.0.zip",
+                "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "url": "https://github.com/symfony/contracts",
+                    "name": "symfony/contracts"
+                },
+                "branch-alias": {
+                    "dev-main": "3.6-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "function.php"
+                ]
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "A generic function and convention to trigger deprecation notices",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0"
+            },
+            "time": "2024-09-25T14:21:43+00:00"
+        },
+        {
+            "name": "symfony/polyfill-ctype",
+            "version": "v1.33.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/polyfill-ctype/v1.33.0/symfony-polyfill-ctype-v1.33.0.zip",
+                "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2"
+            },
+            "provide": {
+                "ext-ctype": "*"
+            },
+            "suggest": {
+                "ext-ctype": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "url": "https://github.com/symfony/polyfill",
+                    "name": "symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Ctype\\": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Gert de Pagter",
+                    "email": "BackEndTea@gmail.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for ctype functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "ctype",
+                "polyfill",
+                "portable"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0"
+            },
+            "time": "2024-09-09T11:45:10+00:00"
+        },
+        {
+            "name": "symfony/polyfill-intl-grapheme",
+            "version": "v1.33.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/polyfill-intl-grapheme/v1.33.0/symfony-polyfill-intl-grapheme-v1.33.0.zip",
+                "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2"
+            },
+            "suggest": {
+                "ext-intl": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "url": "https://github.com/symfony/polyfill",
+                    "name": "symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for intl's grapheme_* functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "grapheme",
+                "intl",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0"
+            },
+            "time": "2025-06-27T09:58:17+00:00"
+        },
+        {
+            "name": "symfony/polyfill-intl-normalizer",
+            "version": "v1.33.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/polyfill-intl-normalizer/v1.33.0/symfony-polyfill-intl-normalizer-v1.33.0.zip",
+                "reference": "3833d7255cc303546435cb650316bff708a1c75c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2"
+            },
+            "suggest": {
+                "ext-intl": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "url": "https://github.com/symfony/polyfill",
+                    "name": "symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for intl's Normalizer class and related functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "intl",
+                "normalizer",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0"
+            },
+            "time": "2024-09-09T11:45:10+00:00"
+        },
+        {
+            "name": "symfony/polyfill-mbstring",
+            "version": "v1.33.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/polyfill-mbstring/v1.33.0/symfony-polyfill-mbstring-v1.33.0.zip",
+                "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493",
+                "shasum": ""
+            },
+            "require": {
+                "ext-iconv": "*",
+                "php": ">=7.2"
+            },
+            "provide": {
+                "ext-mbstring": "*"
+            },
+            "suggest": {
+                "ext-mbstring": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "url": "https://github.com/symfony/polyfill",
+                    "name": "symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Mbstring\\": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for the Mbstring extension",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "mbstring",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0"
+            },
+            "time": "2024-12-23T08:48:59+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php80",
+            "version": "v1.33.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/polyfill-php80/v1.33.0/symfony-polyfill-php80-v1.33.0.zip",
+                "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2"
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "url": "https://github.com/symfony/polyfill",
+                    "name": "symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php80\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ion Bazan",
+                    "email": "ion.bazan@gmail.com"
+                },
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0"
+            },
+            "time": "2025-01-02T08:10:11+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php83",
+            "version": "v1.33.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/polyfill-php83/v1.33.0/symfony-polyfill-php83-v1.33.0.zip",
+                "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2"
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "url": "https://github.com/symfony/polyfill",
+                    "name": "symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php83\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0"
+            },
+            "time": "2025-07-08T02:45:35+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php84",
+            "version": "v1.33.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/polyfill-php84/v1.33.0/symfony-polyfill-php84-v1.33.0.zip",
+                "reference": "d8ced4d875142b6a7426000426b8abc631d6b191",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2"
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "url": "https://github.com/symfony/polyfill",
+                    "name": "symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php84\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0"
+            },
+            "time": "2025-06-24T13:30:11+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php85",
+            "version": "v1.33.0",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/polyfill-php85/v1.33.0/symfony-polyfill-php85-v1.33.0.zip",
+                "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2"
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "url": "https://github.com/symfony/polyfill",
+                    "name": "symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php85\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0"
+            },
+            "time": "2025-06-23T16:12:55+00:00"
+        },
+        {
+            "name": "symfony/service-contracts",
+            "version": "v3.6.1",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/service-contracts/v3.6.1/symfony-service-contracts-v3.6.1.zip",
+                "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "psr/container": "^1.1|^2.0",
+                "symfony/deprecation-contracts": "^2.5|^3"
+            },
+            "conflict": {
+                "ext-psr": "<1.1|>=2"
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "url": "https://github.com/symfony/contracts",
+                    "name": "symfony/contracts"
+                },
+                "branch-alias": {
+                    "dev-main": "3.6-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\Service\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Test/"
+                ]
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Generic abstractions related to writing services",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/service-contracts/tree/v3.6.1"
+            },
+            "time": "2025-07-15T11:30:57+00:00"
+        },
+        {
+            "name": "symfony/string",
+            "version": "v7.3.4",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/string/v7.3.4/symfony-string-v7.3.4.zip",
+                "reference": "f96476035142921000338bad71e5247fbc138872",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.2",
+                "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-intl-grapheme": "~1.0",
+                "symfony/polyfill-intl-normalizer": "~1.0",
+                "symfony/polyfill-mbstring": "~1.0"
+            },
+            "conflict": {
+                "symfony/translation-contracts": "<2.5"
+            },
+            "require-dev": {
+                "symfony/emoji": "^7.1",
+                "symfony/http-client": "^6.4|^7.0",
+                "symfony/intl": "^6.4|^7.0",
+                "symfony/translation-contracts": "^2.5|^3.0",
+                "symfony/var-exporter": "^6.4|^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "Resources/functions.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Component\\String\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "grapheme",
+                "i18n",
+                "string",
+                "unicode",
+                "utf-8",
+                "utf8"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/string/tree/v7.3.4"
+            },
+            "time": "2025-09-11T14:36:48+00:00"
+        },
+        {
+            "name": "symfony/translation",
+            "version": "v7.3.4",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/translation/v7.3.4/symfony-translation-v7.3.4.zip",
+                "reference": "ec25870502d0c7072d086e8ffba1420c85965174",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.2",
+                "symfony/deprecation-contracts": "^2.5|^3",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/translation-contracts": "^2.5|^3.0"
+            },
+            "conflict": {
+                "nikic/php-parser": "<5.0",
+                "symfony/config": "<6.4",
+                "symfony/console": "<6.4",
+                "symfony/dependency-injection": "<6.4",
+                "symfony/http-client-contracts": "<2.5",
+                "symfony/http-kernel": "<6.4",
+                "symfony/service-contracts": "<2.5",
+                "symfony/twig-bundle": "<6.4",
+                "symfony/yaml": "<6.4"
+            },
+            "provide": {
+                "symfony/translation-implementation": "2.3|3.0"
+            },
+            "require-dev": {
+                "nikic/php-parser": "^5.0",
+                "psr/log": "^1|^2|^3",
+                "symfony/config": "^6.4|^7.0",
+                "symfony/console": "^6.4|^7.0",
+                "symfony/dependency-injection": "^6.4|^7.0",
+                "symfony/finder": "^6.4|^7.0",
+                "symfony/http-client-contracts": "^2.5|^3.0",
+                "symfony/http-kernel": "^6.4|^7.0",
+                "symfony/intl": "^6.4|^7.0",
+                "symfony/polyfill-intl-icu": "^1.21",
+                "symfony/routing": "^6.4|^7.0",
+                "symfony/service-contracts": "^2.5|^3",
+                "symfony/yaml": "^6.4|^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "Resources/functions.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Component\\Translation\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides tools to internationalize your application",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/translation/tree/v7.3.4"
+            },
+            "time": "2025-09-07T11:39:36+00:00"
+        },
+        {
+            "name": "symfony/translation-contracts",
+            "version": "v3.6.1",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/translation-contracts/v3.6.1/symfony-translation-contracts-v3.6.1.zip",
+                "reference": "65a8bc82080447fae78373aa10f8d13b38338977",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "url": "https://github.com/symfony/contracts",
+                    "name": "symfony/contracts"
+                },
+                "branch-alias": {
+                    "dev-main": "3.6-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\Translation\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Test/"
+                ]
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Generic abstractions related to translation",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1"
+            },
+            "time": "2025-07-15T13:41:35+00:00"
+        },
+        {
+            "name": "tinywan/captcha",
+            "version": "v0.0.4",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/tinywan/captcha/v0.0.4/tinywan-captcha-v0.0.4.zip",
+                "reference": "5d24139730f2adcce162366f69d207d39fa89558",
+                "shasum": ""
+            },
+            "require": {
+                "ext-gd": "*",
+                "ext-mbstring": "*",
+                "ext-redis": "*",
+                "php": ">=7.2"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^3.6",
+                "phpstan/phpstan": "^1.4",
+                "workerman/webman": "^1.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Tinywan\\Captcha\\": "src"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Tinywan",
+                    "email": "756684177@qq.com"
+                }
+            ],
+            "description": "base64 image verification captcha library for webman plugin",
+            "keywords": [
+                "base64",
+                "captcha",
+                "plugin",
+                "webman"
+            ],
+            "support": {
+                "issues": "https://github.com/Tinywan/webman-captcha/issues",
+                "source": "https://github.com/Tinywan/webman-captcha/tree/v0.0.4"
+            },
+            "time": "2022-08-08T13:52:15+00:00"
+        },
+        {
+            "name": "tinywan/storage",
+            "version": "v1.1.2",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/tinywan/storage/v1.1.2/tinywan-storage-v1.1.2.zip",
+                "reference": "a39584356829860fd2acab396ded3e6d730c71ae",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2",
+                "workerman/webman-framework": "^1.2.1||^2.0"
+            },
+            "require-dev": {
+                "aliyuncs/oss-sdk-php": "^2.4",
+                "friendsofphp/php-cs-fixer": "^3.6",
+                "league/flysystem-aws-s3-v3": "^1.0",
+                "phpstan/phpstan": "^1.4",
+                "phpunit/phpunit": "^9.5",
+                "qcloud/cos-sdk-v5": "^2.5",
+                "qiniu/php-sdk": "^7.4",
+                "workerman/webman": "^1.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Tinywan\\Storage\\": "src"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "description": "webman storage plugin",
+            "support": {
+                "issues": "https://github.com/Tinywan/webman-storage/issues",
+                "source": "https://github.com/Tinywan/webman-storage/tree/v1.1.2"
+            },
+            "time": "2025-08-21T02:16:10+00:00"
+        },
+        {
+            "name": "topthink/think-container",
+            "version": "v3.0.2",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/topthink/think-container/v3.0.2/topthink-think-container-v3.0.2.zip",
+                "reference": "b2df244be1e7399ad4c8be1ccc40ed57868f730a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.0",
+                "psr/container": "^2.0",
+                "topthink/think-helper": "^3.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.5"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [],
+                "psr-4": {
+                    "think\\": "src"
+                }
+            },
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "liu21st",
+                    "email": "liu21st@gmail.com"
+                }
+            ],
+            "description": "PHP Container & Facade Manager",
+            "support": {
+                "issues": "https://github.com/top-think/think-container/issues",
+                "source": "https://github.com/top-think/think-container/tree/v3.0.2"
+            },
+            "time": "2025-04-07T03:21:51+00:00"
+        },
+        {
+            "name": "topthink/think-helper",
+            "version": "v3.1.11",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/topthink/think-helper/v3.1.11/topthink-think-helper-v3.1.11.zip",
+                "reference": "1d6ada9b9f3130046bf6922fe1bd159c8d88a33c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.5"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/helper.php"
+                ],
+                "psr-4": {
+                    "think\\": "src"
+                }
+            },
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "yunwuxin",
+                    "email": "448901948@qq.com"
+                }
+            ],
+            "description": "The ThinkPHP6 Helper Package",
+            "support": {
+                "issues": "https://github.com/top-think/think-helper/issues",
+                "source": "https://github.com/top-think/think-helper/tree/v3.1.11"
+            },
+            "time": "2025-04-07T06:55:59+00:00"
+        },
+        {
+            "name": "topthink/think-orm",
+            "version": "v4.0.50",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/topthink/think-orm/v4.0.50/topthink-think-orm-v4.0.50.zip",
+                "reference": "ddae72d5ff4d953d3d8cc526fd9c50e8862ce2cc",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "ext-pdo": "*",
+                "php": ">=8.0.0",
+                "psr/log": ">=1.0",
+                "psr/simple-cache": "^3.0",
+                "topthink/think-helper": "^3.1",
+                "topthink/think-validate": "^3.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.6|^10"
+            },
+            "suggest": {
+                "ext-mongodb": "provide mongodb support"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/helper.php",
+                    "stubs/load_stubs.php"
+                ],
+                "psr-4": {
+                    "think\\": "src"
+                }
+            },
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "liu21st",
+                    "email": "liu21st@gmail.com"
+                }
+            ],
+            "description": "the PHP Database&ORM Framework",
+            "keywords": [
+                "database",
+                "orm"
+            ],
+            "support": {
+                "issues": "https://github.com/top-think/think-orm/issues",
+                "source": "https://github.com/top-think/think-orm/tree/v4.0.50"
+            },
+            "time": "2025-08-26T05:32:22+00:00"
+        },
+        {
+            "name": "topthink/think-template",
+            "version": "v3.0.2",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/topthink/think-template/v3.0.2/topthink-think-template-v3.0.2.zip",
+                "reference": "0b88bd449f0f7626dd75b05f557c8bc208c08b0c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.0.0",
+                "psr/simple-cache": ">=1.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "think\\": "src"
+                }
+            },
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "liu21st",
+                    "email": "liu21st@gmail.com"
+                }
+            ],
+            "description": "the php template engine",
+            "support": {
+                "issues": "https://github.com/top-think/think-template/issues",
+                "source": "https://github.com/top-think/think-template/tree/v3.0.2"
+            },
+            "time": "2024-10-16T03:41:06+00:00"
+        },
+        {
+            "name": "topthink/think-validate",
+            "version": "v3.0.7",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/topthink/think-validate/v3.0.7/topthink-think-validate-v3.0.7.zip",
+                "reference": "85063f6d4ef8ed122f17a36179dc3e0949b30988",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.0",
+                "topthink/think-container": ">=3.0"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/helper.php"
+                ],
+                "psr-4": {
+                    "think\\": "src"
+                }
+            },
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "liu21st",
+                    "email": "liu21st@gmail.com"
+                }
+            ],
+            "description": "think validate",
+            "support": {
+                "issues": "https://github.com/top-think/think-validate/issues",
+                "source": "https://github.com/top-think/think-validate/tree/v3.0.7"
+            },
+            "time": "2025-06-11T05:51:40+00:00"
+        },
+        {
+            "name": "vlucas/phpdotenv",
+            "version": "v5.6.2",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/vlucas/phpdotenv/v5.6.2/vlucas-phpdotenv-v5.6.2.zip",
+                "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af",
+                "shasum": ""
+            },
+            "require": {
+                "ext-pcre": "*",
+                "graham-campbell/result-type": "^1.1.3",
+                "php": "^7.2.5 || ^8.0",
+                "phpoption/phpoption": "^1.9.3",
+                "symfony/polyfill-ctype": "^1.24",
+                "symfony/polyfill-mbstring": "^1.24",
+                "symfony/polyfill-php80": "^1.24"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.8.2",
+                "ext-filter": "*",
+                "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2"
+            },
+            "suggest": {
+                "ext-filter": "Required to use the boolean validator."
+            },
+            "type": "library",
+            "extra": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": false
+                },
+                "branch-alias": {
+                    "dev-master": "5.6-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Dotenv\\": "src/"
+                }
+            },
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Vance Lucas",
+                    "email": "vance@vancelucas.com",
+                    "homepage": "https://github.com/vlucas"
+                }
+            ],
+            "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.",
+            "keywords": [
+                "dotenv",
+                "env",
+                "environment"
+            ],
+            "support": {
+                "issues": "https://github.com/vlucas/phpdotenv/issues",
+                "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.2"
+            },
+            "time": "2025-04-30T23:37:27+00:00"
+        },
+        {
+            "name": "voku/portable-ascii",
+            "version": "2.0.3",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/voku/portable-ascii/2.0.3/voku-portable-ascii-2.0.3.zip",
+                "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.0.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0"
+            },
+            "suggest": {
+                "ext-intl": "Use Intl for transliterator_transliterate() support"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "voku\\": "src/voku/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Lars Moelleken",
+                    "homepage": "https://www.moelleken.org/"
+                }
+            ],
+            "description": "Portable ASCII library - performance optimized (ascii) string functions for php.",
+            "homepage": "https://github.com/voku/portable-ascii",
+            "keywords": [
+                "ascii",
+                "clean",
+                "php"
+            ],
+            "support": {
+                "issues": "https://github.com/voku/portable-ascii/issues",
+                "source": "https://github.com/voku/portable-ascii/tree/2.0.3"
+            },
+            "time": "2024-11-21T01:49:47+00:00"
+        },
+        {
+            "name": "webman/console",
+            "version": "v2.1.9",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/webman/console/v2.1.9/webman-console-v2.1.9.zip",
+                "reference": "09c995bf3d9a136c7c471b6db837a1fd56b7d206",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/inflector": "^2.0",
+                "php": ">=8.1",
+                "symfony/console": ">=6.0"
+            },
+            "require-dev": {
+                "workerman/webman": "^2.1"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Webman\\Console\\": "src"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "walkor",
+                    "email": "walkor@workerman.net",
+                    "homepage": "http://www.workerman.net",
+                    "role": "Developer"
+                }
+            ],
+            "description": "Webman console",
+            "homepage": "http://www.workerman.net",
+            "keywords": [
+                "webman console"
+            ],
+            "support": {
+                "email": "walkor@workerman.net",
+                "forum": "http://www.workerman.net/questions",
+                "issues": "https://github.com/webman-php/console/issues",
+                "source": "https://github.com/webman-php/console",
+                "wiki": "http://www.workerman.net/doc/webman"
+            },
+            "time": "2025-10-14T09:11:21+00:00"
+        },
+        {
+            "name": "webman/event",
+            "version": "v1.0.5",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/webman/event/v1.0.5/webman-event-v1.0.5.zip",
+                "reference": "b1c3f6b70fd290e48288703d59bead0e28f9fb84",
+                "shasum": ""
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Webman\\Event\\": "src"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "description": "Webman event plugin",
+            "support": {
+                "issues": "https://github.com/webman-php/event/issues",
+                "source": "https://github.com/webman-php/event/tree/v1.0.5"
+            },
+            "time": "2023-12-04T09:22:12+00:00"
+        },
+        {
+            "name": "webman/rate-limiter",
+            "version": "v1.1.3",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/webman/rate-limiter/v1.1.3/webman-rate-limiter-v1.1.3.zip",
+                "reference": "f6ff79366ab56ac66bc507515d747cdef752db2d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.0",
+                "workerman/webman-framework": ">=1.5.15"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Webman\\RateLimiter\\": "src"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "description": "Webman plugin webman/rate-limiter",
+            "support": {
+                "issues": "https://github.com/webman-php/rate-limiter/issues",
+                "source": "https://github.com/webman-php/rate-limiter/tree/v1.1.3"
+            },
+            "time": "2024-12-27T10:02:44+00:00"
+        },
+        {
+            "name": "webman/redis",
+            "version": "v2.1.3",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/webman/redis/v2.1.3/webman-redis-v2.1.3.zip",
+                "reference": "559eb1692d39c6fef5cf526223fff728be6c0fb9",
+                "shasum": ""
+            },
+            "require": {
+                "illuminate/redis": "^10.0 || ^11.0 || ^12.0",
+                "workerman/webman-framework": "^2.1 || dev-master"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "support\\": "src/support",
+                    "Webman\\Redis\\": "src"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "description": "Webman redis",
+            "support": {
+                "issues": "https://github.com/webman-php/redis/issues",
+                "source": "https://github.com/webman-php/redis/tree/v2.1.3"
+            },
+            "time": "2025-03-14T03:52:14+00:00"
+        },
+        {
+            "name": "webman/redis-queue",
+            "version": "v2.1.1",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/webman/redis-queue/v2.1.1/webman-redis-queue-v2.1.1.zip",
+                "reference": "ff4791e21f3c324a47e21da7b6f2dae5a7311dcb",
+                "shasum": ""
+            },
+            "require": {
+                "ext-redis": "*",
+                "php": ">=8.1",
+                "workerman/redis-queue": "^1.2",
+                "workerman/webman-framework": "^2.1 || dev-master"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Webman\\RedisQueue\\": "./src"
+                }
+            },
+            "description": "Redis message queue plugin for webman.",
+            "support": {
+                "issues": "https://github.com/webman-php/redis-queue/issues",
+                "source": "https://github.com/webman-php/redis-queue/tree/v2.1.1"
+            },
+            "time": "2025-11-14T07:12:52+00:00"
+        },
+        {
+            "name": "webman/think-cache",
+            "version": "v2.1.2",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/webman/think-cache/v2.1.2/webman-think-cache-v2.1.2.zip",
+                "reference": "cf9dcfe9afe8d7395d2cadce51a456bcf8ee53bd",
+                "shasum": ""
+            },
+            "require": {
+                "psr/simple-cache": "^1.0|^2.0|^3.0",
+                "topthink/think-container": "^2.0|^3.0",
+                "workerman/webman-framework": "^2.1 || dev-master"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "support\\": "src/support",
+                    "Webman\\ThinkCache\\": "src"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "support": {
+                "issues": "https://github.com/webman-php/think-cache/issues",
+                "source": "https://github.com/webman-php/think-cache/tree/v2.1.2"
+            },
+            "time": "2025-05-08T03:32:41+00:00"
+        },
+        {
+            "name": "webman/think-orm",
+            "version": "v2.1.8",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/webman/think-orm/v2.1.8/webman-think-orm-v2.1.8.zip",
+                "reference": "7650102429b133c1299135cac563c0834e2652aa",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "topthink/think-container": "^2.0|^3.0",
+                "topthink/think-orm": "^2.0.53 || ^3.0.0 || ^4.0.30 || dev-master",
+                "workerman/webman-framework": "^2.1 || dev-master"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "support\\": "src/support",
+                    "Webman\\ThinkOrm\\": "src"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "support": {
+                "issues": "https://github.com/webman-php/think-orm/issues",
+                "source": "https://github.com/webman-php/think-orm/tree/v2.1.8"
+            },
+            "time": "2025-09-02T01:32:49+00:00"
+        },
+        {
+            "name": "workerman/coroutine",
+            "version": "v1.1.4",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/workerman/coroutine/v1.1.4/workerman-coroutine-v1.1.4.zip",
+                "reference": "b0bebfa9d41b992ad0a835ddf2ee8fa5d58eca44",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^11.0",
+                "psr/log": "*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Workerman\\": "src",
+                    "Workerman\\Coroutine\\": "src"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "description": "Workerman coroutine",
+            "support": {
+                "issues": "https://github.com/workerman-php/coroutine/issues",
+                "source": "https://github.com/workerman-php/coroutine/tree/v1.1.4"
+            },
+            "time": "2025-10-11T15:09:08+00:00"
+        },
+        {
+            "name": "workerman/crontab",
+            "version": "v1.0.7",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/workerman/crontab/v1.0.7/workerman-crontab-v1.0.7.zip",
+                "reference": "74f51ca8204e8eb628e57bc0e640561d570da2cb",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.0",
+                "workerman/workerman": ">=4.0.20"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Workerman\\Crontab\\": "./src"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "walkor",
+                    "email": "walkor@workerman.net",
+                    "homepage": "http://www.workerman.net",
+                    "role": "Developer"
+                }
+            ],
+            "description": "A crontab written in PHP based on workerman",
+            "homepage": "http://www.workerman.net",
+            "keywords": [
+                "crontab"
+            ],
+            "support": {
+                "email": "walkor@workerman.net",
+                "forum": "http://wenda.workerman.net/",
+                "issues": "https://github.com/walkor/workerman/issues",
+                "source": "https://github.com/walkor/crontab",
+                "wiki": "http://doc.workerman.net/"
+            },
+            "time": "2025-01-15T07:20:50+00:00"
+        },
+        {
+            "name": "workerman/redis",
+            "version": "v2.0.5",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/workerman/redis/v2.0.5/workerman-redis-v2.0.5.zip",
+                "reference": "49627c1809eff1ef7175eb8ee7549234a1d67ec5",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7",
+                "workerman/workerman": "^4.1.0||^5.0.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Workerman\\Redis\\": "./src"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "homepage": "http://www.workerman.net",
+            "support": {
+                "issues": "https://github.com/walkor/redis/issues",
+                "source": "https://github.com/walkor/redis/tree/v2.0.5"
+            },
+            "time": "2025-04-07T01:58:58+00:00"
+        },
+        {
+            "name": "workerman/redis-queue",
+            "version": "v1.2.1",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/workerman/redis-queue/v1.2.1/workerman-redis-queue-v1.2.1.zip",
+                "reference": "75dbf7ed2ea228c45dc0df82c0fea35879b715d0",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.0",
+                "workerman/redis": "^1.0||^2.0",
+                "workerman/workerman": ">=4.0.20"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Workerman\\RedisQueue\\": "./src"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "description": "Message queue system written in PHP based on workerman and backed by Redis.",
+            "homepage": "http://www.workerman.net",
+            "support": {
+                "issues": "https://github.com/walkor/redis-queue/issues",
+                "source": "https://github.com/walkor/redis-queue/tree/v1.2.1"
+            },
+            "time": "2025-01-02T09:21:45+00:00"
+        },
+        {
+            "name": "workerman/webman-framework",
+            "version": "v2.1.4",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/workerman/webman-framework/v2.1.4/workerman-webman-framework-v2.1.4.zip",
+                "reference": "f19d1f9e47cc50210555f0b63db5ae1dd584f793",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "nikic/fast-route": "^1.3",
+                "php": ">=8.1",
+                "psr/container": ">=1.0",
+                "psr/log": "^2.0 || ^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"
+                }
+            },
+            "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-11-10T06:59:23+00:00"
+        },
+        {
+            "name": "workerman/workerman",
+            "version": "v5.1.6",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/workerman/workerman/v5.1.6/workerman-workerman-v5.1.6.zip",
+                "reference": "9b83bdf9fd0eaff9419a240b47da870447583112",
+                "shasum": ""
+            },
+            "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": "2.0.x-dev",
+                "pestphp/pest": "2.x-dev",
+                "phpstan/phpstan": "2.1.x-dev"
+            },
+            "suggest": {
+                "ext-event": "For better performance. "
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Workerman\\": "src"
+                }
+            },
+            "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/"
+            },
+            "time": "2025-11-12T01:36:20+00:00"
+        },
+        {
+            "name": "xiaosongshu/elasticsearch",
+            "version": "v2.0.5",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/xiaosongshu/elasticsearch/v2.0.5/xiaosongshu-elasticsearch-v2.0.5.zip",
+                "reference": "db16c1d5cb7a8ad9355ee42686aad8a4702e8e0a",
+                "shasum": ""
+            },
+            "require": {
+                "elasticsearch/elasticsearch": "^7.17",
+                "ext-curl": "*",
+                "php": ">=7.3.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "9.6.x-dev"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Xiaosongshu\\Elasticsearch\\": "src/"
+                }
+            },
+            "license": [
+                "mit"
+            ],
+            "authors": [
+                {
+                    "name": "yanglong",
+                    "email": "2723659854@qq.com"
+                }
+            ],
+            "description": "an elasticsearch sdk for php.",
+            "support": {
+                "issues": "https://github.com/2723659854/elasticsearch/issues",
+                "source": "https://github.com/2723659854/elasticsearch/tree/v2.0.5"
+            },
+            "time": "2025-11-11T07:14:54+00:00"
+        },
+        {
+            "name": "yzh52521/easyhttp",
+            "version": "v1.1.3",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/yzh52521/easyhttp/v1.1.3/yzh52521-easyhttp-v1.1.3.zip",
+                "reference": "02bcf47eaf723520fa3905d0e6f1852168fe646c",
+                "shasum": ""
+            },
+            "require": {
+                "guzzlehttp/guzzle": "^6.0|^7.0",
+                "php": ">=7.2.5",
+                "psr/log": "^1.0|^2.0|^3.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "yzh52521\\EasyHttp\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "yzh52521",
+                    "email": "396751927@qq.com"
+                }
+            ],
+            "description": "EasyHttp 是一个轻量级、语义化、对IDE友好的HTTP客户端,支持常见的HTTP请求、异步请求和并发请求,让你可以快速地使用 HTTP 请求与其他 Web 应用进行通信。",
+            "homepage": "https://github.com/yzh52521/easyhttp",
+            "keywords": [
+                "EasyHttp",
+                "curl",
+                "easy-http",
+                "http",
+                "php",
+                "php-http",
+                "phphttp"
+            ],
+            "support": {
+                "issues": "https://github.com/yuanzhihai/easyhttp/issues",
+                "source": "https://github.com/yuanzhihai/easyhttp/tree/v1.1.3"
+            },
+            "time": "2023-11-14T05:49:02+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"
+}

+ 26 - 0
config/app.php

@@ -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,
+];

+ 21 - 0
config/autoload.php

@@ -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',
+    ]
+];

+ 18 - 0
config/bootstrap.php

@@ -0,0 +1,18 @@
+<?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,
+    Webman\ThinkOrm\ThinkOrm::class,
+];

+ 15 - 0
config/container.php

@@ -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;

+ 15 - 0
config/dependence.php

@@ -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 [];

+ 5 - 0
config/event.php

@@ -0,0 +1,5 @@
+<?php
+
+return [
+    
+];

+ 17 - 0
config/exception.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\exception\Handler::class,
+];

+ 32 - 0
config/log.php

@@ -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],
+                ],
+            ]
+        ],
+    ],
+];

+ 15 - 0
config/middleware.php

@@ -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 [];

+ 32 - 0
config/plugin/hhink/webman-sms/app.php

@@ -0,0 +1,32 @@
+<?php
+
+use Overtrue\EasySms\Strategies\OrderStrategy;
+
+return [
+    'enable' => true,
+
+    // HTTP 请求的超时时间(秒)
+    'timeout' => 5.0,
+
+    // 默认发送配置
+    'default' => [
+        // 网关调用策略,默认:顺序调用
+        'strategy' => OrderStrategy::class,
+
+        // 默认可用的发送网关
+        'gateways' => [
+            'aliyun',
+        ],
+    ],
+    // 可用的网关配置
+    'gateways' => [
+        'errorlog' => [
+            'file' => '/tmp/easy-sms.log',
+        ],
+        'aliyun' => [
+            'access_key_id' => '************',
+            'access_key_secret' => '**********************',
+            'sign_name' => '签名',
+        ],
+    ],
+];

+ 35 - 0
config/plugin/linfly/annotation/annotation.php

@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * Created by PhpStorm.
+ * User: LinFei
+ * Created time 2022/10/10 10:57:15
+ * E-mail: fly@eyabc.cn
+ */
+declare (strict_types=1);
+
+return [
+    // 注解扫描路径
+    'include_paths' => [
+        // 应用目录 支持通配符: * , 例如: app/*, app/*.php
+        'app',
+    ],
+    // 扫描排除的路径 支持通配符: *
+    'exclude_paths' => [
+        'app/model',
+    ],
+    // 路由设置
+    'route' => [
+        // 如果注解路由 @Route() 未传参则默认使用方法名作为path
+        'use_default_method' => true,
+    ],
+    // 验证器注解
+    'validate' => [
+        // 验证器验证处理类 (该功能需要自行安装对应的验证器扩展包),目前只支持 think-validate
+        'handle' => LinFly\Annotation\Validate\Handle\ThinkValidate::class,
+        // 验证失败处理方法
+        'fail_handle' => function (Webman\Http\Request $request, string $message) {
+            return json(['code' => 500, 'msg' => $message]);
+        }
+    ],
+];

+ 4 - 0
config/plugin/linfly/annotation/app.php

@@ -0,0 +1,4 @@
+<?php
+return [
+    'enable' => true,
+];

+ 19 - 0
config/plugin/linfly/annotation/bootstrap.php

@@ -0,0 +1,19 @@
+<?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 LinFly\Annotation\Bootstrap;
+
+return [
+    AnnotationBootstrap::class
+];

+ 17 - 0
config/plugin/linfly/annotation/route.php

@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * Created by PhpStorm.
+ * User: LinFei
+ * Created time 2022/10/10 10:52:22
+ * E-mail: fly@eyabc.cn
+ */
+declare (strict_types=1);
+
+namespace LinFly\Annotation\Handle;
+
+use LinFly\Annotation\Bootstrap\AnnotationBootstrap;
+
+if (!AnnotationBootstrap::isIgnoreProcess()) {
+    RouteAnnotationHandle::createRoute();
+}

+ 71 - 0
config/plugin/shopwwi/auth/app.php

@@ -0,0 +1,71 @@
+<?php
+
+ return [
+     'enable' => true,
+     'app_key' => 'base64:N721v3Gt2I58HH7oiU7a70PQ+i8ekPWRqwI+JSnM1wo=',
+     'guard' => [
+         'user' => [
+             'key' => 'id',
+             'field' => ['id','name','email','mobile'], //设置允许写入扩展中的字段
+             'num' => 0, //-1为不限制终端数量 0为只支持一个终端在线 大于0为同一账号同终端支持数量 建议设置为1 则同一账号同终端在线1个
+             'model'=> app\model\Test::class // 当为数组时 [app\model\Test::class,'thinkphp'] 来说明模型归属
+         ]
+     ],
+     'jwt' => [
+         'redis' => false,
+         // redis前缀
+         'redis_prefix' => '',
+         // 算法类型 ES256、HS256、HS384、HS512、RS256、RS384、RS512
+         'algorithms' => 'HS256',
+         // access令牌秘钥
+         'access_secret_key' => 'w5LgNx5luRRjmamZFSqz3cPHOp9KuQPExlvgi18DN4SdnSI9obcVEhiZVE0NIIC7',
+         // access令牌过期时间,单位秒。默认 2 小时
+         'access_exp' => 36000,
+         // refresh令牌秘钥
+         'refresh_secret_key' => 'w5LgNx5luRRjmamZFSqz3cPHOp9KuQPExlvgi18DN4SdnSI9obcVEhiZVE0NIIC7',
+         // refresh令牌过期时间,单位秒。默认 7 天
+         'refresh_exp' => 72000,
+         // 令牌签发者
+         'iss' => 'webman',
+         // 令牌签发时间
+         'iat' => time(),
+
+         /**
+          * access令牌 RS256 私钥
+          * 生成RSA私钥(Linux系统):openssl genrsa -out access_private_key.key 1024 (2048)
+          */
+         'access_private_key' => <<<EOD
+-----BEGIN RSA PRIVATE KEY-----
+...
+-----END RSA PRIVATE KEY-----
+EOD,
+         /**
+          * access令牌 RS256 公钥
+          * 生成RSA公钥(Linux系统):openssl rsa -in access_private_key.key -pubout -out access_public_key.key
+          */
+         'access_public_key' => <<<EOD
+-----BEGIN PUBLIC KEY-----
+...
+-----END PUBLIC KEY-----
+EOD,
+
+         /**
+          * refresh令牌 RS256 私钥
+          * 生成RSA私钥(Linux系统):openssl genrsa -out refresh_private_key.key 1024 (2048)
+          */
+         'refresh_private_key' => <<<EOD
+-----BEGIN RSA PRIVATE KEY-----
+...
+-----END RSA PRIVATE KEY-----
+EOD,
+         /**
+          * refresh令牌 RS256 公钥
+          * 生成RSA公钥(Linux系统):openssl rsa -in refresh_private_key.key -pubout -out refresh_public_key.key
+          */
+         'refresh_public_key' => <<<EOD
+-----BEGIN PUBLIC KEY-----
+...
+-----END PUBLIC KEY-----
+EOD,
+     ],
+ ];

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 11 - 0
config/plugin/tinywan/captcha/app.php


+ 76 - 0
config/plugin/tinywan/storage/app.php

@@ -0,0 +1,76 @@
+<?php
+/**
+ * @desc app.php 描述信息
+ *
+ * @author Tinywan(ShaoBo Wan)
+ * @date 2022/3/10 19:46
+ */
+
+return [
+    'enable' => true,
+    'storage' => [
+        'default' => 'local', // local:本地 oss:阿里云 cos:腾讯云 qos:七牛云
+        'single_limit' => 1024 * 1024 * 200, // 单个文件的大小限制,默认200M 1024 * 1024 * 200
+        'total_limit' => 1024 * 1024 * 200, // 所有文件的大小限制,默认200M 1024 * 1024 * 200
+        'nums' => 10, // 文件数量限制,默认10
+        'include' => [], // 被允许的文件类型列表
+        'exclude' => [], // 不被允许的文件类型列表
+        // 本地对象存储
+        'local' => [
+            'adapter' => \Tinywan\Storage\Adapter\LocalAdapter::class,
+            'root' => runtime_path().'/storage',
+            'dirname' => function () {
+                return date('Ymd');
+            },
+            'domain' => 'http://127.0.0.1:8787',
+            'uri' => '/runtime', // 如果 domain + uri 不在 public 目录下,请做好软链接,否则生成的url无法访问
+            'algo' => 'sha1',
+        ],
+        // 阿里云对象存储
+        'oss' => [
+            'adapter' => \Tinywan\Storage\Adapter\OssAdapter::class,
+            'accessKeyId' => 'xxxxxxxxxxxx',
+            'accessKeySecret' => 'xxxxxxxxxxxx',
+            'bucket' => 'resty-webman',
+            'dirname' => function () {
+                return 'storage';
+            },
+            'domain' => 'http://webman.oss.tinywan.com',
+            'endpoint' => 'oss-cn-hangzhou.aliyuncs.com',
+            'algo' => 'sha1',
+        ],
+        // 腾讯云对象存储
+        'cos' => [
+            'adapter' => \Tinywan\Storage\Adapter\CosAdapter::class,
+            'secretId' => 'xxxxxxxxxxxxx',
+            'secretKey' => 'xxxxxxxxxxxx',
+            'bucket' => 'resty-webman-xxxxxxxxx',
+            'dirname' => 'storage',
+            'domain' => 'http://webman.oss.tinywan.com',
+            'region' => 'ap-shanghai',
+        ],
+        // 七牛云对象存储
+        'qiniu' => [
+            'adapter' => \Tinywan\Storage\Adapter\QiniuAdapter::class,
+            'accessKey' => 'xxxxxxxxxxxxx',
+            'secretKey' => 'xxxxxxxxxxxxx',
+            'bucket' => 'resty-webman',
+            'dirname' => 'storage',
+            'domain' => 'http://webman.oss.tinywan.com',
+        ],
+        // aws
+        's3' => [
+            'adapter' => \Tinywan\Storage\Adapter\S3Adapter::class,
+            'key' => 'xxxxxxxxxxxxx',
+            'secret' => 'xxxxxxxxxxxxx',
+            'bucket' => 'resty-webman',
+            'dirname' => 'storage',
+            'domain' => 'http://webman.oss.tinywan.com',
+            'region' => 'S3_REGION',
+            'version' => 'latest',
+            'use_path_style_endpoint' => true,
+            'endpoint' => 'S3_ENDPOINT',
+            'acl' => 'public-read',
+        ],
+    ],
+];

+ 24 - 0
config/plugin/webman/console/app.php

@@ -0,0 +1,24 @@
+<?php
+return [
+    'enable' => true,
+
+    'build_dir'  => BASE_PATH . DIRECTORY_SEPARATOR . 'build',
+
+    'phar_filename' => 'webman.phar',
+
+    'bin_filename' => 'webman.bin',
+
+    'signature_algorithm'=> Phar::SHA256, //set the signature algorithm for a phar and apply it. The signature algorithm must be one of Phar::MD5, Phar::SHA1, Phar::SHA256, Phar::SHA512, or Phar::OPENSSL.
+
+    'private_key_file'  => '', // The file path for certificate or OpenSSL private key file.
+
+    'exclude_pattern'   => '#^(?!.*(composer.json|/.github/|/.idea/|/.git/|/.setting/|/runtime/|/vendor-bin/|/build/|/vendor/webman/admin/))(.*)$#',
+
+    'exclude_files'     => [
+        '.env', 'LICENSE', 'composer.json', 'composer.lock', 'start.php', 'webman.phar', 'webman.bin'
+    ],
+
+    'custom_ini' => '
+memory_limit = 256M
+    ',
+];

+ 4 - 0
config/plugin/webman/event/app.php

@@ -0,0 +1,4 @@
+<?php
+return [
+    'enable' => true,
+];

+ 17 - 0
config/plugin/webman/event/bootstrap.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 [
+    Webman\Event\BootStrap::class,
+];

+ 7 - 0
config/plugin/webman/event/command.php

@@ -0,0 +1,7 @@
+<?php
+
+use Webman\Event\EventListCommand;
+
+return [
+    EventListCommand::class
+];

+ 14 - 0
config/plugin/webman/rate-limiter/app.php

@@ -0,0 +1,14 @@
+<?php
+return [
+    'enable' => true,
+    'driver' => 'auto', // auto, apcu, memory, redis
+    'stores' => [
+        'redis' => [
+            'connection' => 'default',
+        ]
+    ],
+    // 这些ip的请求不做频率限制
+    'ip_whitelist' => [
+        '127.0.0.1',
+    ],
+];

+ 17 - 0
config/plugin/webman/rate-limiter/bootstrap.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 [
+    Webman\RateLimiter\Bootstrap::class
+];

+ 8 - 0
config/plugin/webman/rate-limiter/middleware.php

@@ -0,0 +1,8 @@
+<?php
+use Webman\RateLimiter\Limiter;
+
+return [
+    '@' => [
+        Limiter::class
+    ],
+];

+ 4 - 0
config/plugin/webman/redis-queue/app.php

@@ -0,0 +1,4 @@
+<?php
+return [
+    'enable' => true,
+];

+ 7 - 0
config/plugin/webman/redis-queue/command.php

@@ -0,0 +1,7 @@
+<?php
+
+use Webman\RedisQueue\Command\MakeConsumerCommand;
+
+return [
+    MakeConsumerCommand::class
+];

+ 32 - 0
config/plugin/webman/redis-queue/log.php

@@ -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/redis-queue/queue.log',
+                    7, //$maxFiles
+                    Monolog\Logger::DEBUG,
+                ],
+                'formatter' => [
+                    'class' => Monolog\Formatter\LineFormatter::class,
+                    'constructor' => [null, 'Y-m-d H:i:s', true],
+                ],
+            ]
+        ],
+    ]
+];

+ 11 - 0
config/plugin/webman/redis-queue/process.php

@@ -0,0 +1,11 @@
+<?php
+return [
+    'consumer'  => [
+        'handler'     => Webman\RedisQueue\Process\Consumer::class,
+        'count'       => 8, // 可以设置多进程同时消费
+        'constructor' => [
+            // 消费者类目录
+            'consumer_dir' => app_path() . '/queue/redis'
+        ]
+    ]
+];

+ 21 - 0
config/plugin/webman/redis-queue/redis.php

@@ -0,0 +1,21 @@
+<?php
+return [
+    'default' => [
+        'host' => 'redis://127.0.0.1:6379',
+        'options' => [
+            'auth' => null,
+            'db' => 0,
+            'prefix' => '',
+            'max_attempts'  => 5,
+            'retry_seconds' => 5,
+        ],
+        // Connection pool, supports only Swoole or Swow drivers.
+        'pool' => [
+            'max_connections' => 5,
+            'min_connections' => 1,
+            'wait_timeout' => 3,
+            'idle_timeout' => 60,
+            'heartbeat_interval' => 50,
+        ]
+    ],
+];

+ 62 - 0
config/process.php

@@ -0,0 +1,62 @@
+<?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' => '',
+        '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 === '/',
+            ]
+        ]
+    ]
+];

+ 29 - 0
config/redis.php

@@ -0,0 +1,29 @@
+<?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' => [
+        'password' => '',
+        'host' => '127.0.0.1',
+        'port' => 6379,
+        'database' => 0,
+        'pool' => [
+            'max_connections' => 5,
+            'min_connections' => 1,
+            'wait_timeout' => 3,
+            'idle_timeout' => 60,
+            'heartbeat_interval' => 50,
+        ],
+    ]
+];

+ 21 - 0
config/route.php

@@ -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;
+
+
+
+
+
+

+ 23 - 0
config/server.php

@@ -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
+];

+ 65 - 0
config/session.php

@@ -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],
+
+];

+ 23 - 0
config/static.php

@@ -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,
+    ],
+];

+ 38 - 0
config/think-cache.php

@@ -0,0 +1,38 @@
+<?php
+return [
+    // 默认缓存驱动
+    'default' => 'redis',
+    // 缓存连接方式配置
+    'stores'  => [
+        // redis缓存
+        'redis' => [
+            // 驱动方式
+            'type' => 'redis',
+            // 服务器地址
+            'host' => '127.0.0.1',
+            // 缓存前缀
+            'prefix' => 'cache:',
+            // 默认缓存有效期 0表示永久缓存
+            'expire'     => 0,
+            // Thinkphp官方没有这个参数,由于生成的tag键默认不过期,如果tag键数量很大,避免长时间占用内存,可以设置一个超过其他缓存的过期时间,0为不设置
+            'tag_expire' => 86400 * 30,
+            // 缓存标签前缀
+            'tag_prefix' => 'tag:',
+            // 连接池配置
+            'pool' => [
+                'max_connections' => 5, // 最大连接数
+                'min_connections' => 1, // 最小连接数
+                'wait_timeout' => 3,    // 从连接池获取连接等待超时时间
+                'idle_timeout' => 60,   // 连接最大空闲时间,超过该时间会被回收
+                'heartbeat_interval' => 50, // 心跳检测间隔,需要小于60秒
+            ],
+        ],
+        // 文件缓存
+        'file' => [
+            // 驱动方式
+            'type' => 'file',
+            // 设置不同的缓存保存目录
+            'path' => runtime_path() . '/file/',
+        ],
+    ],
+];

+ 42 - 0
config/think-orm.php

@@ -0,0 +1,42 @@
+<?php
+
+return [
+    'default' => 'mysql',
+    'connections' => [
+        'mysql' => [
+            // 数据库类型
+            'type' => 'mysql',
+            // 服务器地址
+            'hostname' => '127.0.0.1',
+            // 数据库名
+            'database' => 'test',
+            // 数据库用户名
+            'username' => 'root',
+            // 数据库密码
+            'password' => '123456',
+            // 数据库连接端口
+            'hostport' => '3306',
+            // 数据库连接参数
+            'params' => [
+                // 连接超时3秒
+                \PDO::ATTR_TIMEOUT => 3,
+            ],
+            // 数据库编码默认采用utf8
+            'charset' => 'utf8',
+            // 数据库表前缀
+            'prefix' => '',
+            // 断线重连
+            'break_reconnect' => true,
+            // 连接池配置
+            'pool' => [
+                'max_connections' => 5, // 最大连接数
+                'min_connections' => 1, // 最小连接数
+                'wait_timeout' => 3,    // 从连接池获取连接等待超时时间
+                'idle_timeout' => 60,   // 连接最大空闲时间,超过该时间会被回收
+                'heartbeat_interval' => 50, // 心跳检测间隔,需要小于60秒
+            ],
+        ],
+    ],
+    // 自定义分页类
+    'paginator' =>  '',
+];

+ 25 - 0
config/translation.php

@@ -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',
+];

+ 22 - 0
config/view.php

@@ -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
+];

BIN
public/favicon.ico


+ 4 - 0
runtime/.gitignore

@@ -0,0 +1,4 @@
+*
+!logs
+!views
+!.gitignore

+ 2 - 0
runtime/logs/.gitignore

@@ -0,0 +1,2 @@
+*
+!.gitignore

+ 2 - 0
runtime/views/.gitignore

@@ -0,0 +1,2 @@
+*
+!.gitignore

+ 5 - 0
start.php

@@ -0,0 +1,5 @@
+#!/usr/bin/env php
+<?php
+chdir(__DIR__);
+require_once __DIR__ . '/vendor/autoload.php';
+support\App::run();

+ 24 - 0
support/Request.php

@@ -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
+{
+
+}

+ 24 - 0
support/Response.php

@@ -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
+{
+
+}

+ 139 - 0
support/bootstrap.php

@@ -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);
+

+ 2 - 0
vendor/aliyuncs/oss-sdk-php/.coveralls.yml

@@ -0,0 +1,2 @@
+coverage_clover: coverage.xml
+json_path: coverage.json

+ 8 - 0
vendor/aliyuncs/oss-sdk-php/.gitignore

@@ -0,0 +1,8 @@
+vendor
+composer.lock
+doc
+output
+.idea
+.buildpath
+.project
+.settings

+ 21 - 0
vendor/aliyuncs/oss-sdk-php/.travis.yml

@@ -0,0 +1,21 @@
+language: php
+php:
+  - 7.1
+  - 7.0
+  - 5.6
+  - 5.5
+  - 5.4
+install:
+  - composer self-update
+  - composer install --no-interaction
+script:
+  - php vendor/bin/phpunit
+after_success:
+  - php vendor/bin/coveralls -v
+env:
+  global:
+    - secure: SzmQ854lQmhV6ZkAG7lQNTY3CkazrXnDSb6VMwPU/sdaLGxPO159AW3fJS5d0sO/XN1P8x5WNkoA4i9soDlLBRibEEISNUM/2EMnpszsRymZ9o97PrS2IgORXTUL/OF+rpATzyNVB2p+2l9hBLiGf17exMSA5iOeY7W6E+VKPGi8TFykgbGUnLKU0h1hV3rzmtfGjOXcSpvYU/hxeZD/J/+6m5Gic9b/pNS+AbfTj7Y7Ru9tNsnyUP29V/vtEYtpQir3ZxQiSiUv9idybgGnJBOMYydJofb/mpFYHhYLSWqtMKGNLpeawmqs4z8S1Tvx5U5uzW5+h/mpzhvBaFlWGpm8t89BQxun5LVX5NiYCrV7TqaLitGp1cSpMjMDnrnSTNzk1exVz+rWZZcWS7yB9ULYA681GA8StXWk167qB7Y30iK1dFK3+2mDN2cEY+qLs8+bupDowQ4eOM+eqfhxX8F8+ouKcKomETsjiIwL+CUsIe6wjvnYFWb1YlRhbsI75bblHApflohnt6gVSJ78ZPqID+u2oUMjmIWXLTnRR2Y2tgEW8uqHeIoQ8BBntLdQDmv0BO4FpnGQIwrUUwQYeNzEM0DOr3hWZhyDR6Xvl+9H0l52xjANaSqpuTZfC3zmeFTG7kIjydvxNePRrony6XAawL9BvI7aKWuVF6YVjPM=
+    - secure: nEhsU8aUQqsAJeuger+boh51oTpeo4YNG7vUWbKxdwVDIrcLb+l7r7RvTlxU7mt8IZTWwicgri18mh+Wi04BwX4ulBA1SCs8jPbL51KEo5izoDGGtLSd2fuPHdslYSrwagrvq90EPnDT/7fHWn/TAoT+rueZzjNyCu5IGSgL3GnXaUThsJ82NMePL2YRdP4Q1qmtZPRFBOkOQ6F0heuV8fw8sLyTO3txaCQum9YneGxrWxOl/E8zB0qtlnPwLE8ogaHZMQh2/jThmTbI5UqwRTxV4f0qoD5eJYH+j0fslsSAjsg/HPnSuVcnccK3zSU+s2sV4dPCcISzECJvZEObwipfxOGhdqt5gMcxHhn8qVsbT97iIh106pG/BJCDgQd2EeVW8WfCi6cCuCKIMipvVkMypkmjQHWU1XaqPzILl7g5diW9Ctp2C4Akq5dYdrdu8IrnVK1ShtkQVaWU+S/Bht8VU5gYP7olPW/GdTz7sceU1NOIC4NPXqmWKbfavR98U5dkHMLMvzABYL1Q87h+KhPD1c14NUyw3YENUW7REiF/X5lERRm5H0kJ/1JqAa+AgeHQEGmPVuZV2s/na4b0S1479QRVmSM/6ZzXQpU+Y8jCRfETpUFA4S331369kirHgCqDlxyIntuEKrzivD02/O+5C3eJ0WHRz6QsN2/R4qg=
+    - secure: ZTvzNXEZP4efl+a/3VGMmdabfUQp83v5/lecMns039Ro7UuZYPdtbPtpPnpjaTI6Htd22A4Rva5BU/3JCQJAyQvpbKNn5sGou2SmfQu3o0SyhggSB7gWjYAf707aW1j4bHYfP8IjDS5NjuVk3AqXeNSUuLRUXRmwSOB0lSYiRhiTJY+pUdBl382Hx4NbhIU/gmOzRoJCs7coTip8IURXYEHPi5dnDWluajxI+TgNXFccSgEleeQDJajYgXmpLb2EhSj8piipOnVgaCEE5bh5fbp32024Qq38SGHKcbfnwj2IInpZpZESJknRKoqAlFjdOJhork82dBcvAr5JxCBZKx5IuwXcTjxkQ6tRtBeqhPLPFuX3MQ8WrtU+wniPM0RCH/VoFkUKO7JGQDwmoi2AKago4PsuDs4P6Y6CeuOVpcso731GwwMNhIJcyrJJivXprQNEGsEw+9wLjU1qNYs6IIA3S/gPzFrNbdX5Wf8vxt0vLpgYvBNtPnLMejMtknuyfVzf5iKuVVoGPDTEz+ajs06+jfoPfm/4sLTaLghuVH7Adm74OpF769JQNnQYKwJuu4bNlcbLJChulCEMBOx7myqo/9O6RCTuqzHaGmVWNot4RGqRFHgJGl/JJf0WpAVitbhbRH3kGoyKb6jFM74CJbPsE7OORlJLDC3cdD3C8Pk=
+    - secure: Qr5NR4CVzBKCQgRgMH0x772TPJ1+brx3UCvtRNu8fi4j3p8bz+HDMjBaBDSFmEB09nunLI55/8mj88/5GXmnpFs8+CPTkcW+QZOcxg3cxpI4SNmxoB12/ZawlFHAqSUaRRE7RUWVkY3KL8tIGjEZcFyUBQ1DVNX3OMpiKs3NLtHa7oUIknyBxdSokm4kpLhSXYe7WmO0vhuZbMZE0S1EISToiBS6AdhGUEbTLJ/vNsIDY07fu6+Vh3HxVbyUFPqUZGlkZpQ+2xMJ3kiqPBMrXtRF/IhhPjORDil6Ns9SQ8/AAlaCddvYvRaT4Pjv2/aX+t3l28qI1qmryPtWXpce5UXecWGYqdRpSJc6Y/pEt4m4FeeGoEFWnSPGIs7FRmeiis8q2rojGZ18i4vI/k4iHmqEBnTlMp3SWnRb9L1adJ8ZAWln8aC88gkQXm67w7+1CxLycerbYj9H1ugqHENuHcxv4uHUcZgEENX3EWatu8i9+K2IUuU/2zcmpu7qtsziYcoyW8DOOmYpJfXGMLtmF9+pqp/Tp6i0tltFSEfmY3N8o7xvv3enLvFHsjL+3ElFdd1blUPSrvZJHgA9M3lJ+QF1RJZCpJqgPlQ0XOZK1Bf4P46zpEj01wKaK4JQrkLPRXhbBOuIJn5O6WlFJyPX4+SaBfwTzb4AvM4aUg2TgTg=
+    - secure: Inw5ftA8fxvhMHRZwoZzATxn4WICJsCq7ZX4y2gI+b/8u0JQIsbLgY9WTYV+XdSxOoNwuVa1oUxEWI0aDORtXKC3XaIXXKrwndag0zxS77JEYwWvQsjM7BhEbF7MF7MYk8rRXpn6mbfGAT/NfqEOx91RCY8UKeMzD0oPkpkBnJ9Ekuod6JBBq+7j3v4mYUItA8pxvw7b4Pdd4z2xzjgOwNhJYMOCpts50DWZI+WXj0HvTYaMXe5mJJtORK5lsr0a9cbsBqAzE6l+3zGI8XkgHn130ux5XH3DE7hZBeti3ZNaO3d2Vv+496/1EObG0rSFk+z3dmNKqjMz4nh3bYIkdLMegwmgCWs2mvQhkwYhzmnPRHVSERrgZjSWnuKn2PKnBar6tui9KaLNgpo2j3jWpwMLJ3bGAfE5JtMppxAxNqj/q+YB2UZo7Mn7EDjkTDjgxCuazTJwWqH7xxCOykWPABBI17P3JaOXQJEK39LavpfSMm3kdmU0ocpUs7FniLuFm6xL71VxY1wHG10yskczEcFHZ3iyIyGM+xum4vbt5y6Yg+zfdExYQsbrxHDDZ3HbHY3tEU0WhM55vrC42NIXRWqXqJ8OAxpl4nivfx96eoBAThiUU9xXtZmh7WRFVYsstoGtxZwfk5+bi+oeVO9kih4xabwbgHgL9BTc1TR1C4U=

+ 159 - 0
vendor/aliyuncs/oss-sdk-php/CHANGELOG.md

@@ -0,0 +1,159 @@
+# ChangeLog - Aliyun OSS SDK for PHP
+
+## v2.7.2 / 2024-10-28
+* Added: presign supports response-* parameters
+* Added: forcePathStyle option.
+
+## v2.7.1 / 2024-02-28
+* Fixed: fix deprecated
+
+## v2.7.0 / 2024-02-02
+* Added: support signature version 4.
+* Added: support checkObjectEndcoding option.
+* Added: support strictObjectName option.
+* Added: support filePathCompatible option.
+* Added: support path style.
+* Added: support environment variables credentials provider.
+* Update: add filed for some api.
+* Fixed: fix some bugs.
+
+## v2.6.0 / 2022-08-03
+* Added: support credentials provider.
+* Fixed: compatible with swoole curl handler.
+* Added: support more bucket stat info.
+
+## v2.5.0 / 2022-05-13
+* Added: support bucket transfer acceleration.
+* Added: support bucket cname token.
+* Added: support listobjectsV2.
+
+## v2.4.3 / 2021-08-25
+* Fixed: integer overflow in PHP5.x.
+
+## v2.4.2 / 2021-06-04
+* Compatible with PHP8.
+* Fixed: compatible with PHP5.4.
+* Fixed: the signature is incorrect in some scenarios
+* Update: change $requestUrl from a member variable to a local variable.
+
+## v2.4.1 / 2020-09-29
+* Fixed: the getBucketPolicy bug.
+
+
+## v2.4.0 / 2020-08-31
+
+* Added: disable Expect: 100-continue
+* Added: support getBucketInfo
+* Added: support getBucketStat
+* Added: support bucket policy
+* Added: support bucket encryption
+* Added: support bucket tagging
+* Added: support bucket  worm
+* Added: support versioning
+* Added: support request payment
+* Added: support object tagging
+* Added: support code archive
+* Added: support process object 
+* Added: support traffic limit paramter 
+* Added: support upload object from file handle
+* Added: support getSimplifiedObjectMeta
+* Fixed: the object name can not be '0' stirng.
+* Update: endpoint validity check
+* Update: add new pre-signed url api
+
+
+## v2.3.1 / 2019-01-15
+
+* translate chinese comments into english
+* Added: endpoint validity check
+
+## v2.3.0 / 2018-01-05
+
+* Fixed: putObject support creating empty files
+* Fixed: createBucket support IA/Archive
+* Added: support restoreObject
+* Added: support the Symlink feature
+* Added: support getBucketLocation
+* Added: support getBucketMeta
+* Added: support proxy server Proxy
+
+## v2.2.4 / 2017-04-25
+
+* Fixed getObject to local file bug
+
+## v2.2.3 / 2017-04-14
+
+* Fixed md5 check
+
+## v2.2.2 / 2017-01-18
+
+* Resolve to run the connection number and memory bug on php7
+
+## v2.2.1 / 2016-12-01
+
+* No HTTP curl is allowed to automatically populate accept-encoding
+
+## v2.2.0 / 2016-11-22
+
+* Fixed PutObject/CompleteMultipartUpload return values(#26)
+
+## v2.1.0 / 2016-11-12
+
+* Added[RTMP](https://help.aliyun.com/document_detail/44297.html)interface
+* Add support[image service](https://help.aliyun.com/document_detail/44686.html)
+
+## v2.0.7 / 2016-06-17
+
+* Support append object
+
+## v2.0.6
+
+* Trim access key id/secret and endpoint
+* Refine tests and setup travis CI
+
+## v2.0.5
+
+* Added Add/Delete/Get BucketCname interface
+
+## v2.0.4
+
+* Added Put/Get Object Acl interface
+
+## v2.0.3
+
+* Fixing the constants in Util is defined in a PHP version that is less than 5.6.
+
+## v2.0.2
+
+* The problem of content-type cannot be specified when restoring multipart uploads
+
+## v2.0.1
+
+* Increase the ListObjects/ListMultipartUploads special characters
+* Provides the interface to get the details of the OssException
+
+
+## 2015.11.25
+
+* **Large version upgrade, no longer compatible with previous interface, new version has made great improvements to ease of use, suggesting that users migrate to a new version.**
+
+## Modify the content
+
+* PHP 5.2 is no longer supported
+
+### Add the cotent
+
+* Introduce namespace
+* Interface naming and modification, using hump naming
+* The interface is modified, and the common parameters are extracted from the Options parameter.
+* The interface returns the result modification, processing the return result, and the user can directly get the data structure easily processed 
+* OssClient's constructor changes
+* The Endpoint address that support CNAME and IP formats
+* Rearrange the sample file organization structure and use function to organize the function points
+* Add an interface that sets the connection timeout and requests timeout
+* Remove the outdated interface associated with the Object Group
+* The message in the OssException is changed to English
+
+### Repair problem
+
+* The object name is not complete

+ 21 - 0
vendor/aliyuncs/oss-sdk-php/LICENSE.md

@@ -0,0 +1,21 @@
+#The MIT License (MIT)
+
+Copyright (c) ali-sdk and other 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.

+ 149 - 0
vendor/aliyuncs/oss-sdk-php/README-CN.md

@@ -0,0 +1,149 @@
+# Aliyun OSS SDK for PHP
+
+[![Latest Stable Version](https://poser.pugx.org/aliyuncs/oss-sdk-php/v/stable)](https://packagist.org/packages/aliyuncs/oss-sdk-php)
+[![Build Status](https://travis-ci.org/aliyun/aliyun-oss-php-sdk.svg?branch=master)](https://travis-ci.org/aliyun/aliyun-oss-php-sdk)
+[![Coverage Status](https://coveralls.io/repos/github/aliyun/aliyun-oss-php-sdk/badge.svg?branch=master)](https://coveralls.io/github/aliyun/aliyun-oss-php-sdk?branch=master)
+
+## [README of English](https://github.com/aliyun/aliyun-oss-php-sdk/blob/master/README.md)
+
+## 概述
+
+阿里云对象存储(Object Storage Service,简称OSS),是阿里云对外提供的海量、安全、低成本、高可靠的云存储服务。用户可以通过调用API,在任何应用、任何时间、任何地点上传和下载数据,也可以通过用户Web控制台对数据进行简单的管理。OSS适合存放任意文件类型,适合各种网站、开发企业及开发者使用。
+
+
+## 运行环境
+- PHP 5.3+
+- cURL extension
+
+提示:
+
+- Ubuntu下可以使用apt-get包管理器安装php的cURL扩展 `sudo apt-get install php5-curl`
+
+## 安装方法
+
+1. 如果您通过composer管理您的项目依赖,可以在你的项目根目录运行:
+
+        $ composer require aliyuncs/oss-sdk-php
+
+   或者在你的`composer.json`中声明对Aliyun OSS SDK for PHP的依赖:
+
+        "require": {
+            "aliyuncs/oss-sdk-php": "~2.0"
+        }
+
+   然后通过`composer install`安装依赖。composer安装完成后,在您的PHP代码中引入依赖即可:
+
+        require_once __DIR__ . '/vendor/autoload.php';
+
+2. 您也可以直接下载已经打包好的[phar文件][releases-page],然后在你
+   的代码中引入这个文件即可:
+
+        require_once '/path/to/oss-sdk-php.phar';
+
+3. 下载SDK源码,在您的代码中引入SDK目录下的`autoload.php`文件:
+
+        require_once '/path/to/oss-sdk/autoload.php';
+
+## 快速使用
+
+### 常用类
+
+| 类名 | 解释 |
+|:------------------|:------------------------------------|
+|OSS\OssClient | OSS客户端类,用户通过OssClient的实例调用接口 |
+|OSS\Core\OssException | OSS异常类,用户在使用的过程中,只需要注意这个异常|
+
+### OssClient初始化
+
+SDK的OSS操作通过OssClient类完成的,下面代码创建一个OssClient对象:
+
+```php
+<?php
+$accessKeyId = "<您从OSS获得的AccessKeyId>"; ;
+$accessKeySecret = "<您从OSS获得的AccessKeySecret>";
+$endpoint = "<您选定的OSS数据中心访问域名,例如oss-cn-hangzhou.aliyuncs.com>";
+try {
+    $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
+} catch (OssException $e) {
+    print $e->getMessage();
+}
+```
+
+### 文件操作
+
+文件(又称对象,Object)是OSS中最基本的数据单元,您可以把它简单地理解为文件,用下面代码可以实现一个Object的上传:
+
+```php
+<?php
+$bucket = "<您使用的Bucket名字,注意命名规范>";
+$object = "<您使用的Object名字,注意命名规范>";
+$content = "Hello, OSS!"; // 上传的文件内容
+try {
+    $ossClient->putObject($bucket, $object, $content);
+} catch (OssException $e) {
+    print $e->getMessage();
+}
+```
+
+### 存储空间操作
+
+存储空间(又称Bucket)是一个用户用来管理所存储Object的存储空间,对于用户来说是一个管理Object的单元,所有的Object都必须隶属于某个Bucket。您可以按照下面的代码新建一个Bucket:
+
+```php
+<?php
+$bucket = "<您使用的Bucket名字,注意命名规范>";
+try {
+    $ossClient->createBucket($bucket);
+} catch (OssException $e) {
+    print $e->getMessage();
+}
+```
+
+### 返回结果处理
+
+OssClient提供的接口返回返回数据分为两种:
+
+* Put,Delete类接口,接口返回null,如果没有OssException,即可认为操作成功
+* Get,List类接口,接口返回对应的数据,如果没有OssException,即可认为操作成功,举个例子:
+
+```php
+<?php
+$bucketListInfo = $ossClient->listBuckets();
+$bucketList = $bucketListInfo->getBucketList();
+foreach($bucketList as $bucket) {
+    print($bucket->getLocation() . "\t" . $bucket->getName() . "\t" . $bucket->getCreateDate() . "\n");
+}
+```
+上面代码中的$bucketListInfo的数据类型是 `OSS\Model\BucketListInfo`
+
+
+### 运行Sample程序
+
+1. 修改 `samples/Config.php`, 补充配置信息
+2. 执行 `cd samples/ && php RunAll.php`
+
+### 运行单元测试
+
+1. 执行`composer install`下载依赖的库
+2. 设置环境变量
+
+        export OSS_ACCESS_KEY_ID=access-key-id
+        export OSS_ACCESS_KEY_SECRET=access-key-secret
+        export OSS_ENDPOINT=endpoint
+        export OSS_BUCKET=bucket-name
+
+3. 执行 `php vendor/bin/phpunit`
+
+## License
+
+- MIT
+
+## 联系我们
+
+- [阿里云OSS官方网站](http://oss.aliyun.com)
+- [阿里云OSS官方论坛](http://bbs.aliyun.com)
+- [阿里云OSS官方文档中心](http://www.aliyun.com/product/oss#Docs)
+- 阿里云官方技术支持:[提交工单](https://workorder.console.aliyun.com/#/ticket/createIndex)
+
+[releases-page]: https://github.com/aliyun/aliyun-oss-php-sdk/releases
+[phar-composer]: https://github.com/clue/phar-composer

+ 150 - 0
vendor/aliyuncs/oss-sdk-php/README.md

@@ -0,0 +1,150 @@
+# Alibaba Cloud OSS SDK for PHP
+
+[![Latest Stable Version](https://poser.pugx.org/aliyuncs/oss-sdk-php/v/stable)](https://packagist.org/packages/aliyuncs/oss-sdk-php)
+[![Build Status](https://travis-ci.org/aliyun/aliyun-oss-php-sdk.svg?branch=master)](https://travis-ci.org/aliyun/aliyun-oss-php-sdk)
+[![Coverage Status](https://coveralls.io/repos/github/aliyun/aliyun-oss-php-sdk/badge.svg?branch=master)](https://coveralls.io/github/aliyun/aliyun-oss-php-sdk?branch=master)
+
+## [README of Chinese](https://github.com/aliyun/aliyun-oss-php-sdk/blob/master/README-CN.md)
+
+## Overview
+
+Alibaba Cloud Object Storage Service (OSS) is a cloud storage service provided by Alibaba Cloud, featuring a massive capacity, security, a low cost, and high reliability. You can upload and download data on any application anytime and anywhere by calling APIs, and perform simple management of data through the web console. The OSS can store any type of files and therefore applies to various websites, development enterprises and developers.
+
+
+## Run environment
+- PHP 5.3+.
+- cURL extension.
+
+Tips:
+
+- In Ubuntu, you can use the ***apt-get*** package manager to install the *PHP cURL extension*: `sudo apt-get install php5-curl`.
+
+## Install OSS PHP SDK
+
+- If you use the ***composer*** to manage project dependencies, run the following command in your project's root directory:
+
+        composer require aliyuncs/oss-sdk-php
+
+   You can also declare the dependency on Alibaba Cloud OSS SDK for PHP in the `composer.json` file.
+
+        "require": {
+            "aliyuncs/oss-sdk-php": "~2.0"
+        }
+
+   Then run `composer install` to install the dependency. After the Composer Dependency Manager is installed, import the dependency in your PHP code: 
+
+        require_once __DIR__ . '/vendor/autoload.php';
+
+- You can also directly download the packaged [PHAR File][releases-page], and 
+   introduce the file to your code: 
+
+        require_once '/path/to/oss-sdk-php.phar';
+
+- Download the SDK source code, and introduce the `autoload.php` file under the SDK directory to your code: 
+
+        require_once '/path/to/oss-sdk/autoload.php';
+
+## Quick use
+
+### Common classes
+
+| Class | Explanation |
+|:------------------|:------------------------------------|
+|OSS\OssClient | OSS client class. An OssClient instance can be used to call the interface.  |
+|OSS\Core\OssException |OSS Exception class . You only need to pay attention to this exception when you use the OssClient. |
+
+### Initialize an OssClient
+
+The SDK's operations for the OSS are performed through the OssClient class. The code below creates an OssClient object:
+
+```php
+<?php
+$accessKeyId = "<AccessKeyID that you obtain from OSS>";
+$accessKeySecret = "<AccessKeySecret that you obtain from OSS>";
+$endpoint = "<Domain that you select to access an OSS data center, such as "oss-cn-hangzhou.aliyuncs.com>";
+try {
+    $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
+} catch (OssException $e) {
+    print $e->getMessage();
+}
+```
+
+### Operations on objects
+
+Objects are the most basic data units on the OSS. You can simply consider objects as files. The following code uploads an object:
+
+```php
+<?php
+$bucket= "<Name of the bucket in use. Pay attention to naming conventions>";
+$object = "<Name of the object in use. Pay attention to naming conventions>";
+$content = "Hello, OSS!"; // Content of the uploaded file
+try {
+    $ossClient->putObject($bucket, $object, $content);
+} catch (OssException $e) {
+    print $e->getMessage();
+}
+```
+
+### Operations on buckets
+
+Buckets are the space that you use to manage the stored objects. It is an object management unit for users. Each object must belong to a bucket. You can create a bucket with the following code:
+
+```php
+<?php
+$bucket= "<Name of the bucket in use. Pay attention to naming conventions>";
+try {
+    $ossClient->createBucket($bucket);
+} catch (OssException $e) {
+    print $e->getMessage();
+}
+```
+
+### Handle returned results
+
+The OssClient provides the following two types of returned data from interfaces:
+
+- Put and Delete interfaces: The *PUT* and *DELETE* operations are deemed successful if *null* is returned by the interfaces without *OSSException*.
+- Get and List interfaces: The *GET* and *LIST* operations are deemed successful if the desired data is returned by the interfaces without *OSSException*. For example, 
+
+    ```php
+    <?php
+    $bucketListInfo = $ossClient->listBuckets();
+    $bucketList = $bucketListInfo->getBucketList();
+    foreach($bucketList as $bucket) {
+        print($bucket->getLocation() . "\t" . $bucket->getName() . "\t" . $bucket->getCreateDate() . "\n");
+    }
+    ```
+In the above code, $bucketListInfo falls into the 'OSS\Model\BucketListInfo' data type.
+
+
+### Run a sample project
+
+- Modify `samples/Config.php` to complete the configuration information. 
+- Run `cd samples/ && php RunAll.php`. 
+
+### Run a unit test
+
+- Run `composer install` to download the dependent libraries. 
+- Set the environment variable. 
+
+        export OSS_ACCESS_KEY_ID=access-key-id
+        export OSS_ACCESS_KEY_SECRET=access-key-secret
+        export OSS_ENDPOINT=endpoint
+        export OSS_BUCKET=bucket-name
+
+- Run `php vendor/bin/phpunit`
+
+## License
+
+- MIT
+
+## Contact us
+
+- [Alibaba Cloud OSS official website](http://oss.aliyun.com).
+- [Alibaba Cloud OSS official forum](http://bbs.aliyun.com).
+- [Alibaba Cloud OSS official documentation center](http://www.aliyun.com/product/oss#Docs).
+- Alibaba Cloud official technical support: [Submit a ticket](https://workorder.console.aliyun.com/#/ticket/createIndex).
+
+[releases-page]: https://github.com/aliyun/aliyun-oss-php-sdk/releases
+[phar-composer]: https://github.com/clue/phar-composer
+

+ 11 - 0
vendor/aliyuncs/oss-sdk-php/autoload.php

@@ -0,0 +1,11 @@
+<?php
+
+function classLoader($class)
+{
+    $path = str_replace('\\', DIRECTORY_SEPARATOR, $class);
+    $file = __DIR__ . DIRECTORY_SEPARATOR .'src'. DIRECTORY_SEPARATOR . $path . '.php';
+    if (file_exists($file)) {
+        require_once $file;
+    }
+}
+spl_autoload_register('classLoader');

+ 13 - 0
vendor/aliyuncs/oss-sdk-php/build-phar.sh

@@ -0,0 +1,13 @@
+#! /usr/bin/env bash
+
+# Remove dev deps to reduce phar size
+rm -rf composer.lock vendor/
+
+# Generate composer.lock
+composer install --no-dev
+
+# Find SDK version
+version=$(grep 'const OSS_VERSION' src/OSS/OssClient.php | grep -oE '[0-9.]+')
+
+# Build phar
+phar-composer build . aliyun-oss-php-sdk-$version.phar

+ 24 - 0
vendor/aliyuncs/oss-sdk-php/composer.json

@@ -0,0 +1,24 @@
+{
+    "name": "aliyuncs/oss-sdk-php",
+    "description": "Aliyun OSS SDK for PHP",
+    "homepage": "http://www.aliyun.com/product/oss/",
+    "type": "library",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Aliyuncs",
+            "homepage": "http://www.aliyun.com"
+        }
+    ],
+    "require": {
+        "php":">=5.3"
+    },
+    "require-dev" : {
+        "phpunit/phpunit": "*",
+        "php-coveralls/php-coveralls": "*"
+    },
+    "minimum-stability": "stable",
+    "autoload": {
+        "psr-4": {"OSS\\": "src/OSS"}
+    }
+}

BIN
vendor/aliyuncs/oss-sdk-php/example.jpg


+ 3 - 0
vendor/aliyuncs/oss-sdk-php/index.php

@@ -0,0 +1,3 @@
+<?php
+
+require_once __DIR__ . '/vendor/autoload.php';

+ 19 - 0
vendor/aliyuncs/oss-sdk-php/phpunit.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE xml>
+
+<phpunit>
+	<filter>
+		<whitelist>
+			<directory suffix=".php">./src</directory>
+		</whitelist>
+	</filter>
+	<logging>
+		<log type="coverage-clover" target="coverage.xml" />
+	</logging>
+	<testsuites>
+		<testsuite name="FunctionTest">
+			<directory>./tests</directory>
+			<exclude>./tests/OSS/Tests/BucketCnameTest.php</exclude>
+		</testsuite>
+	</testsuites>
+</phpunit>

+ 254 - 0
vendor/aliyuncs/oss-sdk-php/samples/Bucket.php

@@ -0,0 +1,254 @@
+<?php
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+use OSS\Core\OssException;
+
+$ossClient = Common::getOssClient();
+if (is_null($ossClient)) exit(1);
+$bucket = Common::getBucketName();
+
+//******************************* Simple Usage****************************************************************
+
+// Create a bucket
+$ossClient->createBucket($bucket, OssClient::OSS_ACL_TYPE_PUBLIC_READ_WRITE);
+Common::println("bucket $bucket created");
+
+// Check whether a bucket exists
+$doesExist = $ossClient->doesBucketExist($bucket);
+Common::println("bucket $bucket exist? " . ($doesExist ? "yes" : "no"));
+
+// Get the region of bucket
+$regions = $ossClient->getBucketLocation($bucket);
+Common::println("bucket $bucket region: " .print_r($regions,true));
+
+// Get the meta of a bucket
+$metas  = $ossClient->getBucketMeta($bucket);
+Common::println("bucket $bucket meta: " .print_r($metas,true));
+
+// Get the info of bucket
+$info = $ossClient->getBucketInfo($bucket);
+Common::println("bucket name:".$info->getName()."\n");
+Common::println("bucket location:". $info->getLocation()."\n");
+Common::println("bucket creation time:".$info->getCreateDate()."\n");
+Common::println("bucket storage class:".$info->getStorageClass()."\n");
+Common::println("bucket extranet endpoint:".$info->getExtranetEndpoint()."\n");
+Common::println("bucket intranet endpoint:".$info->getIntranetEndpoint()."\n");
+
+
+// Get the bucket list
+$bucketListInfo = $ossClient->listBuckets();
+
+// Set bucket ACL
+$ossClient->putBucketAcl($bucket, OssClient::OSS_ACL_TYPE_PUBLIC_READ_WRITE);
+Common::println("bucket $bucket acl put");
+// Get bucket ACL
+$acl = $ossClient->getBucketAcl($bucket);
+Common::println("bucket $bucket acl get: " . $acl);
+
+
+//******************************* For complete usage, see the following functions ****************************************************
+
+createBucket($ossClient, $bucket);
+doesBucketExist($ossClient, $bucket);
+getBucketLocation($ossClient, $bucket);
+getBucketMeta($ossClient,$bucket);
+getBucketInfo($ossClient, $bucket);
+deleteBucket($ossClient, $bucket);
+putBucketAcl($ossClient, $bucket);
+getBucketAcl($ossClient, $bucket);
+listBuckets($ossClient);
+
+/**
+ * Create a new bucket
+ * acl indicates the access permission of a bucket, including: private, public-read-only/private-read-write, and public read-write.
+ * Private indicates that only the bucket owner or authorized users can access the data..
+ * The three permissions are separately defined by (OssClient::OSS_ACL_TYPE_PRIVATE,OssClient::OSS_ACL_TYPE_PUBLIC_READ, OssClient::OSS_ACL_TYPE_PUBLIC_READ_WRITE)
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket Name of the bucket to create
+ * @return null
+ */
+function createBucket($ossClient, $bucket)
+{
+    try {
+        $ossClient->createBucket($bucket, OssClient::OSS_ACL_TYPE_PUBLIC_READ_WRITE);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Check whether a bucket exists.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ */
+function doesBucketExist($ossClient, $bucket)
+{
+    try {
+        $res = $ossClient->doesBucketExist($bucket);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    if ($res === true) {
+        print(__FUNCTION__ . ": OK" . "\n");
+    } else {
+        print(__FUNCTION__ . ": FAILED" . "\n");
+    }
+}
+
+/**
+ * Get the info of bucket
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ */
+function getBucketInfo($ossClient, $bucket)
+{
+	try {
+		$info = $ossClient->getBucketInfo($bucket);
+		printf("bucket name:%s\n", $info->getName());
+		printf("bucket location:%s\n", $info->getLocation());
+		printf("bucket creation time:%s\n", $info->getCreateDate());
+		printf("bucket storage class:%s\n", $info->getStorageClass());
+		printf("bucket extranet endpoint:%s\n", $info->getExtranetEndpoint());
+		printf("bucket intranet endpoint:%s\n", $info->getIntranetEndpoint());
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+
+/**
+ * Get the meta of a bucket
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ */
+function getBucketLocation($ossClient, $bucket)
+{
+	try {
+		$regions = $ossClient->getBucketLocation($bucket);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print("bucket $bucket region: " .print_r($regions,true));
+	
+}
+
+
+/**
+ *  Get the bucket's meta
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ */
+function getBucketMeta($ossClient, $bucket)
+{
+	try {
+		$metas = $ossClient->getBucketMeta($bucket);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+	print("bucket $bucket meta: " .print_r($metas,true));
+}
+
+/**
+ * Delete a bucket. If the bucket is not empty, the deletion fails.
+ * A bucket which is not empty indicates that it does not contain any objects or parts that are not completely uploaded during multipart upload
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket Name of the bucket to delete
+ * @return null
+ */
+function deleteBucket($ossClient, $bucket)
+{
+    try {
+        $ossClient->deleteBucket($bucket);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Set bucket ACL
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function putBucketAcl($ossClient, $bucket)
+{
+    $acl = OssClient::OSS_ACL_TYPE_PRIVATE;
+    try {
+        $ossClient->putBucketAcl($bucket, $acl);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+
+/**
+ * Get bucket ACL
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function getBucketAcl($ossClient, $bucket)
+{
+    try {
+        $res = $ossClient->getBucketAcl($bucket);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+    print('acl: ' . $res);
+}
+
+
+/**
+ * List all buckets
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @return null
+ */
+function listBuckets($ossClient)
+{
+    $bucketList = null;
+    try {
+        $bucketListInfo = $ossClient->listBuckets();
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+    $bucketList = $bucketListInfo->getBucketList();
+    foreach ($bucketList as $bucket) {
+        print($bucket->getLocation() . "\t" . $bucket->getName() . "\t" . $bucket->getCreatedate() . "\n");
+    }
+}

+ 91 - 0
vendor/aliyuncs/oss-sdk-php/samples/BucketCname.php

@@ -0,0 +1,91 @@
+<?php
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+use OSS\Core\OssException;
+
+$bucket = Common::getBucketName();
+$ossClient = Common::getOssClient();
+if (is_null($ossClient)) exit(1);
+
+//*******************************Simple Usage ***************************************************************
+
+// Add Canme record
+$myDomain = '<yourDomainName>';
+$ossClient->addBucketCname($bucket, $myDomain);
+
+// View cname records
+$cnameConfig = $ossClient->getBucketCname($bucket);
+Common::println("bucket $bucket cname:" . $cnameConfig->serializeToXml());
+
+// Delete bucket cname
+$myDomain = '<yourDomainName>';
+$ossClient->deleteBucketCname($bucket,$myDomain);
+Common::println("bucket $bucket cname deleted");
+
+//******************************* For complete usage, see the following functions ****************************************************
+
+addBucketCname($ossClient, $bucket);
+getBucketCname($ossClient, $bucket);
+deleteBucketCname($ossClient, $bucket);
+
+/**
+ * Set bucket cname
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function addBucketCname($ossClient, $bucket)
+{
+	// Set up a custom domain name.
+	$myDomain = '<yourDomainName>';
+	try {
+		$ossClient->addBucketCname($bucket, $myDomain);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Get bucket cname
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function getBucketCname($ossClient, $bucket)
+{
+    try {
+		$cnameConfig = $ossClient->getBucketCname($bucket);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+    print($cnameConfig->serializeToXml() . "\n");
+}
+
+/**
+ * Delete bucket cname
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function deleteBucketCname($ossClient, $bucket)
+{
+	$myDomain = '<yourDomainName>';
+    try {
+		$ossClient->deleteBucketCname($bucket, $myDomain);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}

+ 171 - 0
vendor/aliyuncs/oss-sdk-php/samples/BucketCors.php

@@ -0,0 +1,171 @@
+<?php
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+use OSS\Core\OssException;
+use OSS\Model\CorsConfig;
+use OSS\Model\CorsRule;
+
+$ossClient = Common::getOssClient();
+if (is_null($ossClient)) exit(1);
+$bucket = Common::getBucketName();
+
+
+//******************************* Simple usage****************************************************************
+
+// Set cors configuration
+$corsConfig = new CorsConfig();
+$rule = new CorsRule();
+$rule->addAllowedHeader("x-oss-header");
+$rule->addAllowedOrigin("http://www.b.com");
+$rule->addAllowedMethod("POST");
+$rule->setMaxAgeSeconds(10);
+$corsConfig->addRule($rule);
+$ossClient->putBucketCors($bucket, $corsConfig);
+Common::println("bucket $bucket corsConfig created:" . $corsConfig->serializeToXml());
+
+// Get cors configuration
+$corsConfig = $ossClient->getBucketCors($bucket);
+
+if ($corsConfig->getResponseVary()){
+    printf("Response Vary : true" .PHP_EOL);
+}else{
+    printf("Response Vary : false" .PHP_EOL);
+}
+
+foreach ($corsConfig->getRules() as $key => $rule){
+    if($rule->getAllowedHeaders()){
+        foreach($rule->getAllowedHeaders() as $header){
+            printf("Allowed Headers :" .$header .PHP_EOL);
+        }
+    }
+    if ($rule->getAllowedMethods()){
+        foreach($rule->getAllowedMethods() as $method){
+            printf("Allowed Methods :" .$method . PHP_EOL);
+        }
+
+    }
+    if($rule->getAllowedOrigins()){
+        foreach($rule->getAllowedOrigins() as $origin){
+            printf("Allowed Origins :" .$origin , PHP_EOL);
+        }
+
+    }
+    if($rule->getExposeHeaders()){
+        foreach($rule->getExposeHeaders() as $exposeHeader){
+            printf("Expose Headers :" .$exposeHeader . PHP_EOL);
+        }
+    }
+    printf("Max Age Seconds :" .$rule->getMaxAgeSeconds() .PHP_EOL);
+
+}
+
+// Delete cors configuration
+$ossClient->deleteBucketCors($bucket);
+Common::println("bucket $bucket corsConfig deleted");
+
+//******************************* For complete usage, see the following functions  *****************************************************
+
+putBucketCors($ossClient, $bucket);
+getBucketCors($ossClient, $bucket);
+deleteBucketCors($ossClient, $bucket);
+getBucketCors($ossClient, $bucket);
+
+/**
+ * Set bucket cores
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function putBucketCors($ossClient, $bucket)
+{
+    $corsConfig = new CorsConfig();
+    $rule = new CorsRule();
+    $rule->addAllowedHeader("x-oss-header");
+    $rule->addAllowedOrigin("http://www.b.com");
+    $rule->addAllowedMethod("POST");
+    $rule->setMaxAgeSeconds(10);
+    $corsConfig->addRule($rule);
+
+    try {
+        $ossClient->putBucketCors($bucket, $corsConfig);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Get and print the cors configuration of a bucket
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function getBucketCors($ossClient, $bucket)
+{
+    $corsConfig = null;
+    try {
+        $corsConfig = $ossClient->getBucketCors($bucket);
+
+        if ($corsConfig->getResponseVary()){
+            printf("Response Vary : true" .PHP_EOL);
+        }else{
+            printf("Response Vary : false" .PHP_EOL);
+        }
+        foreach ($corsConfig->getRules() as $key => $rule){
+            if($rule->getAllowedHeaders()){
+                foreach($rule->getAllowedHeaders() as $header){
+                    printf("Allowed Headers :" .$header .PHP_EOL);
+                }
+            }
+            if ($rule->getAllowedMethods()){
+                foreach($rule->getAllowedMethods() as $method){
+                    printf("Allowed Methods :" .$method . PHP_EOL);
+                }
+
+            }
+            if($rule->getAllowedOrigins()){
+                foreach($rule->getAllowedOrigins() as $origin){
+                    printf("Allowed Origins :" .$origin , PHP_EOL);
+                }
+
+            }
+            if($rule->getExposeHeaders()){
+                foreach($rule->getExposeHeaders() as $exposeHeader){
+                    printf("Expose Headers :" .$exposeHeader . PHP_EOL);
+                }
+            }
+            printf("Max Age Seconds :" .$rule->getMaxAgeSeconds() .PHP_EOL);
+
+        }
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Delete all cors configuraiton of a bucket
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function deleteBucketCors($ossClient, $bucket)
+{
+    try {
+        $ossClient->deleteBucketCors($bucket);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+

+ 98 - 0
vendor/aliyuncs/oss-sdk-php/samples/BucketEncryption.php

@@ -0,0 +1,98 @@
+<?php
+
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+use OSS\Core\OssException;
+use OSS\Model\ServerSideEncryptionConfig;
+
+$ossClient = Common::getOssClient();
+if (is_null($ossClient)) exit(1);
+$bucket = Common::getBucketName();
+
+//******************************* Simple Usage****************************************************************
+
+// Configure Bucket encryption
+// Set Bucket's default server-side encryption method to OSS fully managed encryption (SSE-OSS).
+$config = new ServerSideEncryptionConfig("AES256");
+// Set Bucket's default server-side encryption method to KMS, and do not specify a CMK ID.
+//$config = new ServerSideEncryptionConfig("KMS");
+// Set Bucket's default server-side encryption method to KMS, and specify the CMK ID.
+//$config = new ServerSideEncryptionConfig("KMS", "your kms id");
+$ossClient->putBucketEncryption($bucket, $config);
+Common::println("bucket $bucket encryoption created");
+
+$config = $ossClient->getBucketEncryption($bucket);
+Common::println("bucket $bucket encryoption:".$config->serializeToXml());
+
+$config = $ossClient->deleteBucketEncryption($bucket);
+Common::println("bucket $bucket encryoption has deleted");
+
+//******************************* For complete usage, see the following functions ****************************************************
+putBucketEncryption($ossClient, $bucket);
+getBucketEncryption($ossClient, $bucket);
+deleteBucketEncryption($ossClient, $bucket);
+
+/**
+ * Configure Bucket encryption
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket Name of the bucket to create
+ * @return null
+ */
+
+function putBucketEncryption($ossClient,$bucket){
+	try {
+		// Set Bucket's default server-side encryption method to OSS fully managed encryption (SSE-OSS).
+		$config = new ServerSideEncryptionConfig("AES256");
+		// Set Bucket's default server-side encryption method to KMS, and do not specify a CMK ID.
+		//$config = new ServerSideEncryptionConfig("KMS");
+		// Set Bucket's default server-side encryption method to KMS, and specify the CMK ID.
+		//$config = new ServerSideEncryptionConfig("KMS", "your kms id");
+		$ossClient->putBucketEncryption($bucket, $config);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Get Bucket encryption
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket Name of the bucket to create
+ * @return null
+ */
+
+function getBucketEncryption($ossClient,$bucket){
+	try {
+		$config = $ossClient->getBucketEncryption($bucket);
+		print($config->getSSEAlgorithm());
+		print($config->getKMSMasterKeyID());
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+
+/**
+ * Delete Bucket encryption
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket Name of the bucket to create
+ * @return null
+ */
+
+function deleteBucketEncryption($ossClient,$bucket){
+	try {
+		$ossClient->deleteBucketEncryption($bucket);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+

+ 109 - 0
vendor/aliyuncs/oss-sdk-php/samples/BucketLifecycle.php

@@ -0,0 +1,109 @@
+<?php
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+use OSS\Core\OssException;
+use OSS\Model\LifecycleAction;
+use OSS\Model\LifecycleConfig;
+use OSS\Model\LifecycleRule;
+
+$bucket = Common::getBucketName();
+$ossClient = Common::getOssClient();
+if (is_null($ossClient)) exit(1);
+
+//******************************* Simple Usage *******************************************************
+
+// Set lifecycle configuration
+$lifecycleConfig = new LifecycleConfig();
+$actions = array();
+$actions[] = new LifecycleAction("Expiration", "Days", 3);
+$lifecycleRule = new LifecycleRule("delete obsoleted files", "obsoleted/", "Enabled", $actions);
+$lifecycleConfig->addRule($lifecycleRule);
+$ossClient->putBucketLifecycle($bucket, $lifecycleConfig);
+Common::println("bucket $bucket lifecycleConfig created:" . $lifecycleConfig->serializeToXml());
+
+// Get lifecycle configuration
+$lifecycleConfig = $ossClient->getBucketLifecycle($bucket);
+Common::println("bucket $bucket lifecycleConfig fetched:" . $lifecycleConfig->serializeToXml());
+
+// Delete bucket lifecycle configuration
+$ossClient->deleteBucketLifecycle($bucket);
+Common::println("bucket $bucket lifecycleConfig deleted");
+
+
+//***************************** For complete usage, see the following functions  ***********************************************
+
+putBucketLifecycle($ossClient, $bucket);
+getBucketLifecycle($ossClient, $bucket);
+deleteBucketLifecycle($ossClient, $bucket);
+getBucketLifecycle($ossClient, $bucket);
+
+/**
+ * Set bucket lifecycle configuration
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function putBucketLifecycle($ossClient, $bucket)
+{
+    $lifecycleConfig = new LifecycleConfig();
+    $actions = array();
+    $actions[] = new LifecycleAction(OssClient::OSS_LIFECYCLE_EXPIRATION, OssClient::OSS_LIFECYCLE_TIMING_DAYS, 3);
+    $lifecycleRule = new LifecycleRule("delete obsoleted files", "obsoleted/", "Enabled", $actions);
+    $lifecycleConfig->addRule($lifecycleRule);
+    $actions = array();
+    $actions[] = new LifecycleAction(OssClient::OSS_LIFECYCLE_EXPIRATION, OssClient::OSS_LIFECYCLE_TIMING_DATE, '2022-10-12T00:00:00.000Z');
+    $lifecycleRule = new LifecycleRule("delete temporary files", "temporary/", "Enabled", $actions);
+    $lifecycleConfig->addRule($lifecycleRule);
+    try {
+        $ossClient->putBucketLifecycle($bucket, $lifecycleConfig);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Get bucket lifecycle configuration
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function getBucketLifecycle($ossClient, $bucket)
+{
+    $lifecycleConfig = null;
+    try {
+        $lifecycleConfig = $ossClient->getBucketLifecycle($bucket);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+    print($lifecycleConfig->serializeToXml() . "\n");
+}
+
+/**
+ * Delete bucket lifecycle configuration
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function deleteBucketLifecycle($ossClient, $bucket)
+{
+    try {
+        $ossClient->deleteBucketLifecycle($bucket);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+

+ 95 - 0
vendor/aliyuncs/oss-sdk-php/samples/BucketLogging.php

@@ -0,0 +1,95 @@
+<?php
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+use OSS\Core\OssException;
+
+$bucket = Common::getBucketName();
+$ossClient = Common::getOssClient();
+if (is_null($ossClient)) exit(1);
+
+//*******************************Simple Usage ***************************************************************
+
+// Set bucket access logging rules. Access logs are stored under the same bucket with a 'access.log' prefix.
+$ossClient->putBucketLogging($bucket, $bucket, "access.log", array());
+Common::println("bucket $bucket lifecycleConfig created");
+
+// Get bucket access logging rules
+$loggingConfig = $ossClient->getBucketLogging($bucket, array());
+Common::println("bucket $bucket lifecycleConfig fetched:" . $loggingConfig->serializeToXml());
+
+// Delete bucket access logging rules
+$loggingConfig = $ossClient->getBucketLogging($bucket, array());
+Common::println("bucket $bucket lifecycleConfig deleted");
+
+//******************************* For complete usage, see the following functions ****************************************************
+
+putBucketLogging($ossClient, $bucket);
+getBucketLogging($ossClient, $bucket);
+deleteBucketLogging($ossClient, $bucket);
+getBucketLogging($ossClient, $bucket);
+
+/**
+ * Set bucket logging configuration
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function putBucketLogging($ossClient, $bucket)
+{
+    $option = array();
+    // Access logs are stored in the same bucket.
+    $targetBucket = $bucket;
+    $targetPrefix = "access.log";
+
+    try {
+        $ossClient->putBucketLogging($bucket, $targetBucket, $targetPrefix, $option);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Get bucket logging configuration
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function getBucketLogging($ossClient, $bucket)
+{
+    $loggingConfig = null;
+    $options = array();
+    try {
+        $loggingConfig = $ossClient->getBucketLogging($bucket, $options);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+    print($loggingConfig->serializeToXml() . "\n");
+}
+
+/**
+ * Delete bucket logging configuration
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function deleteBucketLogging($ossClient, $bucket)
+{
+    try {
+        $ossClient->deleteBucketLogging($bucket);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}

+ 116 - 0
vendor/aliyuncs/oss-sdk-php/samples/BucketPayment.php

@@ -0,0 +1,116 @@
+<?php
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+use OSS\Core\OssException;
+
+$ossClient = Common::getOssClient();
+if (is_null($ossClient)) exit(1);
+$bucket = Common::getBucketName();
+
+//******************************* Simple Usage****************************************************************
+
+//Set requester payment mode
+$ossClient->putBucketRequestPayment($bucket, "Requester");
+
+//Get requester payment mode configuration
+$payer = $ossClient->getBucketRequestPayment($bucket);
+Common::println("bucket $bucket Payer:".$payer.PHP_EOL);
+
+//Third-party paid access to Object
+$options = array(
+	OssClient::OSS_HEADERS => array(
+		OssClient::OSS_REQUEST_PAYER => 'requester',
+	));
+
+$content = "hello";
+$object = "object";
+
+//PutObject interface to specify the payer
+$ossClient->putObject($bucket, $object, $content, $options);
+
+// GetObject interface to specify the payer
+$ossClient->getObject($bucket, $object, $options);
+
+// DeleteObject interface to specify the payer
+$ossClient->deleteObject($bucket, $object, $options);
+
+//******************************* For complete usage, see the following functions ****************************************************
+
+putBucketRequestPayment($ossClient,$bucket);
+getBucketRequestPayment($ossClient,$bucket);
+setObjectPayment($ossClient,$bucket);
+
+/**
+ * Set requester payment mode
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket Name of the bucket to create
+ * @return null
+ */
+function putBucketRequestPayment($ossClient, $bucket)
+{
+	try {
+		$ossClient->putBucketRequestPayment($bucket, "Requester");
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+
+/**
+ * Get payment mode of bucket
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket Name of the bucket to create
+ * @return null
+ */
+function getBucketRequestPayment($ossClient, $bucket)
+{
+	try {
+		$payer = $ossClient->getBucketRequestPayment($bucket);
+		print("bucket $bucket Payer:".$payer.PHP_EOL);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Set payment mode of object
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket Name of the bucket to create
+ * @return null
+ */
+function setObjectPayment($ossClient,$bucket){
+	// Specify the payment model for the requester.
+	$options = array(
+		OssClient::OSS_HEADERS => array(
+			OssClient::OSS_REQUEST_PAYER => 'requester',
+		));
+	
+	try {
+		
+		$content = "hello";
+		$object = "object";
+		//PutObject interface to specify the payer
+		$ossClient->putObject($bucket, $object, $content, $options);
+		// GetObject interface to specify the payer
+		$ossClient->getObject($bucket, $object, $options);
+		// DeleteObject interface to specify the payer
+		$ossClient->deleteObject($bucket, $object, $options);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+

+ 123 - 0
vendor/aliyuncs/oss-sdk-php/samples/BucketPolicy.php

@@ -0,0 +1,123 @@
+<?php
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+use OSS\Core\OssException;
+
+$ossClient = Common::getOssClient();
+if (is_null($ossClient)) exit(1);
+$bucket = Common::getBucketName();
+
+//******************************* Simple Usage****************************************************************
+
+// Set Bucket Policy
+// Authorization strategy.
+$policy = <<< BBBB
+{
+  "Version":"1",
+  "Statement":[
+  {
+    "Action":[
+    "oss:PutObject",
+    "oss:GetObject"
+  ],
+    "Effect":"Allow",
+    "Resource":["acs:oss:*:*:*/user1/*"]
+  }
+  ]
+}
+BBBB;
+$ossClient->putBucketPolicy($bucket, $policy);
+
+// Get bucket pllicy
+$policy = $ossClient->getBucketPolicy($bucket);
+Common::println("bucket $bucket policy: " . $policy);
+
+
+// Delete bucket pllicy
+$policy = $ossClient->deleteBucketPolicy($bucket);
+
+//******************************* For complete usage, see the following functions ****************************************************
+
+putBucketPolicy($ossClient, $bucket);
+getBucketPolicy($ossClient, $bucket);
+deleteBucketPolicy($ossClient, $bucket);
+
+/**
+ * Set Bucket Policy
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket Name of the bucket to create
+ * @return null
+ */
+function putBucketPolicy($ossClient, $bucket)
+{
+	$policy = <<< BBBB
+{
+  "Version":"1",
+  "Statement":[
+  {
+    "Action":[
+    "oss:PutObject",
+    "oss:GetObject"
+  ],
+    "Effect":"Allow",
+    "Resource":["acs:oss:*:*:*/user1/*"]
+  }
+  ]
+}
+BBBB;
+	
+	try {
+		$ossClient->putBucketPolicy($bucket, $policy);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+
+/**
+ * Get Bucket Policy
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket Name of the bucket to create
+ * @return null
+ */
+function getBucketPolicy($ossClient, $bucket)
+{
+	try {
+		$policy = $ossClient->getBucketPolicy($bucket);
+		print($policy);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+
+/**
+ * Delete Bucket Policy
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket Name of the bucket to create
+ * @return null
+ */
+function deleteBucketPolicy($ossClient, $bucket)
+{
+	try {
+		$ossClient->deleteBucketPolicy($bucket);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print(__FUNCTION__ . ": OK" . "\n");
+}

+ 101 - 0
vendor/aliyuncs/oss-sdk-php/samples/BucketReferer.php

@@ -0,0 +1,101 @@
+<?php
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+use OSS\Core\OssException;
+use \OSS\Model\RefererConfig;
+
+$bucket = Common::getBucketName();
+$ossClient = Common::getOssClient();
+if (is_null($ossClient)) exit(1);
+
+//******************************* Simple Usage ****************************************************************
+
+// Set referer whitelist
+$refererConfig = new RefererConfig();
+$refererConfig->setAllowEmptyReferer(true);
+$refererConfig->addReferer("www.aliiyun.com");
+$refererConfig->addReferer("www.aliiyuncs.com");
+$ossClient->putBucketReferer($bucket, $refererConfig);
+Common::println("bucket $bucket refererConfig created:" . $refererConfig->serializeToXml());
+// Get referer whitelist
+$refererConfig = $ossClient->getBucketReferer($bucket);
+Common::println("bucket $bucket refererConfig fetched:" . $refererConfig->serializeToXml());
+
+// Delete referrer whitelist
+$refererConfig = new RefererConfig();
+$ossClient->putBucketReferer($bucket, $refererConfig);
+Common::println("bucket $bucket refererConfig deleted");
+
+
+//******************************* For complete usage, see the following functions ****************************************************
+
+putBucketReferer($ossClient, $bucket);
+getBucketReferer($ossClient, $bucket);
+deleteBucketReferer($ossClient, $bucket);
+getBucketReferer($ossClient, $bucket);
+
+/**
+ * Set bucket referer configuration
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function putBucketReferer($ossClient, $bucket)
+{
+    $refererConfig = new RefererConfig();
+    $refererConfig->setAllowEmptyReferer(true);
+    $refererConfig->addReferer("www.aliiyun.com");
+    $refererConfig->addReferer("www.aliiyuncs.com");
+    try {
+        $ossClient->putBucketReferer($bucket, $refererConfig);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Get bucket referer configuration
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function getBucketReferer($ossClient, $bucket)
+{
+    $refererConfig = null;
+    try {
+        $refererConfig = $ossClient->getBucketReferer($bucket);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+    print($refererConfig->serializeToXml() . "\n");
+}
+
+/**
+ * Delete bucket referer configuration
+ * Referer whitelist cannot be directly deleted. So use a empty one to overwrite it.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function deleteBucketReferer($ossClient, $bucket)
+{
+    $refererConfig = new RefererConfig();
+    try {
+        $ossClient->putBucketReferer($bucket, $refererConfig);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}

+ 65 - 0
vendor/aliyuncs/oss-sdk-php/samples/BucketStat.php

@@ -0,0 +1,65 @@
+<?php
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+use OSS\Core\OssException;
+$ossClient = Common::getOssClient();
+if (is_null($ossClient)) exit(1);
+$bucket = Common::getBucketName();
+
+//******************************* Simple Usage****************************************************************
+
+// Get Bucket Stat
+$stat = $ossClient->getBucketStat($bucket);
+Common::println("Bucket ".$bucket." current storage is:".$stat->getStorage().PHP_EOL);
+Common::println("Bucket ".$bucket." object count is:".$stat->getObjectCount().PHP_EOL);
+Common::println("Bucket ".$bucket." multipart upload count is:".$stat->getMultipartUploadCount().PHP_EOL);
+Common::println("Bucket ".$bucket." live channel count is:".$stat->getLiveChannelCount().PHP_EOL);
+Common::println("Bucket ".$bucket." last modified time is:".$stat->getLastModifiedTime().PHP_EOL);
+Common::println("Bucket ".$bucket." standard storage is:".$stat->getStandardStorage().PHP_EOL);
+Common::println("Bucket ".$bucket." standard object count is:".$stat->getStandardObjectCount().PHP_EOL);
+Common::println("Bucket ".$bucket." infrequent access storage is:".$stat->getInfrequentAccessStorage().PHP_EOL);
+Common::println("Bucket ".$bucket." infrequent access real storage is:".$stat->getInfrequentAccessRealStorage().PHP_EOL);
+Common::println("Bucket ".$bucket." infrequent access object count is:".$stat->getInfrequentAccessObjectCount().PHP_EOL);
+Common::println("Bucket ".$bucket." archive storage is:".$stat->getArchiveStorage().PHP_EOL);
+Common::println("Bucket ".$bucket." archive real storage is:".$stat->getArchiveRealStorage().PHP_EOL);
+Common::println("Bucket ".$bucket." archive object count is:".$stat->getArchiveObjectCount().PHP_EOL);
+Common::println("Bucket ".$bucket." cold archive storage is:".$stat->getColdArchiveStorage().PHP_EOL);
+Common::println("Bucket ".$bucket." cold archive real storage is:".$stat->getColdArchiveRealStorage().PHP_EOL);
+Common::println("Bucket ".$bucket." cold archive object count is:".$stat->getColdArchiveObjectCount().PHP_EOL);
+
+//******************************* For complete usage, see the following functions ****************************************************
+getBucketStat($ossClient,$bucket);
+/**
+ * get bucket stat
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket Name of the bucket to create
+ * @return null
+ */
+function getBucketStat($ossClient, $bucket)
+{
+    try {
+        $stat = $ossClient->getBucketStat($bucket);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    printf("Bucket ".$bucket." current storage is:".$stat->getStorage().PHP_EOL);
+    printf("Bucket ".$bucket." object count is:".$stat->getObjectCount().PHP_EOL);
+    printf("Bucket ".$bucket." multipart upload count is:".$stat->getMultipartUploadCount().PHP_EOL);
+    printf("Bucket ".$bucket." live channel count is:".$stat->getLiveChannelCount().PHP_EOL);
+    printf("Bucket ".$bucket." last modified time is:".$stat->getLastModifiedTime().PHP_EOL);
+    printf("Bucket ".$bucket." standard storage is:".$stat->getStandardStorage().PHP_EOL);
+    printf("Bucket ".$bucket." standard object count is:".$stat->getStandardObjectCount().PHP_EOL);
+    printf("Bucket ".$bucket." infrequent access storage is:".$stat->getInfrequentAccessStorage().PHP_EOL);
+    printf("Bucket ".$bucket." infrequent access real storage is:".$stat->getInfrequentAccessRealStorage().PHP_EOL);
+    printf("Bucket ".$bucket." infrequent access object count is:".$stat->getInfrequentAccessObjectCount().PHP_EOL);
+    printf("Bucket ".$bucket." archive storage is:".$stat->getArchiveStorage().PHP_EOL);
+    printf("Bucket ".$bucket." archive real storage is:".$stat->getArchiveRealStorage().PHP_EOL);
+    printf("Bucket ".$bucket." archive object count is:".$stat->getArchiveObjectCount().PHP_EOL);
+    printf("Bucket ".$bucket." cold archive storage is:".$stat->getColdArchiveStorage().PHP_EOL);
+    printf("Bucket ".$bucket." cold archive real storage is:".$stat->getColdArchiveRealStorage().PHP_EOL);
+    printf("Bucket ".$bucket." cold archive object count is:".$stat->getColdArchiveObjectCount().PHP_EOL);
+    print(__FUNCTION__ . ": OK" . "\n");
+}

+ 112 - 0
vendor/aliyuncs/oss-sdk-php/samples/BucketTags.php

@@ -0,0 +1,112 @@
+<?php
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+use OSS\Core\OssException;
+use OSS\Model\TaggingConfig;
+use OSS\Model\Tag;
+
+$ossClient = Common::getOssClient();
+if (is_null($ossClient)) exit(1);
+$bucket = Common::getBucketName();
+
+//******************************* Simple Usage****************************************************************
+
+// Set bucket tag
+$config = new TaggingConfig();
+$config->addTag(new Tag("key1", "value1"));
+$config->addTag(new Tag("key2", "value2"));
+$ossClient->putBucketTags($bucket, $config);
+
+// Get bucket tags
+$config = $ossClient->getBucketTags($bucket);
+Common::println("bucket $bucket tags: ".$config->serializeToXml());
+
+// Delete bucket tags
+
+// Delete the specified tag of the bucket.
+$tags = array();
+$tags[] = new Tag("key1", "value1");
+$tags[] = new Tag("key2", "value2");
+$ossClient->deleteBucketTags($bucket, $tags);
+
+// Delete all tags in the bucket.
+$ossClient->deleteBucketTags($bucket);
+
+//******************************* For complete usage, see the following functions ****************************************************
+
+putBucketTags($ossClient, $bucket);
+getBucketTags($ossClient, $bucket);
+deleteBucketTags($ossClient, $bucket);
+
+
+/**
+ * Create bucket tag
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket Name of the bucket to create
+ * @return null
+ */
+function putBucketTags($ossClient, $bucket)
+{
+	try {
+		// 设置Bucket标签。
+		$config = new TaggingConfig();
+		$config->addTag(new Tag("key1", "value1"));
+		$config->addTag(new Tag("key2", "value2"));
+		$ossClient->putBucketTags($bucket, $config);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+
+/**
+ * get bucket tag
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket Name of the bucket to create
+ * @return null
+ */
+function getBucketTags($ossClient, $bucket)
+{
+	try {
+		$config = $ossClient->getBucketTags($bucket);
+		print_r($config->getTags());
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * delete bucket tag
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket Name of the bucket to create
+ * @return null
+ */
+function deleteBucketTags($ossClient, $bucket)
+{
+	try {
+		// Delete the specified tag of the bucket.
+		$tags = array();
+		$tags[] = new Tag("key1", "value1");
+		$tags[] = new Tag("key2", "value2");
+		$ossClient->deleteBucketTags($bucket, $tags);
+		
+		// Delete all tags in the bucket.
+		//$ossClient->deleteBucketTags($bucket);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+

+ 61 - 0
vendor/aliyuncs/oss-sdk-php/samples/BucketTransferAcceleration.php

@@ -0,0 +1,61 @@
+<?php
+
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+use OSS\Core\OssException;
+
+$ossClient = Common::getOssClient();
+if (is_null($ossClient)) exit(1);
+$bucket = Common::getBucketName();
+
+//******************************* Simple Usage****************************************************************
+
+// set <tran></tran>sfer acceleration
+$enabled = true; // set true to enable transfer acceleration; set false to disalbe transfer acceleration
+$ossClient->putBucketTransferAcceleration($bucket, $enabled);
+printf('putBucketTransferAcceleration SUCCESS' . "\n");
+
+
+// get transfer acceleration
+$result  = $ossClient->getBucketTransferAcceleration($bucket);
+printf('getBucketTransferAcceleration Status:%s'."\n",$result);
+
+
+//******************************* For complete usage, see the following functions ****************************************************
+putBucketTransferAcceleration($ossClient,$bucket);
+getBucketTransferAcceleration($bucket);
+
+/**
+ * @param $ossClient OssClient
+ * @param $bucket bucket_name string
+ * @param $enabled string
+ */
+function putBucketTransferAcceleration($ossClient, $bucket, $enabled)
+{
+	try{
+		$enabled = true; // set true to enable transfer acceleration; set false to disalbe transfer acceleration
+		$ossClient->putBucketTransferAcceleration($bucket,$enabled);
+		printf('putBucketTransferAcceleration SUCCESS' . "\n");
+	} catch(OssException $e) {
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * @param $ossClient OssClient
+ * @param $bucket bucket_name string
+ */
+function getBucketTransferAcceleration($ossClient, $bucket)
+{
+	try{
+		$result = $ossClient->getBucketTransferAcceleration($bucket);
+		printf('getBucketTransferAcceleration Status:%s'."\n",$result);
+	} catch(OssException $e) {
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+}

+ 235 - 0
vendor/aliyuncs/oss-sdk-php/samples/BucketVersion.php

@@ -0,0 +1,235 @@
+<?php
+
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+use OSS\Core\OssException;
+
+$ossClient = Common::getOssClient();
+if (is_null($ossClient)) exit(1);
+$bucket = Common::getBucketName();
+
+//******************************* Simple Usage****************************************************************
+
+//Set Bucket version control status
+//Set the storage space version control to enable version control (Enabled) or suspend version control (Suspended).
+$ossClient->putBucketVersioning($bucket, "Enabled");
+Common::println("bucket $bucket version Enabled");
+// show all object list
+$option = array(
+	OssClient::OSS_KEY_MARKER => null,
+	OssClient::OSS_VERSION_ID_MARKER => null
+);
+$bool = true;
+while ($bool) {
+	$result = $ossClient->listObjectVersions($bucket, $option);
+	## View the version information of the listed object.
+	foreach ($result->getObjectVersionList() as $key => $info) {
+		Common::println("key name: " . $info->getKey());
+		Common::println("versionid: " . $info->getVersionId());
+		Common::println("Is latest: " . $info->getIsLatest());
+	}
+	
+	## View the version information that lists the deletion flags.
+	foreach ($result->getDeleteMarkerList() as $key => $info) {
+		Common::println("del_maker key name: " . $info->getKey());
+		Common::println("del_maker versionid: " . $info->getVersionId());
+		Common::println("del_maker Is latest: " . $info->getIsLatest());
+	}
+	
+	if ($result->getIsTruncated() === 'true') {
+		$option = array(
+			OssClient::OSS_KEY_MARKER => $result->getNextKeyMarker(),
+			OssClient::OSS_VERSION_ID_MARKER => $result->getNextVersionIdMarker()
+		);
+	} else {
+		$bool = false;
+	}
+}
+
+// show the prefix object
+
+$option = array(
+	OssClient::OSS_KEY_MARKER => null,
+	OssClient::OSS_VERSION_ID_MARKER => null,
+	OssClient::OSS_PREFIX => "test"
+);
+$bool = true;
+while ($bool) {
+	$result = $ossClient->listObjectVersions($bucket, $option);
+	## View the version information of the listed object.
+	foreach ($result->getObjectVersionList() as $key => $info) {
+		Common::println("key name: " . $info->getKey());
+		Common::println("versionid: " . $info->getVersionId());
+		Common::println("Is latest: " . $info->getIsLatest());
+	}
+	
+	## View the version information that lists the deletion flags.
+	foreach ($result->getDeleteMarkerList() as $key => $info) {
+		Common::println("del_maker key name: " . $info->getKey());
+		Common::println("del_maker versionid: " . $info->getVersionId());
+		Common::println("del_maker Is latest: " . $info->getIsLatest());
+	}
+	
+	if ($result->getIsTruncated() === 'true') {
+		$option[OssClient::OSS_KEY_MARKER] = $result->getNextKeyMarker();
+		$option[OssClient::OSS_VERSION_ID_MARKER] = $result->getNextVersionIdMarker();
+	} else {
+		$bool = false;
+	}
+}
+
+// list the number of objects
+
+$option = array(
+	OssClient::OSS_KEY_MARKER => null,
+	OssClient::OSS_VERSION_ID_MARKER => null,
+	OssClient::OSS_MAX_KEYS => 200
+);
+
+$result = $ossClient->listObjectVersions($bucket, $option);
+## View the version information of the listed object.
+foreach ($result->getObjectVersionList() as $key => $info) {
+	Common::println("key name: " . $info->getKey());
+	Common::println("versionid: " . $info->getVersionId());
+	Common::println("Is latest: " . $info->getIsLatest());
+}
+
+## View the version information that lists the deletion flags.
+foreach ($result->getDeleteMarkerList() as $key => $info) {
+	Common::println("del_maker key name: " . $info->getKey());
+	Common::println("del_maker versionid: " . $info->getVersionId());
+	Common::println("del_maker Is latest: " . $info->getIsLatest());
+}
+
+
+// show root folder list
+$option = array(
+	OssClient::OSS_KEY_MARKER => null,
+	OssClient::OSS_VERSION_ID_MARKER => null,
+	OssClient::OSS_DELIMITER => "/",
+);
+$bool = true;
+while ($bool) {
+	$result = $ossClient->listObjectVersions($bucket, $option);
+	## View the version information of the listed object.
+	foreach ($result->getObjectVersionList() as $key => $info) {
+		Common::println("key name: " . $info->getKey());
+		Common::println("versionid: " . $info->getVersionId());
+		Common::println("Is latest: " . $info->getIsLatest());
+	}
+	
+	## View the version information that lists the deletion flags.
+	foreach ($result->getDeleteMarkerList() as $key => $info) {
+		Common::println("del_maker key name: " . $info->getKey());
+		Common::println("del_maker versionid: " . $info->getVersionId());
+		Common::println("del_maker Is latest: " . $info->getIsLatest());
+	}
+	
+	if ($result->getIsTruncated() === 'true') {
+		$option[OssClient::OSS_KEY_MARKER] = $result->getNextKeyMarker();
+		$option[OssClient::OSS_VERSION_ID_MARKER] = $result->getNextVersionIdMarker();
+	} else {
+		$bool = false;
+	}
+}
+
+//  Show subfolder objects list
+$option = array(
+	OssClient::OSS_KEY_MARKER => null,
+	OssClient::OSS_VERSION_ID_MARKER => null,
+	OssClient::OSS_DELIMITER => "/",
+	OssClient::OSS_PREFIX => "test/",
+);
+$bool = true;
+while ($bool) {
+	$result = $ossClient->listObjectVersions($bucket, $option);
+	## View the version information of the listed object.
+	foreach ($result->getObjectVersionList() as $key => $info) {
+		Common::println("key name: " . $info->getKey());
+		Common::println("versionid: " . $info->getVersionId());
+		Common::println("Is latest: " . $info->getIsLatest());
+	}
+	
+	## View the version information that lists the deletion flags.
+	foreach ($result->getDeleteMarkerList() as $key => $info) {
+		Common::println("del_maker key name: " . $info->getKey());
+		Common::println("del_maker versionid: " . $info->getVersionId());
+		Common::println("del_maker Is latest: " . $info->getIsLatest());
+	}
+	
+	if ($result->getIsTruncated() === 'true') {
+		$option[OssClient::OSS_KEY_MARKER] = $result->getNextKeyMarker();
+		$option[OssClient::OSS_VERSION_ID_MARKER] = $result->getNextVersionIdMarker();
+	} else {
+		$bool = false;
+	}
+}
+
+
+//******************************* For complete usage, see the following functions ****************************************************
+
+listObjectVersions($ossClient, $bucket);
+putBucketVersioning($ossClient, $bucket);
+/**
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket Name of the bucket to create
+ * @return null
+ */
+function listObjectVersions($ossClient, $bucket)
+{
+	try {
+		$option = array(
+			OssClient::OSS_KEY_MARKER => null,
+			OssClient::OSS_VERSION_ID_MARKER => null,
+		);
+		$bool = true;
+		while ($bool) {
+			$result = $ossClient->listObjectVersions($bucket, $option);
+			## View the version information of the listed object.
+			foreach ($result->getObjectVersionList() as $key => $info) {
+				Common::println("key name: " . $info->getKey());
+				Common::println("versionid: " . $info->getVersionId());
+				Common::println("Is latest: " . $info->getIsLatest());
+			}
+			
+			## View the version information that lists the deletion flags.
+			foreach ($result->getDeleteMarkerList() as $key => $info) {
+				Common::println("del_maker key name: " . $info->getKey());
+				Common::println("del_maker versionid: " . $info->getVersionId());
+				Common::println("del_maker Is latest: " . $info->getIsLatest());
+			}
+			
+			if ($result->getIsTruncated() === 'true') {
+				$option[OssClient::OSS_KEY_MARKER] = $result->getNextKeyMarker();
+				$option[OssClient::OSS_VERSION_ID_MARKER] = $result->getNextVersionIdMarker();
+			} else {
+				$bool = false;
+			}
+		}
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Enabled or Suspended bucket version
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket Name of the bucket to create
+ * @return null
+ */
+function putBucketVersioning($ossClient, $bucket)
+{
+	try {
+		//Set the storage space version control to enable version control (Enabled) or suspend version control (Suspended).
+		$ossClient->putBucketVersioning($bucket, "Enabled");
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+}

+ 92 - 0
vendor/aliyuncs/oss-sdk-php/samples/BucketWebsite.php

@@ -0,0 +1,92 @@
+<?php
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+use OSS\Core\OssException;
+use OSS\Model\WebsiteConfig;
+
+$bucket = Common::getBucketName();
+$ossClient = Common::getOssClient();
+if (is_null($ossClient)) exit(1);
+
+//******************************* Simple Usage ***************************************************************
+
+// Set bucket static website configuration
+$websiteConfig = new WebsiteConfig("index.html", "error.html");
+$ossClient->putBucketWebsite($bucket, $websiteConfig);
+Common::println("bucket $bucket websiteConfig created:" . $websiteConfig->serializeToXml());
+
+// Get bucket static website configuration
+$websiteConfig = $ossClient->getBucketWebsite($bucket);
+Common::println("bucket $bucket websiteConfig fetched:" . $websiteConfig->serializeToXml());
+
+// Delete bucket static website configuration
+$ossClient->deleteBucketWebsite($bucket);
+Common::println("bucket $bucket websiteConfig deleted");
+
+//******************************* For complete usage, see the following functions  ****************************************************
+
+putBucketWebsite($ossClient, $bucket);
+getBucketWebsite($ossClient, $bucket);
+deleteBucketWebsite($ossClient, $bucket);
+getBucketWebsite($ossClient, $bucket);
+
+/**
+ * Sets bucket static website configuration
+ *
+ * @param $ossClient OssClient
+ * @param  $bucket string bucket name
+ * @return null
+ */
+function putBucketWebsite($ossClient, $bucket)
+{
+    $websiteConfig = new WebsiteConfig("index.html", "error.html");
+    try {
+        $ossClient->putBucketWebsite($bucket, $websiteConfig);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Get bucket static website configuration
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function getBucketWebsite($ossClient, $bucket)
+{
+    $websiteConfig = null;
+    try {
+        $websiteConfig = $ossClient->getBucketWebsite($bucket);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+    print($websiteConfig->serializeToXml() . "\n");
+}
+
+/**
+ * Delete bucket static website configuration
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function deleteBucketWebsite($ossClient, $bucket)
+{
+    try {
+        $ossClient->deleteBucketWebsite($bucket);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}

+ 145 - 0
vendor/aliyuncs/oss-sdk-php/samples/BucketWorm.php

@@ -0,0 +1,145 @@
+<?php
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+use OSS\Core\OssException;
+
+$ossClient = Common::getOssClient();
+if (is_null($ossClient)) exit(1);
+$bucket = Common::getBucketName();
+
+//******************************* Simple Usage****************************************************************
+
+// Create a new compliance retention policy:
+// The specified object protection days are 30 days.
+$wormId = $ossClient->initiateBucketWorm($bucket, 30);
+Common::println("bucket $bucket wormId: " . $wormId.PHP_EOL);
+
+// Cancel an unlocked compliance retention policy
+$ossClient->abortBucketWorm($bucket);
+
+//Lock compliant retention policy
+$wormId = $ossClient->initiateBucketWorm($bucket, 30);
+$ossClient->completeBucketWorm($bucket, $wormId);
+
+// Get compliant retention policy
+$config = $ossClient->getBucketWorm($bucket);
+Common::println("WormId:".$config->getWormId().PHP_EOL);
+Common::println("State:". $config->getState().PHP_EOL);
+Common::println("Day:". $config->getDay().PHP_EOL);
+
+// Extend the retention days of objects
+$wormId = "<yourWormId>";
+// Extend the retention days of objects in the locked compliance retention policy to 120 days.
+$ossClient->extendBucketWorm($bucket, $wormId, 120);
+
+//******************************* For complete usage, see the following functions ****************************************************
+
+initiateBucketWorm($ossClient, $bucket);
+abortBucketWorm($ossClient, $bucket);
+completeBucketWorm($ossClient, $bucket);
+getBucketWorm($ossClient, $bucket);
+extendBucketWorm($ossClient, $bucket);
+
+/**
+ * Set Bucket Worm Ploicy
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket Name of the bucket to create
+ * @return null
+ */
+function initiateBucketWorm($ossClient, $bucket)
+{
+	try {
+		$wormId = $ossClient->initiateBucketWorm($bucket,30);
+		print("bucket $bucket wormId: " . $wormId.PHP_EOL);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+
+/**
+ * Cancel an unlocked compliance retention policy
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket Name of the bucket to create
+ * @return null
+ */
+function abortBucketWorm($ossClient, $bucket)
+{
+	try {
+		$ossClient->abortBucketWorm($bucket);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+
+/**
+ * Complete Bucket Worm
+ * @param $ossClient $ossClient OssClient instance
+ * @param $bucket $bucket Name of the bucket to create
+ */
+function completeBucketWorm($ossClient, $bucket)
+{
+	try {
+		$wormId = $ossClient->initiateBucketWorm($bucket, 30);
+		$ossClient->completeBucketWorm($bucket, $wormId);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Get Bucket Worm
+ * @param $ossClient $ossClient OssClient instance
+ * @param $bucket $bucket Name of the bucket to create
+ */
+function getBucketWorm($ossClient, $bucket)
+{
+	try {
+		$config = $ossClient->getBucketWorm($bucket);
+		
+		printf("WormId:%s\n", $config->getWormId());
+		printf("State:%s\n", $config->getState());
+		printf("Day:%d\n", $config->getDay());
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Extend the retention days of objects
+ * @param $ossClient $ossClient OssClient instance
+ * @param $bucket $bucket Name of the bucket to create
+ */
+function extendBucketWorm($ossClient, $bucket)
+{
+	$wormId = "<yourWormId>";
+	try {
+		$ossClient->ExtendBucketWorm($bucket, $wormId, 120);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print(__FUNCTION__ . ": OK" . "\n");
+}

+ 83 - 0
vendor/aliyuncs/oss-sdk-php/samples/Callback.php

@@ -0,0 +1,83 @@
+<?php
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+
+$bucket = Common::getBucketName();
+$ossClient = Common::getOssClient();
+if (is_null($ossClient)) exit(1);
+
+//******************************* Simple Usage ***************************************************************
+
+/**  putObject Upload content to an OSS file using callback.
+  * The callbackurl specifies the server url for the request callback.
+  * The callbackbodytype can be application/json or application/x-www-form-urlencoded,the optional parameters,the default for the application/x - WWW - form - urlencoded
+  * Users can choose not to set OSS_BACK_VAR
+  */
+$url =
+    '{
+        "callbackUrl":"callback.oss-demo.com:23450",
+        "callbackHost":"oss-cn-hangzhou.aliyuncs.com",
+        "callbackBody":"bucket=${bucket}&object=${object}&etag=${etag}&size=${size}&mimeType=${mimeType}&imageInfo.height=${imageInfo.height}&imageInfo.width=${imageInfo.width}&imageInfo.format=${imageInfo.format}&my_var1=${x:var1}&my_var2=${x:var2}",
+         "callbackBodyType":"application/x-www-form-urlencoded"
+
+    }';
+$var = 
+    '{
+        "x:var1":"value1",
+        "x:var2":"值2"
+    }';
+$options = array(OssClient::OSS_CALLBACK => $url,
+                 OssClient::OSS_CALLBACK_VAR => $var
+                );
+$result = $ossClient->putObject($bucket, "b.file", "random content", $options);
+Common::println($result['body']);
+Common::println($result['info']['http_code']);
+
+/**
+  * completeMultipartUpload  Upload content to an OSS file using callback.
+  * callbackurl specifies the server url for the request callback
+  * The callbackbodytype can be application/json or application/x-www-form-urlencoded,the optional parameters,the default for the application/x - WWW - form - urlencoded
+  * Users can choose not to set OSS_BACK_VAR.
+ */
+$object = "multipart-callback-test.txt";
+$copiedObject = "multipart-callback-test.txt.copied";
+$ossClient->putObject($bucket, $copiedObject, file_get_contents(__FILE__));
+
+/**
+  *  step 1. Initialize a block upload event, that is, a multipart upload process to get an upload id
+  */
+$upload_id = $ossClient->initiateMultipartUpload($bucket, $object);
+
+/**
+ * step 2. uploadPartCopy
+ */
+$copyId = 1;
+$eTag = $ossClient->uploadPartCopy($bucket, $copiedObject, $bucket, $object, $copyId, $upload_id);
+$upload_parts[] = array(
+    'PartNumber' => $copyId,
+    'ETag' => $eTag,
+    );
+$listPartsInfo = $ossClient->listParts($bucket, $object, $upload_id);
+
+/**
+ * step 3.
+ */
+$json = 
+    '{
+        "callbackUrl":"callback.oss-demo.com:23450",
+        "callbackHost":"oss-cn-hangzhou.aliyuncs.com",
+        "callbackBody":"{\"mimeType\":${mimeType},\"size\":${size},\"x:var1\":${x:var1},\"x:var2\":${x:var2}}",
+        "callbackBodyType":"application/json"
+    }';
+$var = 
+    '{
+        "x:var1":"value1",
+        "x:var2":"值2"
+    }';
+$options = array(OssClient::OSS_CALLBACK => $json,
+                 OssClient::OSS_CALLBACK_VAR => $var);
+
+$result = $ossClient->completeMultipartUpload($bucket, $object, $upload_id, $upload_parts, $options);
+Common::println($result['body']);
+Common::println($result['info']['http_code']);

+ 84 - 0
vendor/aliyuncs/oss-sdk-php/samples/Common.php

@@ -0,0 +1,84 @@
+<?php
+
+if (is_file(__DIR__ . '/../autoload.php')) {
+    require_once __DIR__ . '/../autoload.php';
+}
+if (is_file(__DIR__ . '/../vendor/autoload.php')) {
+    require_once __DIR__ . '/../vendor/autoload.php';
+}
+require_once __DIR__ . '/Config.php';
+
+use OSS\OssClient;
+use OSS\Core\OssException;
+
+/**
+ * Class Common
+ *
+ * The Common class for 【Samples/*.php】 used to obtain OssClient instance and other common functions
+ */
+class Common
+{
+    const endpoint = Config::OSS_ENDPOINT;
+    const accessKeyId = Config::OSS_ACCESS_ID;
+    const accessKeySecret = Config::OSS_ACCESS_KEY;
+    const bucket = Config::OSS_TEST_BUCKET;
+
+    /**
+     * Get an OSSClient instance according to config.
+     *
+     * @return OssClient An OssClient instance
+     */
+    public static function getOssClient()
+    {
+        try {
+            $ossClient = new OssClient(self::accessKeyId, self::accessKeySecret, self::endpoint, false);
+        } catch (OssException $e) {
+            printf(__FUNCTION__ . "creating OssClient instance: FAILED\n");
+            printf($e->getMessage() . "\n");
+            return null;
+        }
+        return $ossClient;
+    }
+
+    public static function getBucketName()
+    {
+        return self::bucket;
+    }
+
+    /**
+     * A tool function which creates a bucket and exists the process if there are exceptions
+     */
+    public static function createBucket()
+    {
+        $ossClient = self::getOssClient();
+        if (is_null($ossClient)) exit(1);
+        $bucket = self::getBucketName();
+        $acl = OssClient::OSS_ACL_TYPE_PUBLIC_READ;
+        try {
+            $ossClient->createBucket($bucket, $acl);
+        } catch (OssException $e) {
+
+            $message = $e->getMessage();
+            if (\OSS\Core\OssUtil::startsWith($message, 'http status: 403')) {
+                echo "Please Check your AccessKeyId and AccessKeySecret" . "\n";
+                exit(0);
+            } elseif (strpos($message, "BucketAlreadyExists") !== false) {
+                echo "Bucket already exists. Please check whether the bucket belongs to you, or it was visited with correct endpoint. " . "\n";
+                exit(0);
+            }
+            printf(__FUNCTION__ . ": FAILED\n");
+            printf($e->getMessage() . "\n");
+            return;
+        }
+        print(__FUNCTION__ . ": OK" . "\n");
+    }
+
+    public static function println($message)
+    {
+        if (!empty($message)) {
+            echo strval($message) . "\n";
+        }
+    }
+}
+
+# Common::createBucket();

+ 15 - 0
vendor/aliyuncs/oss-sdk-php/samples/Config.php

@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * Class Config
+ *
+ * Make configurations required by the sample.
+ * Users can run RunAll.php which runs all the samples after configuring Endpoint, AccessId, and AccessKey.
+ */
+final class Config
+{
+    const OSS_ACCESS_ID = 'update me';
+    const OSS_ACCESS_KEY = 'update me';
+    const OSS_ENDPOINT = 'update me';
+    const OSS_TEST_BUCKET = 'update me';
+}

+ 76 - 0
vendor/aliyuncs/oss-sdk-php/samples/CredentialsPhp.php

@@ -0,0 +1,76 @@
+<?php
+
+//=============================================================================
+
+//How to use credentials-php to access oss
+
+// step 1:Install credentials-php  composer require alibabacloud/credentials
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+use OSS\Core\OssException;
+use OSS\Credentials\CredentialsProvider;
+use AlibabaCloud\Credentials\Credential;
+use OSS\Credentials\StaticCredentialsProvider;
+
+// public provider conversion class
+class AlibabaCloudCredentialsWrapper implements CredentialsProvider{
+    /**
+     * @var Credential
+     */
+    private $warpper;
+    public function __construct($credential){
+        $this->warpper = $credential;
+    }
+    public function getCredentials(){
+        $ak = $this->warpper->getAccessKeyId();
+        $sk = $this->warpper->getAccessKeySecret();
+        $token = $this->warpper->getSecurityToken();
+        return new StaticCredentialsProvider($ak, $sk, $token);
+    }
+}
+
+$bucket = Common::getBucketName();
+
+//AccessKey Credentials demo
+$credential = new Credential(array(
+    'type'              => 'access_key',
+    'access_key_id'     => '<access_key_id>',
+    'access_key_secret' => '<accessKey_secret>',
+));
+$providerWarpper = new AlibabaCloudCredentialsWrapper($credential);
+$config = array(
+    'provider' => $providerWarpper,
+    'endpoint'=> '<endpoint>'
+);
+try {
+    $ossClient = new OssClient($config);
+    $ossClient->putObject($bucket,'c.file','hi oss,this is credentials test of access key');
+    $result = $ossClient->getObject($bucket,'c.file');
+    var_dump($result);
+} catch (OssException $e) {
+    printf($e->getMessage() . "\n");
+    return;
+}
+
+
+// EcsRamRole Credentials demo
+$ecsRamRole = new Credential(array(
+    'type'      => 'ecs_ram_role',
+    'role_name' => 'EcsRamRoleOssTest',
+));
+$providerWarpper = new AlibabaCloudCredentialsWrapper($ecsRamRole);
+$bucket = 'oss-bucket-cd-yp-test';
+$config = array(
+    'provider' => $providerWarpper,
+    'endpoint'=> '<endpoint>'
+);
+try {
+    $ossClient = new OssClient($config);
+    $ossClient->putObject($bucket,'c.file','hi oss,this is credentials test of EcsRamRole');
+    $result = $ossClient->getObject($bucket,'c.file');
+    var_dump($result);
+} catch (OssException $e) {
+    printf($e->getMessage() . "\n");
+    return;
+}

+ 63 - 0
vendor/aliyuncs/oss-sdk-php/samples/CredentialsProvider.php

@@ -0,0 +1,63 @@
+<?php
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+use OSS\Core\OssException;
+use OSS\Credentials\StaticCredentialsProvider;
+use OSS\Credentials\EnvironmentVariableCredentialsProvider;
+$bucket = Common::getBucketName();
+
+// Access Key Provider demo
+$id = '<access_key_id>';
+$secret = '<accessKey_secret>';
+$provider = new StaticCredentialsProvider($id,$secret);
+$config = array(
+    'provider' => $provider,
+    'endpoint'=>'<endpoint>'
+);
+try {
+    $ossClient = new OssClient($config);
+    $ossClient->putObject($bucket,'c.file','hi oss,this is credentials test of access key provider');
+    $result = $ossClient->getObject($bucket,'c.file');
+    var_dump($result);
+} catch (OssException $e) {
+    printf($e->getMessage() . "\n");
+    return;
+}
+
+// Sts provider demo
+$id = '<access_key_id>';
+$secret = '<accessKey_secret>';
+$token = '<security_token>';
+$provider = new StaticCredentialsProvider($id,$secret,$token);
+$config = array(
+    'provider' => $provider,
+    'endpoint'=> "<endpoint>"
+);
+
+try {
+    $ossClient = new OssClient($config);
+    $ossClient->putObject($bucket,'c.file','hi oss,this is credentials test of sts provider');
+    $result = $ossClient->getObject($bucket,'c.file');
+    var_dump($result);
+} catch (OssException $e) {
+    printf($e->getMessage() . "\n");
+    return;
+}
+
+// read from env
+$envProvider = new EnvironmentVariableCredentialsProvider();
+$config = array(
+    'provider' => $envProvider,
+    'endpoint'=> "<endpoint>"
+);
+
+try {
+    $ossClient = new OssClient($config);
+    $ossClient->putObject($bucket,'c.file','hi oss,this is credentials test of sts provider');
+    $result = $ossClient->getObject($bucket,'c.file');
+    var_dump($result);
+} catch (OssException $e) {
+    printf($e->getMessage() . "\n");
+    return;
+}

+ 87 - 0
vendor/aliyuncs/oss-sdk-php/samples/Image.php

@@ -0,0 +1,87 @@
+<?php
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+
+$bucketName = Common::getBucketName();
+$object = "example.jpg";
+$ossClient = Common::getOssClient();
+$download_file = "download.jpg";
+if (is_null($ossClient)) exit(1);
+
+//******************************* Simple Usage ***************************************************************
+
+// Upload example.jpg to the specified bucket and rename it to $object.
+$ossClient->uploadFile($bucketName, $object, "example.jpg");
+
+// Image resize
+$options = array(
+    OssClient::OSS_FILE_DOWNLOAD => $download_file,
+    OssClient::OSS_PROCESS => "image/resize,m_fixed,h_100,w_100", );
+$ossClient->getObject($bucketName, $object, $options);
+printImage("imageResize",$download_file);
+
+// Image crop
+$options = array(
+    OssClient::OSS_FILE_DOWNLOAD => $download_file,
+    OssClient::OSS_PROCESS => "image/crop,w_100,h_100,x_100,y_100,r_1", );
+$ossClient->getObject($bucketName, $object, $options);
+printImage("iamgeCrop", $download_file);
+
+// Image rotate
+$options = array(
+    OssClient::OSS_FILE_DOWNLOAD => $download_file,
+    OssClient::OSS_PROCESS => "image/rotate,90", );
+$ossClient->getObject($bucketName, $object, $options);
+printImage("imageRotate", $download_file);
+
+// Image sharpen
+$options = array(
+    OssClient::OSS_FILE_DOWNLOAD => $download_file,
+    OssClient::OSS_PROCESS => "image/sharpen,100", );
+$ossClient->getObject($bucketName, $object, $options);
+printImage("imageSharpen", $download_file);
+
+// Add watermark into a image
+$options = array(
+    OssClient::OSS_FILE_DOWNLOAD => $download_file,
+    OssClient::OSS_PROCESS => "image/watermark,text_SGVsbG8g5Zu-54mH5pyN5YqhIQ", );
+$ossClient->getObject($bucketName, $object, $options);
+printImage("imageWatermark", $download_file);
+
+// Image format convertion
+$options = array(
+    OssClient::OSS_FILE_DOWNLOAD => $download_file,
+    OssClient::OSS_PROCESS => "image/format,png", );
+$ossClient->getObject($bucketName, $object, $options);
+printImage("imageFormat", $download_file);
+
+// Get image information
+$options = array(
+    OssClient::OSS_FILE_DOWNLOAD => $download_file,
+    OssClient::OSS_PROCESS => "image/info", );
+$ossClient->getObject($bucketName, $object, $options);
+printImage("imageInfo", $download_file);
+
+
+/**
+ * Generate a signed url which could be used in browser to access the object. The expiration time is 1 hour.
+ */
+ $timeout = 3600;
+$options = array(
+    OssClient::OSS_PROCESS => "image/resize,m_lfit,h_100,w_100",
+    );
+$signedUrl = $ossClient->signUrl($bucketName, $object, $timeout, "GET", $options);
+Common::println("rtmp url: \n" . $signedUrl);
+
+// Finally delete the $object uploaded.
+$ossClient->deleteObject($bucketName, $object);     
+
+function printImage($func, $imageFile)
+{
+    $array = getimagesize($imageFile);
+    Common::println("$func, image width: " . $array[0]);
+    Common::println("$func, image height: " . $array[1]);
+    Common::println("$func, image type: " . ($array[2] === 2 ? 'jpg' : 'png'));
+    Common::println("$func, image size: " . ceil(sprintf('%u',filesize($imageFile))));
+}

+ 131 - 0
vendor/aliyuncs/oss-sdk-php/samples/LiveChannel.php

@@ -0,0 +1,131 @@
+<?php
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+use OSS\Model\LiveChannelConfig;
+
+$bucket = Common::getBucketName();
+$ossClient = Common::getOssClient();
+if (is_null($ossClient)) exit(1);
+
+//******************************* Simple Usage *******************************************************
+
+/**
+ * Create a Live Channel
+ * The live channel's name is test_rtmp_live.
+ * The play url file is named as test.m3u8, which includes 3 ts files.
+ * The time period of each file is 5 seconds.(It is recommneded value only for demo purpose, the actual period depends on the key frame.)
+ *
+ */
+$config = new LiveChannelConfig(array(
+            'description' => 'live channel test',
+            'type' => 'HLS',
+            'fragDuration' => 10,
+            'fragCount' => 5,
+            'playListName' => 'hello.m3u8'
+        ));
+$info = $ossClient->putBucketLiveChannel($bucket, 'test_rtmp_live', $config);
+Common::println("bucket $bucket liveChannel created:\n" . 
+"live channel name: ". $info->getName() . "\n" .
+"live channel description: ". $info->getDescription() . "\n" .
+"publishurls: ". $info->getPublishUrls()[0] . "\n" .
+"playurls: ". $info->getPlayUrls()[0] . "\n");
+
+/**
+  * You can use listBucketLiveChannels to list and manage all existing live channels.
+  * Prefix can be used to filter listed live channels by prefix.
+  * Max_keys indicates the maximum numbers of live channels that can be listed in an iterator at one time. Its value is 1000 in maximum and 100 by default.
+ */
+$list = $ossClient->listBucketLiveChannels($bucket);
+Common::println("bucket $bucket listLiveChannel:\n" . 
+"list live channel prefix: ". $list->getPrefix() . "\n" .
+"list live channel marker: ". $list->getMarker() . "\n" .
+"list live channel maxkey: ". $list->getMaxKeys() . "\n" .
+"list live channel IsTruncated: ". $list->getIsTruncated() . "\n" .
+"list live channel getNextMarker: ". $list->getNextMarker() . "\n");
+
+foreach($list->getChannelList()  as $list)
+{
+    Common::println("bucket $bucket listLiveChannel:\n" . 
+    "list live channel IsTruncated: ". $list->getName() . "\n" .
+    "list live channel Description: ". $list->getDescription() . "\n" .
+    "list live channel Status: ". $list->getStatus() . "\n" .
+    "list live channel getNextMarker: ". $list->getLastModified() . "\n");
+}
+/**
+  * Obtain the play_url (url used for rtmp stream pushing.
+  * If the the bucket is not globally readable and writable,
+  * the url must be signed as shown in the following.) and pulish_url (the url included in the m3u8 file generated in stream pushing) used to push streams.
+ */
+$play_url = $ossClient->signRtmpUrl($bucket, "test_rtmp_live", 3600, array('params' => array('playlistName' => 'playlist.m3u8')));
+Common::println("bucket $bucket rtmp url: \n" . $play_url);
+$play_url = $ossClient->signRtmpUrl($bucket, "test_rtmp_live", 3600);
+Common::println("bucket $bucket rtmp url: \n" . $play_url);
+
+/**
+  * If you want to disable a created live channel (disable the pushing streaming or do not allow stream pushing to an IP address), call putLiveChannelStatus to change the channel status to "Disabled".
+  * If you want to enable a disabled live channel, call PutLiveChannelStatus to chanage the channel status to "Enabled".
+ */
+$resp = $ossClient->putLiveChannelStatus($bucket, "test_rtmp_live", "enabled");
+
+/**
+  * You can callLiveChannelInfo to get the information about a live channel.
+ */
+$info = $ossClient->getLiveChannelInfo($bucket, 'test_rtmp_live');
+Common::println("bucket $bucket LiveChannelInfo:\n" . 
+"live channel info description: ". $info->getDescription() . "\n" .
+"live channel info status: ". $info->getStatus() . "\n" .
+"live channel info type: ". $info->getType() . "\n" .
+"live channel info fragDuration: ". $info->getFragDuration() . "\n" .
+"live channel info fragCount: ". $info->getFragCount() . "\n" .
+"live channel info playListName: ". $info->getPlayListName() . "\n");
+
+/**
+  * Gets the historical pushing streaming records by calling getLiveChannelHistory. Now the max records to return is 10.
+ */
+$history = $ossClient->getLiveChannelHistory($bucket, "test_rtmp_live");
+if (count($history->getLiveRecordList()) != 0)
+{
+    foreach($history->getLiveRecordList() as $recordList)
+    {
+        Common::println("bucket $bucket liveChannelHistory:\n" . 
+        "live channel history startTime: ". $recordList->getStartTime() . "\n" .
+        "live channel history endTime: ". $recordList->getEndTime() . "\n" .
+        "live channel history remoteAddr: ". $recordList->getRemoteAddr() . "\n");
+    }
+}
+
+/**
+  * Get the live channel's status by calling getLiveChannelStatus.
+  * If the live channel is receiving the pushing stream, all attributes in stat_result are valid.
+  * If the live channel is idle or disabled, then the status is idle or Disabled and other attributes have no meaning.
+ */
+$status = $ossClient->getLiveChannelStatus($bucket, "test_rtmp_live");
+Common::println("bucket $bucket listLiveChannel:\n" . 
+"live channel status status: ". $status->getStatus() . "\n" .
+"live channel status ConnectedTime: ". $status->getConnectedTime() . "\n" .
+"live channel status VideoWidth: ". $status->getVideoWidth() . "\n" .
+"live channel status VideoHeight: ". $status->getVideoHeight() . "\n" .
+"live channel status VideoFrameRate: ". $status->getVideoFrameRate() . "\n" .
+"live channel status VideoBandwidth: ". $status->getVideoBandwidth() . "\n" .
+"live channel status VideoCodec: ". $status->getVideoCodec() . "\n" .
+"live channel status AudioBandwidth: ". $status->getAudioBandwidth() . "\n" .
+"live channel status AudioSampleRate: ". $status->getAudioSampleRate() . "\n" .
+"live channel status AdioCodec: ". $status->getAudioCodec() . "\n");
+
+/**
+ * If you want to generate a play url from the ts files generated from pushing streaming, call postVodPlayList.
+ * Specify the start time to 60 seconds before the current time and the end time to the current time, which means that a video of 60 seconds is generated.
+ * The playlist file is specified to “vod_playlist.m3u8”, which means that a palylist file named vod_playlist.m3u8 is created after the interface is called.
+ */
+$current_time = time();
+$ossClient->postVodPlaylist($bucket,
+    "test_rtmp_live", "vod_playlist.m3u8", 
+    array('StartTime' => $current_time - 60, 
+          'EndTime' => $current_time)
+);
+
+/**
+  *  Call delete_live_channel to delete a live channel if it will no longer be in used.
+ */
+$ossClient->deleteBucketLiveChannel($bucket, "test_rtmp_live");

+ 182 - 0
vendor/aliyuncs/oss-sdk-php/samples/MultipartUpload.php

@@ -0,0 +1,182 @@
+<?php
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+use OSS\Core\OssUtil;
+use OSS\Core\OssException;
+
+$bucket = Common::getBucketName();
+$ossClient = Common::getOssClient();
+if (is_null($ossClient)) exit(1);
+
+//******************************* Simple usage ***************************************************************
+
+/**
+ * See the putObjectByRawAPis usage in complete example to check out basic multipart upload APIs which can be used as resumable upload.
+ */
+
+// Upload a file using the multipart upload interface, which determines to use simple upload or multipart upload based on the file size.
+$ossClient->multiuploadFile($bucket, "file.php", __FILE__, array());
+Common::println("local file " . __FILE__ . " is uploaded to the bucket $bucket, file.php");
+
+
+// Upload local directory's data into target dir
+$ossClient->uploadDir($bucket, "targetdir", __DIR__);
+Common::println("local dir " . __DIR__ . " is uploaded to the bucket $bucket, targetdir/");
+
+
+// List the incomplete multipart uploads
+$listMultipartUploadInfo = $ossClient->listMultipartUploads($bucket, array());
+
+
+//******************************* For complete usage, see the following functions ****************************************************
+
+multiuploadFile($ossClient, $bucket);
+putObjectByRawApis($ossClient, $bucket);
+uploadDir($ossClient, $bucket);
+listMultipartUploads($ossClient, $bucket);
+
+/**
+ * Upload files using multipart upload
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function multiuploadFile($ossClient, $bucket)
+{
+    $object = "test/multipart-test.txt";
+    $file = __FILE__;
+    $options = array();
+
+    try {
+        $ossClient->multiuploadFile($bucket, $object, $file, $options);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ":  OK" . "\n");
+}
+
+/**
+ * Use basic multipart upload for file upload.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @throws OssException
+ */
+function putObjectByRawApis($ossClient, $bucket)
+{
+    $object = "test/multipart-test.txt";
+    /**
+     *  step 1. Initialize a block upload event, that is, a multipart upload process to get an upload id
+     */
+    try {
+        $uploadId = $ossClient->initiateMultipartUpload($bucket, $object);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": initiateMultipartUpload FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": initiateMultipartUpload OK" . "\n");
+    /*
+     * step 2. Upload parts
+     */
+    $partSize = 10 * 1024 * 1024;
+    $uploadFile = __FILE__;
+    $uploadFileSize = sprintf('%u',filesize($uploadFile));
+    $pieces = $ossClient->generateMultiuploadParts($uploadFileSize, $partSize);
+    $responseUploadPart = array();
+    $uploadPosition = 0;
+    $isCheckMd5 = true;
+    foreach ($pieces as $i => $piece) {
+        $fromPos = $uploadPosition + (integer)$piece[$ossClient::OSS_SEEK_TO];
+        $toPos = (integer)$piece[$ossClient::OSS_LENGTH] + $fromPos - 1;
+        $upOptions = array(
+            $ossClient::OSS_FILE_UPLOAD => $uploadFile,
+            $ossClient::OSS_PART_NUM => ($i + 1),
+            $ossClient::OSS_SEEK_TO => $fromPos,
+            $ossClient::OSS_LENGTH => $toPos - $fromPos + 1,
+            $ossClient::OSS_CHECK_MD5 => $isCheckMd5,
+        );
+        if ($isCheckMd5) {
+            $contentMd5 = OssUtil::getMd5SumForFile($uploadFile, $fromPos, $toPos);
+            $upOptions[$ossClient::OSS_CONTENT_MD5] = $contentMd5;
+        }
+        //2. Upload each part to OSS
+        try {
+            $responseUploadPart[] = $ossClient->uploadPart($bucket, $object, $uploadId, $upOptions);
+        } catch (OssException $e) {
+            printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} FAILED\n");
+            printf($e->getMessage() . "\n");
+            return;
+        }
+        printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} OK\n");
+    }
+    $uploadParts = array();
+    foreach ($responseUploadPart as $i => $eTag) {
+        $uploadParts[] = array(
+            'PartNumber' => ($i + 1),
+            'ETag' => $eTag,
+        );
+    }
+    /**
+     * step 3. Complete the upload
+     */
+    try {
+        $ossClient->completeMultipartUpload($bucket, $object, $uploadId, $uploadParts);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": completeMultipartUpload FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    printf(__FUNCTION__ . ": completeMultipartUpload OK\n");
+}
+
+/**
+ * Upload by directories
+ *
+ * @param OssClient $ossClient OssClient
+ * @param string $bucket bucket name
+ *
+ */
+function uploadDir($ossClient, $bucket)
+{
+    $localDirectory = ".";
+    $prefix = "samples/codes";
+    try {
+        $ossClient->uploadDir($bucket, $prefix, $localDirectory);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    printf(__FUNCTION__ . ": completeMultipartUpload OK\n");
+}
+
+/**
+ * Get ongoing multipart uploads
+ *
+ * @param $ossClient OssClient
+ * @param $bucket   string
+ */
+function listMultipartUploads($ossClient, $bucket)
+{
+    $options = array(
+        'max-uploads' => 100,
+        'key-marker' => '',
+        'prefix' => '',
+        'upload-id-marker' => ''
+    );
+    try {
+        $listMultipartUploadInfo = $ossClient->listMultipartUploads($bucket, $options);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": listMultipartUploads FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    printf(__FUNCTION__ . ": listMultipartUploads OK\n");
+    $listUploadInfo = $listMultipartUploadInfo->getUploads();
+    var_dump($listUploadInfo);
+}

+ 765 - 0
vendor/aliyuncs/oss-sdk-php/samples/Object.php

@@ -0,0 +1,765 @@
+<?php
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+use OSS\Core\OssException;
+use OSS\Model\RestoreConfig;
+
+$bucket = Common::getBucketName();
+$ossClient = Common::getOssClient();
+if (is_null($ossClient)) exit(1);
+//******************************* Simple usage ***************************************************************
+
+// Upload the in-memory string (hi, oss) to an OSS file
+$result = $ossClient->putObject($bucket, "b.file", "hi, oss");
+Common::println("b.file is created");
+Common::println($result['x-oss-request-id']);
+Common::println($result['etag']);
+Common::println($result['content-md5']);
+Common::println($result['body']);
+
+// Uploads a local file to an OSS file
+$result = $ossClient->uploadFile($bucket, "c.file", __FILE__);
+Common::println("c.file is created");
+Common::println("b.file is created");
+Common::println($result['x-oss-request-id']);
+Common::println($result['etag']);
+Common::println($result['content-md5']);
+Common::println($result['body']);
+
+// Download an oss object as an in-memory variable
+$content = $ossClient->getObject($bucket, "b.file");
+Common::println("b.file is fetched, the content is: " . $content);
+
+// Add a symlink to an object
+$content = $ossClient->putSymlink($bucket, "test-symlink", "b.file");
+Common::println("test-symlink is created");
+Common::println($result['x-oss-request-id']);
+Common::println($result['etag']);
+
+// Get a symlink
+$content = $ossClient->getSymlink($bucket, "test-symlink");
+Common::println("test-symlink refer to : " . $content[OssClient::OSS_SYMLINK_TARGET]);
+
+// Download an object to a local file.
+$options = array(
+    OssClient::OSS_FILE_DOWNLOAD => "./c.file.localcopy",
+);
+$ossClient->getObject($bucket, "c.file", $options);
+Common::println("b.file is fetched to the local file: c.file.localcopy");
+Common::println("b.file is created");
+
+
+// Restore Object
+$day = 3;
+$tier = 'Expedited';
+$config = new RestoreConfig($day,$tier);
+$options = array(
+    OssClient::OSS_RESTORE_CONFIG => $config
+);
+$ossClient->restoreObject($bucket, 'b.file',$options);
+
+
+// Copy an object
+$result = $ossClient->copyObject($bucket, "c.file", $bucket, "c.file.copy");
+Common::println("lastModifiedTime: " . $result[0]);
+Common::println("ETag: " . $result[1]);
+
+// Check whether an object exists
+$doesExist = $ossClient->doesObjectExist($bucket, "c.file.copy");
+Common::println("file c.file.copy exist? " . ($doesExist ? "yes" : "no"));
+
+// Delete an object
+$result = $ossClient->deleteObject($bucket, "c.file.copy");
+Common::println("c.file.copy is deleted");
+Common::println("b.file is created");
+Common::println($result['x-oss-request-id']);
+
+// Check whether an object exists
+$doesExist = $ossClient->doesObjectExist($bucket, "c.file.copy");
+Common::println("file c.file.copy exist? " . ($doesExist ? "yes" : "no"));
+
+// Delete multiple objects in batch
+$result = $ossClient->deleteObjects($bucket, array("b.file", "c.file"));
+foreach($result as $object)
+    Common::println($object);
+
+sleep(2);
+unlink("c.file.localcopy");
+
+// Normal upload and download speed limit
+$object= "b.file";
+$content = "hello world";
+
+// The speed limit is 100 KB/s, which is 819200 bit/s.
+$options = array(
+    OssClient::OSS_HEADERS => array(
+        OssClient::OSS_TRAFFIC_LIMIT => 819200,
+    ));
+// Speed limit upload.
+$ossClient->putObject($bucket, $object, $content, $options);
+
+// Speed limit download.
+$ossClient->getObject($bucket, $object, $options);
+
+// Signed URL upload and download speed limit
+
+// Create a URL for uploading with a limited rate, and the validity period is 60s.
+$timeout = 60;
+$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "PUT", $options);
+Common::println("b.file speed limit upload url:".$signedUrl.PHP_EOL);
+
+// Create a URL for speed-limited downloads, with a validity period of 120s.
+$timeout = 120;
+$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET", $options);
+Common::println("b.file speed limit download url:".$signedUrl.PHP_EOL);
+
+//******************************* For complete usage, see the following functions ****************************************************
+
+listObjects($ossClient, $bucket);
+listObjectsV2($ossClient, $bucket);
+listAllObjects($ossClient, $bucket);
+createObjectDir($ossClient, $bucket);
+putObject($ossClient, $bucket);
+uploadFile($ossClient, $bucket);
+getObject($ossClient, $bucket);
+getObjectToLocalFile($ossClient, $bucket);
+copyObject($ossClient, $bucket);
+modifyMetaForObject($ossClient, $bucket);
+getObjectMeta($ossClient, $bucket);
+deleteObject($ossClient, $bucket);
+deleteObjects($ossClient, $bucket);
+doesObjectExist($ossClient, $bucket);
+getSymlink($ossClient, $bucket);
+putSymlink($ossClient, $bucket);
+putObjectSpeed($ossClient, $bucket);
+getObjectSpeed($ossClient, $bucket);
+signUrlSpeedUpload($ossClient, $bucket);
+signUrlSpeedDownload($ossClient, $bucket);
+restoreObject($ossClient,$bucket);
+/**
+ * Create a 'virtual' folder
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function createObjectDir($ossClient, $bucket)
+{
+    try {
+        $ossClient->createObjectDir($bucket, "dir");
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Upload in-memory data to oss
+ *
+ * Simple upload---upload specified in-memory data to an OSS object
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function putObject($ossClient, $bucket)
+{
+    $object = "oss-php-sdk-test/upload-test-object-name.txt";
+    $content = file_get_contents(__FILE__);
+    $options = array();
+    try {
+        $ossClient->putObject($bucket, $object, $content, $options);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+
+/**
+ * Uploads a local file to OSS
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function uploadFile($ossClient, $bucket)
+{
+    $object = "oss-php-sdk-test/upload-test-object-name.txt";
+    $filePath = __FILE__;
+    $options = array();
+
+    try {
+        $ossClient->uploadFile($bucket, $object, $filePath, $options);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Lists all files and folders in the bucket.
+ * Note if there's more items than the max-keys specified, the caller needs to use the nextMarker returned as the value for the next call's maker paramter.
+ * Loop through all the items returned from ListObjects.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function listObjects($ossClient, $bucket)
+{
+    $prefix = 'oss-php-sdk-test/';
+    $delimiter = '/';
+    $nextMarker = '';
+    $maxkeys = 1000;
+    $options = array(
+        'delimiter' => $delimiter,
+        'prefix' => $prefix,
+        'max-keys' => $maxkeys,
+        'marker' => $nextMarker,
+    );
+    try {
+        $listObjectInfo = $ossClient->listObjects($bucket, $options);
+        printf("Bucket Name: %s". "\n",$listObjectInfo->getBucketName());
+        printf("Prefix: %s". "\n",$listObjectInfo->getPrefix());
+        printf("Marker: %s". "\n",$listObjectInfo->getMarker());
+        printf("Next Marker: %s". "\n",$listObjectInfo->getNextMarker());
+        printf("Max Keys: %s". "\n",$listObjectInfo->getMaxKeys());
+        printf("Delimiter: %s". "\n",$listObjectInfo->getDelimiter());
+        printf("Is Truncated: %s". "\n",$listObjectInfo->getIsTruncated());
+        $objectList = $listObjectInfo->getObjectList(); // object list
+        $prefixList = $listObjectInfo->getPrefixList(); // directory list
+        if (!empty($objectList)) {
+            print("objectList:\n");
+            foreach ($objectList as $objectInfo) {
+                printf("Object Name: %s". "\n",$objectInfo->getKey());
+                printf("Object Size: %s". "\n",$objectInfo->getSize());
+                printf("Object Type: %s". "\n",$objectInfo->getType());
+                printf("Object ETag: %s". "\n",$objectInfo->getETag());
+                printf("Object Last Modified: %s". "\n",$objectInfo->getLastModified());
+                printf("Object Storage Class: %s". "\n",$objectInfo->getStorageClass());
+
+                if ($objectInfo->getRestoreInfo()){
+                    printf("Restore Info: %s". "\n",$objectInfo->getRestoreInfo() );
+                }
+
+                if($objectInfo->getOwner()){
+                    printf("Owner Id:".$objectInfo->getOwner()->getId() . "\n");
+                    printf("Owner Name:".$objectInfo->getOwner()->getDisplayName() . "\n");
+                }
+            }
+        }
+        if (!empty($prefixList)) {
+            print("prefixList: \n");
+            foreach ($prefixList as $prefixInfo) {
+                printf("Common Prefix:%s\n",$prefixInfo->getPrefix());
+            }
+        }
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Lists all files and folders in the bucket.
+ * Note if there's more items than the max-keys specified, the caller needs to use the nextMarker returned as the value for the next call's maker paramter.
+ * Loop through all the items returned from ListObjects.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function listObjectsV2($ossClient, $bucket)
+{
+    $prefix = 'oss-php-sdk-test/';
+    $delimiter = '/';
+    $maxkeys = 1000;
+    $options = array(
+        'delimiter' => $delimiter,
+        'prefix' => $prefix,
+        'max-keys' => $maxkeys,
+        'start-after' =>'test-object',
+        'fetch-owner' =>'true',
+    );
+    try {
+        $listObjectInfo = $ossClient->listObjectsV2($bucket, $options);
+        printf("Bucket Name: %s". "\n",$listObjectInfo->getBucketName());
+        printf("Prefix: %s". "\n",$listObjectInfo->getPrefix());
+        printf("Next Continuation Token: %s". "\n",$listObjectInfo->getNextContinuationToken());
+        printf("Continuation Token: %s". "\n",$listObjectInfo->getContinuationToken());
+        printf("Max Keys: %s". "\n",$listObjectInfo->getMaxKeys());
+        printf("Key Count: %s". "\n",$listObjectInfo->getKeyCount());
+        printf("Delimiter: %s". "\n",$listObjectInfo->getDelimiter());
+        printf("Is Truncated: %s". "\n",$listObjectInfo->getIsTruncated());
+        printf("Start After: %s". "\n",$listObjectInfo->getStartAfter());
+        $objectList = $listObjectInfo->getObjectList(); // object list
+        $prefixList = $listObjectInfo->getPrefixList(); // directory list
+        if (!empty($objectList)) {
+            print("objectList:\n");
+            foreach ($objectList as $objectInfo) {
+                printf("Object Name: %s". "\n",$objectInfo->getKey());
+                printf("Object Size: %s". "\n",$objectInfo->getSize());
+                printf("Object Type: %s". "\n",$objectInfo->getType());
+                printf("Object ETag: %s". "\n",$objectInfo->getETag());
+                printf("Object Last Modified: %s". "\n",$objectInfo->getLastModified());
+                printf("Object Storage Class: %s". "\n",$objectInfo->getStorageClass());
+
+                if ($objectInfo->getRestoreInfo()){
+                    printf("Restore Info: %s". "\n",$objectInfo->getRestoreInfo() );
+                }
+
+                if($objectInfo->getOwner()){
+                    printf("Owner Id:".$objectInfo->getOwner()->getId() . "\n");
+                    printf("Owner Name:".$objectInfo->getOwner()->getDisplayName() . "\n");
+                }
+            }
+        }
+        if (!empty($prefixList)) {
+            print("prefixList: \n");
+            foreach ($prefixList as $prefixInfo) {
+                printf("Common Prefix:%s\n",$prefixInfo->getPrefix());
+            }
+        }
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Lists all folders and files under the bucket. Use nextMarker repeatedly to get all objects.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function listAllObjects($ossClient, $bucket)
+{
+    // Create dir/obj 'folder' and put some files into it.
+    for ($i = 0; $i < 100; $i += 1) {
+        $ossClient->putObject($bucket, "dir/obj" . strval($i), "hi");
+        $ossClient->createObjectDir($bucket, "dir/obj" . strval($i));
+    }
+
+    $prefix = 'dir/';
+    $delimiter = '/';
+    $nextMarker = '';
+    $maxkeys = 30;
+
+    while (true) {
+        $options = array(
+            'delimiter' => $delimiter,
+            'prefix' => $prefix,
+            'max-keys' => $maxkeys,
+            'marker' => $nextMarker,
+        );
+        var_dump($options);
+        try {
+            $listObjectInfo = $ossClient->listObjects($bucket, $options);
+        } catch (OssException $e) {
+            printf(__FUNCTION__ . ": FAILED\n");
+            printf($e->getMessage() . "\n");
+            return;
+        }
+        // Get the nextMarker, and it would be used as the next call's marker parameter to resume from the last call
+        $nextMarker = $listObjectInfo->getNextMarker();
+        $listObject = $listObjectInfo->getObjectList();
+        $listPrefix = $listObjectInfo->getPrefixList();
+        var_dump(count($listObject));
+        var_dump(count($listPrefix));
+        if ($nextMarker === '') {
+            break;
+        }
+    }
+}
+
+/**
+ * Get the content of an object.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function getObject($ossClient, $bucket)
+{
+    $object = "oss-php-sdk-test/upload-test-object-name.txt";
+    $options = array();
+    try {
+        $content = $ossClient->getObject($bucket, $object, $options);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+    if (file_get_contents(__FILE__) === $content) {
+        print(__FUNCTION__ . ": FileContent checked OK" . "\n");
+    } else {
+        print(__FUNCTION__ . ": FileContent checked FAILED" . "\n");
+    }
+}
+
+/**
+ * Put symlink
+ *
+ * @param OssClient $ossClient  The Instance of OssClient
+ * @param string $bucket bucket name
+ * @return null
+ */
+function putSymlink($ossClient, $bucket)
+{
+    $symlink = "test-samples-symlink";
+    $object = "test-samples-object";
+    try {
+        $ossClient->putObject($bucket, $object, 'test-content');
+        $ossClient->putSymlink($bucket, $symlink, $object);
+        $content = $ossClient->getObject($bucket, $symlink);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+    if ($content == 'test-content') {
+        print(__FUNCTION__ . ": putSymlink checked OK" . "\n");
+    } else {
+        print(__FUNCTION__ . ": putSymlink checked FAILED" . "\n");
+    }
+}
+
+/**
+ * Get symlink
+ *
+ * @param OssClient $ossClient  OssClient instance
+ * @param string $bucket  bucket name
+ * @return null
+ */
+function getSymlink($ossClient, $bucket)
+{
+    $symlink = "test-samples-symlink";
+    $object = "test-samples-object";
+    try {
+        $ossClient->putObject($bucket, $object, 'test-content');
+        $ossClient->putSymlink($bucket, $symlink, $object);
+        $content = $ossClient->getSymlink($bucket, $symlink);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+    if ($content[OssClient::OSS_SYMLINK_TARGET]) {
+        print(__FUNCTION__ . ": getSymlink checked OK" . "\n");
+    } else {
+        print(__FUNCTION__ . ": getSymlink checked FAILED" . "\n");
+    }
+}
+
+/**
+ * Get_object_to_local_file
+ *
+ * Get object
+ * Download object to a specified file.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function getObjectToLocalFile($ossClient, $bucket)
+{
+    $object = "oss-php-sdk-test/upload-test-object-name.txt";
+    $localfile = "upload-test-object-name.txt";
+    $options = array(
+        OssClient::OSS_FILE_DOWNLOAD => $localfile,
+    );
+
+    try {
+        $ossClient->getObject($bucket, $object, $options);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK, please check localfile: 'upload-test-object-name.txt'" . "\n");
+    if (file_get_contents($localfile) === file_get_contents(__FILE__)) {
+        print(__FUNCTION__ . ": FileContent checked OK" . "\n");
+    } else {
+        print(__FUNCTION__ . ": FileContent checked FAILED" . "\n");
+    }
+    if (file_exists($localfile)) {
+        unlink($localfile);
+    }
+}
+
+/**
+ * Copy object
+ * When the source object is same as the target one, copy operation will just update the metadata.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function copyObject($ossClient, $bucket)
+{
+    $fromBucket = $bucket;
+    $fromObject = "oss-php-sdk-test/upload-test-object-name.txt";
+    $toBucket = $bucket;
+    $toObject = $fromObject . '.copy';
+    $options = array();
+
+    try {
+        $ossClient->copyObject($fromBucket, $fromObject, $toBucket, $toObject, $options);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Update Object Meta
+ * it leverages the feature of copyObject: when the source object is just the target object, the metadata could be updated via copy
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function modifyMetaForObject($ossClient, $bucket)
+{
+    $fromBucket = $bucket;
+    $fromObject = "oss-php-sdk-test/upload-test-object-name.txt";
+    $toBucket = $bucket;
+    $toObject = $fromObject;
+    $copyOptions = array(
+        OssClient::OSS_HEADERS => array(
+            'Cache-Control' => 'max-age=60',
+            'Content-Disposition' => 'attachment; filename="xxxxxx"',
+        ),
+    );
+    try {
+        $ossClient->copyObject($fromBucket, $fromObject, $toBucket, $toObject, $copyOptions);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Get object meta, that is, getObjectMeta
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function getObjectMeta($ossClient, $bucket)
+{
+    $object = "oss-php-sdk-test/upload-test-object-name.txt";
+    try {
+        $objectMeta = $ossClient->getObjectMeta($bucket, $object);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+    if (isset($objectMeta[strtolower('Content-Disposition')]) &&
+        'attachment; filename="xxxxxx"' === $objectMeta[strtolower('Content-Disposition')]
+    ) {
+        print(__FUNCTION__ . ": ObjectMeta checked OK" . "\n");
+    } else {
+        print(__FUNCTION__ . ": ObjectMeta checked FAILED" . "\n");
+    }
+}
+
+/**
+ * Delete an object
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function deleteObject($ossClient, $bucket)
+{
+    $object = "oss-php-sdk-test/upload-test-object-name.txt";
+    try {
+        $ossClient->deleteObject($bucket, $object);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+
+/**
+ * Delete multiple objects in batch
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function deleteObjects($ossClient, $bucket)
+{
+    $objects = array();
+    $objects[] = "oss-php-sdk-test/upload-test-object-name.txt";
+    $objects[] = "oss-php-sdk-test/upload-test-object-name.txt.copy";
+    try {
+        $ossClient->deleteObjects($bucket, $objects);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Check whether an object exists
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function doesObjectExist($ossClient, $bucket)
+{
+    $object = "oss-php-sdk-test/upload-test-object-name.txt";
+    try {
+        $exist = $ossClient->doesObjectExist($bucket, $object);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+    var_dump($exist);
+}
+
+/**
+ * Speed limit upload.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function putObjectSpeed($ossClient, $bucket)
+{
+    $object = "upload-test-object-name.txt";
+    $content = file_get_contents(__FILE__);
+    $options = array(
+        OssClient::OSS_HEADERS => array(
+            OssClient::OSS_TRAFFIC_LIMIT => 819200,
+        ));
+    try {
+        $ossClient->putObject($bucket, $object, $content, $options);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Speed limit download.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function getObjectSpeed($ossClient, $bucket)
+{
+    $object = "upload-test-object-name.txt";
+    $options = array(
+        OssClient::OSS_HEADERS => array(
+            OssClient::OSS_TRAFFIC_LIMIT => 819200,
+        ));
+    try {
+        $ossClient->getObject($bucket, $object, $options);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Speed limit download.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function signUrlSpeedUpload($ossClient, $bucket)
+{
+    $object = "upload-test-object-name.txt";
+    $timeout = 120;
+    $options = array(
+        OssClient::OSS_TRAFFIC_LIMIT => 819200,
+    );
+    $timeout = 60;
+    $signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "PUT", $options);
+    print($signedUrl);
+}
+
+
+/**
+ * Speed limit download.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function signUrlSpeedDownload($ossClient, $bucket)
+{
+    $object = "upload-test-object-name.txt";
+    $timeout = 120;
+    $options = array(
+        OssClient::OSS_TRAFFIC_LIMIT => 819200,
+    );
+    $signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET", $options);
+    print($signedUrl);
+    print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Restore object
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function restoreObject($ossClient, $bucket)
+{
+    $object = "oss-php-sdk-test/upload-test-object-name.txt";
+    $day = 3;
+    $tier = 'Expedited';
+    $config = new RestoreConfig($day,$tier);
+    $options = array(
+        OssClient::OSS_RESTORE_CONFIG => $config
+    );
+    try {
+        $ossClient->restoreObject($bucket, $object,$options);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": OK" . "\n");
+}

+ 366 - 0
vendor/aliyuncs/oss-sdk-php/samples/ObjectTagging.php

@@ -0,0 +1,366 @@
+<?php
+
+require_once __DIR__ . '/Common.php';
+
+use OSS\OssClient;
+use OSS\Core\OssException;
+use OSS\Core\OssUtil;
+use OSS\Model\TaggingConfig;
+use OSS\Model\Tag;
+
+$bucket = Common::getBucketName();
+$ossClient = Common::getOssClient();
+if (is_null($ossClient)) exit(1);
+//******************************* Simple usage ***************************************************************
+
+// Upload Object add tag
+$object = "b.file";
+$options = array(
+	OssClient::OSS_HEADERS => array(
+		'x-oss-tagging' => 'key1=value1&key2=value2&key3=value3',
+	)
+);
+$result = $ossClient->putObject($bucket, $object, __FILE__,$options);
+Common::println("b.file is created");
+Common::println("tag is:".$result['oss-requestheaders']['x-oss-tagging']);
+
+// Add object tags when uploading parts
+
+$object = "b.file";
+$file = __FILE__;
+$options = array(
+	OssClient::OSS_CHECK_MD5 => true,
+	OssClient::OSS_PART_SIZE => 1,
+	OssClient::OSS_HEADERS => array(
+		'x-oss-tagging' => 'key1=value1&key2=value2&key3=value3',
+	),
+);
+$result = $ossClient->multiuploadFile($bucket, $object, $file, $options);
+Common::println("b.file is created");
+Common::println("tag is:".$result['oss-requestheaders']['x-oss-tagging']);
+
+// get tags from object
+
+$object = "a.txt";
+$result = $ossClient->getObjectTagging($bucket,$object);
+printf($object.'tags is: '.$result->serializeToXml().PHP_EOL);
+
+
+// Add or change object tags to uploaded objects
+$config = new TaggingConfig();
+$config->addTag(new Tag("key1", "value1"));
+$config->addTag(new Tag("key2", "value2"));
+
+$ossClient->putObjectTagging($bucket, $object, $config);
+// Add object tags when uploading
+$object = "a.txt";
+$filePath = "D:\\localpath\\b.txt";
+$filePath1 = "D:\\localpath\\c.txt";
+$options = array(
+	OssClient::OSS_HEADERS => array(
+		'x-oss-tagging' => 'key1=value1&key2=value2',
+	)
+);
+$position = $ossClient->appendObject($bucket, $object,'content one',0,$options);
+printf('Content one append object Success'.PHP_EOL);
+$position = $ossClient->appendObject($bucket, $object, 'content two',$position,$options);
+printf('Content two append object Success'.PHP_EOL);
+
+// delete tags
+$object = "g.file";
+$ossClient->deleteObjectTagging($bucket, $object);
+printf($object.' tags has deleted'.PHP_EOL);
+
+// Copy a small file
+$fromBucket = $bucket;
+$fromObject = "a.file";
+$toBucket = $bucket;
+$toObject = $fromObject . '.copy';
+$options = array(
+	OssClient::OSS_HEADERS => array(
+		'x-oss-tagging-directive' => 'Replace',
+		'x-oss-tagging'=>'key1=value1&key2=value2&key3=value3',
+	));
+$ossClient->copyObject($fromBucket, $fromObject, $toBucket, $toObject, $options);
+$config = $ossClient->getObjectTagging($bucket, $toObject);
+Common::println('object tags is:'.$config->serializeToXml());
+
+// Copy a large file
+$fromBucket = $bucket;
+$fromObject = "a.file";
+$toBucket = $bucket;
+$toObject = $fromObject . '.copy';
+$options = array(
+	OssClient::OSS_HEADERS => array(
+		'x-oss-tagging'=>'key1=value1&key2=value2&key3=value3',
+	));
+
+$part_size = 256*1024*1024;
+$objectMeta = $ossClient->getObjectMeta($fromBucket, $fromObject);
+$length = $objectMeta['content-length'];
+$upload_id = $ossClient->initiateMultipartUpload($toBucket, $toObject,$options);
+$pieces = $ossClient->generateMultiuploadParts($length, $part_size);
+$response_upload_part = array();
+$copyId = 1;
+$upload_position = 0;
+foreach ($pieces as $i => $piece) {
+	$from_pos = $upload_position + (integer)$piece['seekTo'];
+	$to_pos = (integer)$piece['length'] + $from_pos - 1;
+	$up_options = array(
+		'start' => $from_pos,
+		'end' => $to_pos,
+	);
+	$response_upload_part[] = $ossClient->uploadPartCopy( $fromBucket, $fromObject, $toBucket, $toObject, $copyId, $upload_id, $up_options);
+	printf("initiateMultipartUpload, uploadPartCopy - part#{$copyId} OK\n");
+	$copyId = $copyId + 1;
+}
+$upload_parts = array();
+foreach ($response_upload_part as $i => $etag) {
+	$upload_parts[] = array(
+		'PartNumber' => ($i + 1),
+		'ETag' => $etag,
+	);
+}
+$result = $ossClient->completeMultipartUpload($toBucket, $toObject, $upload_id, $upload_parts);
+$config = $ossClient->getObjectTagging($bucket, $toObject);
+Common::println($toObject.' tags is:'.$config->serializeToXml());
+
+
+
+//******************************* For complete usage, see the following functions ****************************************************
+
+putObject($ossClient,$bucket);
+multiuploadFile($ossClient,$bucket);
+appendObject($ossClient,$bucket);
+putObjectTagging($ossClient,$bucket);
+getObjectTagging($ossClient,$bucket);
+deleteObjectTagging($ossClient,$bucket);
+copyObjectSmall($ossClient,$bucket);
+copyObjectLarge($ossClient,$bucket);
+/**
+ *  Upload Object add tag
+ * @param $ossClient OssClient
+ * @param $bucket bucket_name
+ */
+function putObject($ossClient,$bucket){
+	$object = "b.file";
+	$options = array(
+		OssClient::OSS_HEADERS => array(
+			'x-oss-tagging' => 'key1=value1&key2=value2&key3=value3',
+		));
+	try {
+		// 通过简单上传的方式上传Object。
+		$result = $ossClient->putObject($bucket, $object, __FILE__,$options);
+		Common::println("b.file is created".PHP_EOL);
+		Common::println("tag is:".$result['oss-requestheaders']['x-oss-tagging'].PHP_EOL);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Add object tags when uploading parts
+ * @param $ossClient OssClient
+ * @param $bucket bucket_name
+ */
+function multiuploadFile($ossClient,$bucket){
+	$object = "b.file";
+	$file = __FILE__;
+	$options = array(
+		OssClient::OSS_CHECK_MD5 => true,
+		OssClient::OSS_PART_SIZE => 1,
+		OssClient::OSS_HEADERS => array(
+			'x-oss-tagging' => 'key1=value1&key2=value2&key3=value3',
+		),
+	);
+	
+	try {
+		$result = $ossClient->multiuploadFile($bucket, $object, $file, $options);
+		Common::println("b.file is created".PHP_EOL);
+		Common::println("tag is:".$result['oss-requestheaders']['x-oss-tagging'].PHP_EOL);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Add object tags when uploading
+ * @param $ossClient OssClient
+ * @param $bucket bucket_name string
+ */
+function appendObject($ossClient,$bucket){
+	$object = "g.file";
+	$content_array = array('Hello OSS', 'Hi OSS');
+	$options = array(
+		OssClient::OSS_HEADERS => array(
+			'x-oss-tagging' => 'key1=value1&key2=value2',
+		));
+	
+	try {
+		$position = $ossClient->appendObject($bucket, $object, $content_array[0], 0, $options);
+		printf($content_array[0].' append object Success'.PHP_EOL);
+		$position = $ossClient->appendObject($bucket, $object, $content_array[1], $position);
+		printf($content_array[1].' append object Success'.PHP_EOL);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * @param $ossClient OssClient
+ * @param $bucket bucket_name string
+ * @throws OssException
+ */
+function putObjectTagging($ossClient,$bucket){
+	$object = "g.file";
+	$config = new TaggingConfig();
+	$config->addTag(new Tag("key1", "value1"));
+	$config->addTag(new Tag("key2", "value2"));
+	
+	try {
+		$ossClient->putObjectTagging($bucket, $object, $config);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+
+/**
+ * get object tags
+ * @param $ossClient OssClient
+ * @param $bucket bucket_name string
+ */
+function getObjectTagging($ossClient,$bucket){
+	$object = "g.file";
+	try {
+		$config = $ossClient->getObjectTagging($bucket, $object);
+		printf($object." tags is:".$config->serializeToXml().PHP_EOL);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+
+/**
+ * get object tags
+ * @param $ossClient OssClient
+ * @param $bucket bucket_name string
+ */
+function deleteObjectTagging($ossClient,$bucket){
+	$object = "g.file";
+	try {
+		$ossClient->deleteObjectTagging($bucket, $object);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Copy small files
+ * @param $ossClient OssClient
+ * @param $bucket bucket_name string
+ */
+function copyObjectSmall($ossClient,$bucket){
+	$fromBucket = $bucket;
+	$fromObject = "a.file";
+	$toBucket = $bucket;
+	$toObject = $fromObject . '.copy';
+	$options = array(
+		OssClient::OSS_HEADERS => array(
+			'x-oss-tagging-directive' => 'Replace',
+			'x-oss-tagging'=>'key1=value1&key2=value2&key3=value3',
+		));
+	
+	try {
+		$ossClient->copyObject($fromBucket, $fromObject, $toBucket, $toObject, $options);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	$config = $ossClient->getObjectTagging($bucket, $toObject);
+	Common::println('object tags is:'.$config->serializeToXml());
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Copy a large file
+ * @param $ossClient OssClient
+ * @param $bucket bucket_name string
+ */
+function copyObjectLarge($ossClient,$bucket){
+	$fromBucket = $bucket;
+	$fromObject = "a.file";
+	$toBucket = $bucket;
+	$toObject = $fromObject . '.copy';
+	$options = array(
+		OssClient::OSS_HEADERS => array(
+			'x-oss-tagging'=>'key1=value1&key2=value2&key3=value3',
+		));
+	
+	$part_size = 256*1024*1024;
+	try{
+		$objectMeta = $ossClient->getObjectMeta($fromBucket, $fromObject);
+		$length = $objectMeta['content-length'];
+		$upload_id = $ossClient->initiateMultipartUpload($toBucket, $toObject,$options);
+		$pieces = $ossClient->generateMultiuploadParts($length, $part_size);
+		$response_upload_part = array();
+		$copyId = 1;
+		$upload_position = 0;
+		foreach ($pieces as $i => $piece) {
+			$from_pos = $upload_position + (integer)$piece['seekTo'];
+			$to_pos = (integer)$piece['length'] + $from_pos - 1;
+			$up_options = array(
+				'start' => $from_pos,
+				'end' => $to_pos,
+			);
+			$response_upload_part[] = $ossClient->uploadPartCopy( $fromBucket, $fromObject, $toBucket, $toObject, $copyId, $upload_id, $up_options);
+			printf("initiateMultipartUpload, uploadPartCopy - part#{$copyId} OK\n");
+			$copyId = $copyId + 1;
+		}
+		$upload_parts = array();
+		foreach ($response_upload_part as $i => $etag) {
+			$upload_parts[] = array(
+				'PartNumber' => ($i + 1),
+				'ETag' => $etag,
+			);
+		}
+		$result = $ossClient->completeMultipartUpload($toBucket, $toObject, $upload_id, $upload_parts);
+		printf('copy success'. "\n");
+	} catch(OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+		
+		
+	}
+	$config = $ossClient->getObjectTagging($bucket, $toObject);
+	Common::println($toObject.' tags is:'.$config->serializeToXml());
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+

+ 13 - 0
vendor/aliyuncs/oss-sdk-php/samples/RunAll.php

@@ -0,0 +1,13 @@
+<?php
+
+error_reporting(E_ALL | E_NOTICE);
+
+require_once __DIR__ . '/Bucket.php';
+require_once __DIR__ . '/BucketCors.php';
+require_once __DIR__ . '/BucketLifecycle.php';
+require_once __DIR__ . '/BucketReferer.php';
+require_once __DIR__ . '/BucketLogging.php';
+require_once __DIR__ . '/BucketWebsite.php';
+require_once __DIR__ . '/Signature.php';
+require_once __DIR__ . '/Object1.php';
+require_once __DIR__ . '/MultipartUpload.php';

+ 142 - 0
vendor/aliyuncs/oss-sdk-php/samples/Signature.php

@@ -0,0 +1,142 @@
+<?php
+require_once __DIR__ . '/Common.php';
+
+use OSS\Http\RequestCore;
+use OSS\Http\ResponseCore;
+use OSS\OssClient;
+use OSS\Core\OssException;
+
+$bucket = Common::getBucketName();
+$ossClient = Common::getOssClient();
+if (is_null($ossClient)) exit(1);
+
+//******************************* Simple Usage ***************************************************************
+
+$ossClient->uploadFile($bucket, "a.file", __FILE__);
+
+// Generate a signed url for getting an object. The URL can be used in browser directly to download the file.
+$signedUrl = $ossClient->signUrl($bucket, "a.file", 3600);
+Common::println($signedUrl);
+
+// Generate the signed url for putting an object. User can use put method with this url to upload a file to "a.file".
+$signedUrl = $ossClient->signUrl($bucket, "a.file", "3600", "PUT");
+Common::println($signedUrl);
+
+// Generate the signed url for putting an object from local file. The url can be used directly to upload the file to "a.file".
+$signedUrl = $ossClient->signUrl($bucket, "a.file", 3600, "PUT", array('Content-Type' => 'txt'));
+Common::println($signedUrl);
+
+//******************************* For complete usage, see the following functions ****************************************************
+
+getSignedUrlForPuttingObject($ossClient, $bucket);
+getSignedUrlForPuttingObjectFromFile($ossClient, $bucket);
+getSignedUrlForGettingObject($ossClient, $bucket);
+
+/**
+ * Generate the signed url for getObject() to control read accesses under private privilege
+ *
+ * @param $ossClient OssClient OssClient instance
+ * @param $bucket string bucket name
+ * @return null
+ */
+function getSignedUrlForGettingObject($ossClient, $bucket)
+{
+    $object = "test/test-signature-test-upload-and-download.txt";
+    $timeout = 3600;
+    try {
+        $signedUrl = $ossClient->signUrl($bucket, $object, $timeout);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": signedUrl: " . $signedUrl . "\n");
+    /**
+     * Use similar code to access the object by url, or use browser to access the object.
+     */
+    $request = new RequestCore($signedUrl);
+    $request->set_method('GET');
+    $request->add_header('Content-Type', '');
+    $request->send_request();
+    $res = new ResponseCore($request->get_response_header(), $request->get_response_body(), $request->get_response_code());
+    if ($res->isOK()) {
+        print(__FUNCTION__ . ": OK" . "\n");
+    } else {
+        print(__FUNCTION__ . ": FAILED" . "\n");
+    };
+}
+
+/**
+ * Generate the signed url for PutObject to control write accesses under private privilege.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ * @throws OssException
+ */
+function getSignedUrlForPuttingObject($ossClient, $bucket)
+{
+    $object = "test/test-signature-test-upload-and-download.txt";
+    $timeout = 3600;
+    $options = NULL;
+    try {
+        $signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "PUT");
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": signedUrl: " . $signedUrl . "\n");
+    $content = file_get_contents(__FILE__);
+
+    $request = new RequestCore($signedUrl);
+    $request->set_method('PUT');
+    $request->add_header('Content-Type', '');
+    $request->add_header('Content-Length', strlen($content));
+    $request->set_body($content);
+    $request->send_request();
+    $res = new ResponseCore($request->get_response_header(),
+        $request->get_response_body(), $request->get_response_code());
+    if ($res->isOK()) {
+        print(__FUNCTION__ . ": OK" . "\n");
+    } else {
+        print(__FUNCTION__ . ": FAILED" . "\n");
+    };
+}
+
+/**
+ * Generate the signed url for PutObject's signed url. User could use the signed url to upload file directly.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @throws OssException
+ */
+function getSignedUrlForPuttingObjectFromFile($ossClient, $bucket)
+{
+    $file = __FILE__;
+    $object = "test/test-signature-test-upload-and-download.txt";
+    $timeout = 3600;
+    $options = array('Content-Type' => 'txt');
+    try {
+        $signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "PUT", $options);
+    } catch (OssException $e) {
+        printf(__FUNCTION__ . ": FAILED\n");
+        printf($e->getMessage() . "\n");
+        return;
+    }
+    print(__FUNCTION__ . ": signedUrl: " . $signedUrl . "\n");
+
+    $request = new RequestCore($signedUrl);
+    $request->set_method('PUT');
+    $request->add_header('Content-Type', 'txt');
+    $request->set_read_file($file);
+    $request->set_read_stream_size(sprintf('%u',filesize($file)));
+    $request->send_request();
+    $res = new ResponseCore($request->get_response_header(),
+        $request->get_response_body(), $request->get_response_code());
+    if ($res->isOK()) {
+        print(__FUNCTION__ . ": OK" . "\n");
+    } else {
+        print(__FUNCTION__ . ": FAILED" . "\n");
+    };
+}

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä