master
elf 2 years ago
parent 5aab375f7c
commit 4e2ac20b3c

@ -8,13 +8,10 @@
// +----------------------------------------------------------------------
namespace Admin\Model;
use Admin\Controller\CosController;
use Admin\Controller\OssController;
use Admin\Controller\BosController;
use Admin\Event\QiNiuEvent;
use Think\Model;
use Think\Upload;
use Base\Service\OssService;
use Base\Tool\Storage;
/**
* 图片模型
@ -70,15 +67,14 @@ class PictureModel extends Model{
$this->where(['id'=>$value['id']])->save($data);
}
}
if (C('OSS_STATUS')) {
if (C('STORAGE_TYPE')) {
$path = explode('/', $value['path']);
$saveFileName = 'icon/' . $path[4];
$localFilePath = '.' . $value['path'];
$ossService = new OssService();
$result = $ossService->upload($localFilePath, $saveFileName);
$result = Storage::upload($localFilePath, $saveFileName);
if ($result['status']) {
$dataUrl['oss_url'] = $ossService->getUrl($saveFileName);
$coo = $this->where(['id' => $value['id']])->save($dataUrl);
$dataUrl['oss_url'] = $result['data']['url'];
$this->where(['id' => $value['id']])->save($dataUrl);
} else {
$this->error = $result['message'];
return false;

@ -1,10 +1,9 @@
<?php
namespace Base\Service;
use Base\Model\PromoteModel;
use Base\Model\ApplyModel;
use Base\Tool\Base62;
use Base\Tool\PlistDemo;
use Base\Tool\Storage;
use GuzzleHttp\Client;
class GameSourceService {
@ -383,8 +382,7 @@ class GameSourceService {
public function uploadPackageOnce($localFilePath, $distFilePath, $isDeleteLocal = false)
{
$ossService = new OssService();
$result = $ossService->upload($localFilePath, $distFilePath);
$result = Storage::upload($localFilePath, $distFilePath);
if ($isDeleteLocal && file_exists($localFilePath)) {
@unlink($localFilePath);
}

@ -1,12 +1,13 @@
<?php
namespace Base\Service;
namespace Base\Tool;
use Obs\ObsClient;
use Base\Tool\StorageClient;
use Obs\ObsClient as BaseObsClient;
/**
* 目前仅支持阿里云OSS
* 华为云OBS
*/
class OssService
class ObsClient implements StorageClient
{
const MAX_PART_SIZE = 5368709120;
const MID_PART_SIZE = 10485760;
@ -25,9 +26,8 @@ class OssService
$this->secretKey = C('OBS_SECRET_KEY');
$this->endpoint = C('OBS_ENDPOINT');
$this->domain = C('OBS_DOMAIN');
$this->isCName = C('OBS_IS_CNAME');
$this->bucket = C('OBS_BUCKET');
$this->client = new ObsClient($this->accessKey, $this->secretKey, $this->endpoint);
$this->client = new BaseObsClient($this->accessKey, $this->secretKey, $this->endpoint);
}
public function upload($localFilePath, $saveFileName)
@ -46,7 +46,7 @@ class OssService
'url' => $this->getUrl($saveFileName)
]
];
} catch (Obs\Common\ObsException $e) {
} catch (\Obs\ObsException $e) {
return [
'status' => false,
'message' => $e->getExceptionMessage()
@ -89,7 +89,7 @@ class OssService
]);
}
public function deleteObject($deleteFile)
public function delete($deleteFile)
{
$resp = $this->client->deleteObject([
'Bucket' => $this->bucket,

@ -1,14 +1,14 @@
<?php
namespace Base\Service;
namespace Base\Tool;
use OSS\Core\OssUtil;
use OSS\OssClient;
use OSS\OssClient as BaseOssClient;
use OSS\Core\OSsException;
/**
* 目前仅支持阿里云OSS
* 阿里云OSS
*/
class OssService {
class OssClient implements StorageClient {
private $accessKeyId = '';
private $accessKeySecret = '';
@ -28,7 +28,7 @@ class OssService {
$this->domain = C('OSS_DOMAIN');
$this->isCName = C('OSS_IS_CNAME');
$this->bucket = C('OSS_BUCKET');
$this->client = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint, $this->isCName);
$this->client = new BaseOssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint, $this->isCName);
}
public function upload($localFilePath, $saveFileName)
@ -65,18 +65,18 @@ class OssService {
$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;
$fromPos = $uploadPosition + (integer) $piece[BaseOssClient::OSS_SEEK_TO];
$toPos = (integer) $piece[BaseOssClient::OSS_LENGTH] + $fromPos - 1;
$upOptions = [
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,
BaseOssClient::OSS_FILE_UPLOAD => $uploadFile,
BaseOssClient::OSS_PART_NUM => ($i + 1),
BaseOssClient::OSS_SEEK_TO => $fromPos,
BaseOssClient::OSS_LENGTH => $toPos - $fromPos + 1,
BaseOssClient::OSS_CHECK_MD5 => $isCheckMd5,
];
if ($isCheckMd5) {
$contentMd5 = OssUtil::getMd5SumForFile($uploadFile, $fromPos, $toPos);
$upOptions[OssClient::OSS_CONTENT_MD5] = $contentMd5;
$upOptions[BaseOssClient::OSS_CONTENT_MD5] = $contentMd5;
}
// 2. 将每一分片上传到OSS
$responseUploadPart[] = $this->client->uploadPart($this->bucket, $saveFileName, $uploadId, $upOptions);
@ -98,7 +98,7 @@ class OssService {
/**
*删除文件
*/
public function deleteObject($deleteFile)
public function delete($deleteFile)
{
$this->client->deleteObject($this->bucket, $deleteFile);
}

@ -0,0 +1,40 @@
<?php
namespace Base\Tool;
use Exception;
class Storage {
/**
* @var StorageClient
*/
private static $client;
private static function getClient(): StorageClient {
if (empty(self::$client)) {
if (C('STORAGE_TYPE') == 'oss') {
self::$client = new OssClient();
} elseif (C('STORAGE_TYPE') == 'obs') {
self::$client = new ObsClient();
} else {
throw new Exception("Storage type undefined!");
}
}
return self::$client;
}
public static function upload($localFilePath, $saveFileName) {
return self::getClient()->upload($localFilePath, $saveFileName);
}
public static function delete($deleteFile)
{
return self::getClient()->delete($deleteFile);
}
public static function getUrl($saveFileName)
{
return self::getClient()->getUrl($saveFileName);
}
}

@ -0,0 +1,12 @@
<?php
namespace Base\Tool;
interface StorageClient {
public function upload($localFilePath, $saveFileName);
public function delete($deleteFile);
public function getUrl($saveFileName);
}

@ -10,7 +10,7 @@
namespace Home\Model;
use Think\Model;
use Think\Upload;
use Base\Service\OssService;
use Base\Tool\Storage;
/**
* 图片模型
@ -56,15 +56,14 @@ class PictureModel extends Model{
unset($info[$key]);
}
}
if (C('OSS_STATUS')) {
if (C('STORAGE_TYPE')) {
$path = explode('/', $value['path']);
$saveFileName = 'icon/' . $path[4];
$localFilePath = '.' . $value['path'];
$ossService = new OssService();
$ossService->upload($localFilePath, $saveFileName);
$result = Storage::upload($localFilePath, $saveFileName);
if ($result['status']) {
$dataUrl['oss_url'] = $ossService->getUrl($saveFileName);
$coo = $this->where(['id' => $value['id']])->save($dataUrl);
$dataUrl['oss_url'] = $result['data']['url'];
$this->where(['id' => $value['id']])->save($dataUrl);
} else {
$this->error = $result['message'];
return false;

@ -10,7 +10,7 @@
namespace Qrcode\Model;
use Think\Model;
use Think\Upload;
use Base\Service\OssService;
use Base\Tool\Storage;
/**
* 图片模型
@ -56,15 +56,14 @@ class PictureModel extends Model{
unset($info[$key]);
}
}
if (C('OSS_STATUS')) {
if (C('STORAGE_TYPE')) {
$path = explode('/', $value['path']);
$saveFileName = 'icon/' . $path[4];
$localFilePath = '.' . $value['path'];
$ossService = new OssService();
$ossService->upload($localFilePath, $saveFileName);
$result = Storage::upload($localFilePath, $saveFileName);
if ($result['status']) {
$dataUrl['oss_url'] = $ossService->getUrl($saveFileName);
$coo = $this->where(['id' => $value['id']])->save($dataUrl);
$dataUrl['oss_url'] = $result['data']['url'];
$this->where(['id' => $value['id']])->save($dataUrl);
} else {
$this->error = $result['message'];
return false;

@ -1,181 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
// +----------------------------------------------------------------------
namespace Admin\Controller;
use OSS\OssClient;
use Think\ShardUpload;
use Base\Service\OssService;
/**
* 文件控制器
* 主要用于下载模型的文件上传和下载
*/
class FileController extends AdminController {
/* 文件上传 */
public function upload(){
$return = array('status' => 1, 'info' => '上传成功', 'data' => '');
/* 调用文件上传组件上传文件 */
$File = D('File');
$file_driver = C('DOWNLOAD_UPLOAD_DRIVER');
$info = $File->upload(
$_FILES,
C('DOWNLOAD_UPLOAD'),
C('DOWNLOAD_UPLOAD_DRIVER'),
C("UPLOAD_{$file_driver}_CONFIG")
);
/* 记录附件信息 */
if($info){
$return['data'] = think_encrypt(json_encode($info['download']));
$return['info'] = $info['download']['name'];
} else {
$return['status'] = 0;
$return['info'] = $File->getError();
}
/* 返回JSON数据 */
$this->ajaxReturn($return);
}
/* 文件分片上传 */
public function shard_upload(){
//关闭缓存
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
$uploader = new ShardUpload();
if(I('get.typee') == 1){//指定上传目录
$uploader->set('path','./Uploads/Ios/description');
}elseif(I('get.type') == "1"){
$uploader->set('path','./Uploads/Material');
}
//var_dump($_POST);
//用于断点续传,验证指定分块是否已经存在,避免重复上传
if(isset($_POST['status'])){
if($_POST['status'] == 'chunkCheck'){
$target = C('DOWNLOAD_UPLOAD.rootPath')."/".$_POST['name'].'/'.$_POST['chunkIndex'];
if(file_exists($target) && filesize($target) == $_POST['size']){
die('{"ifExist":1}');
}
die('{"ifExist":0}');
}elseif($_POST['status'] == 'md5Check'){
}elseif($_POST['status'] == 'chunksMerge'){
if($result = $uploader->chunksMerge($_POST['name'], $_POST['chunks'], $_POST['ext'])){
//todo 把md5签名存入持久层供未来的秒传验证
echo $result;
exit();
}
}
}
if(($path = $uploader->upload('file', $_POST)) !== false){
if(I('get.type') == "1"){
$file_info = json_decode($path, true);
$url = $this->uploadOss("Material/",$file_info['name'],$file_info['path'].'/'.$file_info['name']);
$file_info['path'] = "http://".C('CND_ADDRESS')."/Material";
$path = json_encode($file_info);
}
die($path);
}
}
/* 苹果渠道包文件分片上传 */
public function ios_shard_upload(){
//关闭缓存
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
$uploader = new ShardUpload();
//用于断点续传,验证指定分块是否已经存在,避免重复上传
if(isset($_POST['status'])){
if($_POST['status'] == 'chunkCheck'){
$target = C('DOWNLOAD_UPLOAD.rootPath')."/".$_POST['name'].'/'.$_POST['chunkIndex'];
if(file_exists($target) && filesize($target) == $_POST['size']){
die('{"ifExist":1}');
}
die('{"ifExist":0}');
}elseif($_POST['status'] == 'md5Check'){
}elseif($_POST['status'] == 'chunksMerge'){
if($result = $uploader->chunksMerge($_POST['name'], $_POST['chunks'], $_POST['ext'])){
//todo 把md5签名存入持久层供未来的秒传验证
echo $result;
exit();
}
}
}
if(($path = $uploader->iosUpload('file', $_POST)) !== false){
die($path);
}
}
/* 下载文件 */
public function download($id = null){
if(empty($id) || !is_numeric($id)){
$this->error('参数错误!');
}
$logic = D('Download', 'Logic');
if(!$logic->download($id)){
$this->error($logic->getError());
}
}
/**
* 上传图片
* @author huajie <banhuajie@163.com>
*/
public function uploadPicture(){
//TODO: 用户登录检测
/* 返回标准数据 */
$return = array('status' => 1, 'info' => '上传成功', 'data' => '');
/* 调用文件上传组件上传文件 */
$Picture = D('Picture');
$pic_driver = C('PICTURE_UPLOAD_DRIVER');
$info = $Picture->upload(
$_FILES,
C('PICTURE_UPLOAD'),
C('PICTURE_UPLOAD_DRIVER'),
C("UPLOAD_{$pic_driver}_CONFIG")
); //TODO:上传到远程服务器
/* 记录图片信息 */
if($info){
$return['status'] = 1;
$return = array_merge($info['download'], $return);
} else {
$return['status'] = 0;
$return['info'] = $Picture->getError();
}
ob_clean();
/* 返回JSON数据 */
$this->ajaxReturn($return);
}
/**
*上传到OSS
*/
public function uploadOss($ossPath, $fileName,$filePath)
{
$ossFilePath = $ossPath . $fileName;
$ossService = new OssService();
$ossService->upload($filePath, $ossFilePath);
return $ossService->getUrl($ossFilePath);
}
}

@ -1,181 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
// +----------------------------------------------------------------------
namespace Admin\Controller;
use OSS\OssClient;
use Think\ShardUpload;
use Base\Service\OssService;
/**
* 文件控制器
* 主要用于下载模型的文件上传和下载
*/
class FileController extends AdminController {
/* 文件上传 */
public function upload(){
$return = array('status' => 1, 'info' => '上传成功', 'data' => '');
/* 调用文件上传组件上传文件 */
$File = D('File');
$file_driver = C('DOWNLOAD_UPLOAD_DRIVER');
$info = $File->upload(
$_FILES,
C('DOWNLOAD_UPLOAD'),
C('DOWNLOAD_UPLOAD_DRIVER'),
C("UPLOAD_{$file_driver}_CONFIG")
);
/* 记录附件信息 */
if($info){
$return['data'] = think_encrypt(json_encode($info['download']));
$return['info'] = $info['download']['name'];
} else {
$return['status'] = 0;
$return['info'] = $File->getError();
}
/* 返回JSON数据 */
$this->ajaxReturn($return);
}
/* 文件分片上传 */
public function shard_upload(){
//关闭缓存
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
$uploader = new ShardUpload();
if(I('get.typee') == 1){//指定上传目录
$uploader->set('path','./Uploads/Ios/description');
}elseif(I('get.type') == "1"){
$uploader->set('path','./Uploads/Material');
}
//var_dump($_POST);
//用于断点续传,验证指定分块是否已经存在,避免重复上传
if(isset($_POST['status'])){
if($_POST['status'] == 'chunkCheck'){
$target = C('DOWNLOAD_UPLOAD.rootPath')."/".$_POST['name'].'/'.$_POST['chunkIndex'];
if(file_exists($target) && filesize($target) == $_POST['size']){
die('{"ifExist":1}');
}
die('{"ifExist":0}');
}elseif($_POST['status'] == 'md5Check'){
}elseif($_POST['status'] == 'chunksMerge'){
if($result = $uploader->chunksMerge($_POST['name'], $_POST['chunks'], $_POST['ext'])){
//todo 把md5签名存入持久层供未来的秒传验证
echo $result;
exit();
}
}
}
if(($path = $uploader->upload('file', $_POST)) !== false){
if(I('get.type') == "1"){
$file_info = json_decode($path, true);
$url = $this->uploadOss("Material/",$file_info['name'],$file_info['path'].'/'.$file_info['name']);
$file_info['path'] = "http://".C('CND_ADDRESS')."/Material";
$path = json_encode($file_info);
}
die($path);
}
}
/* 苹果渠道包文件分片上传 */
public function ios_shard_upload(){
//关闭缓存
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
$uploader = new ShardUpload();
//用于断点续传,验证指定分块是否已经存在,避免重复上传
if(isset($_POST['status'])){
if($_POST['status'] == 'chunkCheck'){
$target = C('DOWNLOAD_UPLOAD.rootPath')."/".$_POST['name'].'/'.$_POST['chunkIndex'];
if(file_exists($target) && filesize($target) == $_POST['size']){
die('{"ifExist":1}');
}
die('{"ifExist":0}');
}elseif($_POST['status'] == 'md5Check'){
}elseif($_POST['status'] == 'chunksMerge'){
if($result = $uploader->chunksMerge($_POST['name'], $_POST['chunks'], $_POST['ext'])){
//todo 把md5签名存入持久层供未来的秒传验证
echo $result;
exit();
}
}
}
if(($path = $uploader->iosUpload('file', $_POST)) !== false){
die($path);
}
}
/* 下载文件 */
public function download($id = null){
if(empty($id) || !is_numeric($id)){
$this->error('参数错误!');
}
$logic = D('Download', 'Logic');
if(!$logic->download($id)){
$this->error($logic->getError());
}
}
/**
* 上传图片
* @author huajie <banhuajie@163.com>
*/
public function uploadPicture(){
//TODO: 用户登录检测
/* 返回标准数据 */
$return = array('status' => 1, 'info' => '上传成功', 'data' => '');
/* 调用文件上传组件上传文件 */
$Picture = D('Picture');
$pic_driver = C('PICTURE_UPLOAD_DRIVER');
$info = $Picture->upload(
$_FILES,
C('PICTURE_UPLOAD'),
C('PICTURE_UPLOAD_DRIVER'),
C("UPLOAD_{$pic_driver}_CONFIG")
); //TODO:上传到远程服务器
/* 记录图片信息 */
if($info){
$return['status'] = 1;
$return = array_merge($info['download'], $return);
} else {
$return['status'] = 0;
$return['info'] = $Picture->getError();
}
ob_clean();
/* 返回JSON数据 */
$this->ajaxReturn($return);
}
/**
*上传到OSS
*/
public function uploadOss($ossPath, $fileName,$filePath)
{
$ossFilePath = $ossPath . $fileName;
$ossService = new OssService();
$ossService->upload($filePath, $ossFilePath);
return $ossService->getUrl($ossFilePath);
}
}

@ -1,12 +1,7 @@
{
"require": {
"rodneyrehm/plist": "^2.0",
"guzzlehttp/guzzle": "~6.0"
},
"repositories": {
"packagist": {
"type": "composer",
"url": "https://packagist.phpcomposer.com"
}
"guzzlehttp/guzzle": "~6.0",
"obs/esdk-obs-php": "3.22.6"
}
}

778
composer.lock generated

@ -4,27 +4,34 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "d123a4209d62a7caa5b2f90e005695d5",
"content-hash": "fb38b16a9eade4efc8e63b8702e94925",
"packages": [
{
"name": "guzzlehttp/guzzle",
"version": "6.5.2",
"version": "6.5.8",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
"reference": "43ece0e75098b7ecd8d13918293029e555a50f82"
"reference": "a52f0440530b54fa079ce76e8c5d196a42cad981"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/43ece0e75098b7ecd8d13918293029e555a50f82",
"reference": "43ece0e75098b7ecd8d13918293029e555a50f82",
"shasum": ""
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/a52f0440530b54fa079ce76e8c5d196a42cad981",
"reference": "a52f0440530b54fa079ce76e8c5d196a42cad981",
"shasum": "",
"mirrors": [
{
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
"preferred": true
}
]
},
"require": {
"ext-json": "*",
"guzzlehttp/promises": "^1.0",
"guzzlehttp/psr7": "^1.6.1",
"php": ">=5.5"
"guzzlehttp/psr7": "^1.9",
"php": ">=5.5",
"symfony/polyfill-intl-idn": "^1.17"
},
"require-dev": {
"ext-curl": "*",
@ -32,7 +39,6 @@
"psr/log": "^1.1"
},
"suggest": {
"ext-intl": "Required for Internationalized Domain Name (IDN) support",
"psr/log": "Required for using the Log middleware"
},
"type": "library",
@ -42,22 +48,52 @@
}
},
"autoload": {
"psr-4": {
"GuzzleHttp\\": "src/"
},
"files": [
"src/functions_include.php"
]
],
"psr-4": {
"GuzzleHttp\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"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",
@ -71,72 +107,135 @@
"rest",
"web service"
],
"time": "2019-12-23T11:57:10+00:00"
"support": {
"issues": "https://github.com/guzzle/guzzle/issues",
"source": "https://github.com/guzzle/guzzle/tree/6.5.8"
},
"funding": [
{
"url": "https://github.com/GrahamCampbell",
"type": "github"
},
{
"url": "https://github.com/Nyholm",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
"type": "tidelift"
}
],
"time": "2022-06-20T22:16:07+00:00"
},
{
"name": "guzzlehttp/promises",
"version": "v1.3.1",
"version": "1.5.2",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
"reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
"reference": "b94b2807d85443f9719887892882d0329d1e2598"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
"reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
"shasum": ""
"url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598",
"reference": "b94b2807d85443f9719887892882d0329d1e2598",
"shasum": "",
"mirrors": [
{
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
"preferred": true
}
]
},
"require": {
"php": ">=5.5.0"
"php": ">=5.5"
},
"require-dev": {
"phpunit/phpunit": "^4.0"
"symfony/phpunit-bridge": "^4.4 || ^5.1"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.4-dev"
"dev-master": "1.5-dev"
}
},
"autoload": {
"psr-4": {
"GuzzleHttp\\Promise\\": "src/"
},
"files": [
"src/functions_include.php"
]
],
"psr-4": {
"GuzzleHttp\\Promise\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"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"
],
"time": "2016-12-20T10:07:11+00:00"
"support": {
"issues": "https://github.com/guzzle/promises/issues",
"source": "https://github.com/guzzle/promises/tree/1.5.2"
},
"funding": [
{
"url": "https://github.com/GrahamCampbell",
"type": "github"
},
{
"url": "https://github.com/Nyholm",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
"type": "tidelift"
}
],
"time": "2022-08-28T14:55:35+00:00"
},
{
"name": "guzzlehttp/psr7",
"version": "1.6.1",
"version": "1.9.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
"reference": "239400de7a173fe9901b9ac7c06497751f00727a"
"reference": "e98e3e6d4f86621a9b75f623996e6bbdeb4b9318"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a",
"reference": "239400de7a173fe9901b9ac7c06497751f00727a",
"shasum": ""
"url": "https://api.github.com/repos/guzzle/psr7/zipball/e98e3e6d4f86621a9b75f623996e6bbdeb4b9318",
"reference": "e98e3e6d4f86621a9b75f623996e6bbdeb4b9318",
"shasum": "",
"mirrors": [
{
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
"preferred": true
}
]
},
"require": {
"php": ">=5.4.0",
@ -148,37 +247,58 @@
},
"require-dev": {
"ext-zlib": "*",
"phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8"
"phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10"
},
"suggest": {
"zendframework/zend-httphandlerrunner": "Emit PSR-7 responses"
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.6-dev"
"dev-master": "1.9-dev"
}
},
"autoload": {
"psr-4": {
"GuzzleHttp\\Psr7\\": "src/"
},
"files": [
"src/functions_include.php"
]
],
"psr-4": {
"GuzzleHttp\\Psr7\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"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"
}
],
@ -193,7 +313,179 @@
"uri",
"url"
],
"time": "2019-07-01T23:21:34+00:00"
"support": {
"issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/1.9.0"
},
"funding": [
{
"url": "https://github.com/GrahamCampbell",
"type": "github"
},
{
"url": "https://github.com/Nyholm",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
"type": "tidelift"
}
],
"time": "2022-06-20T21:43:03+00:00"
},
{
"name": "monolog/monolog",
"version": "2.8.0",
"source": {
"type": "git",
"url": "https://github.com/Seldaek/monolog.git",
"reference": "720488632c590286b88b80e62aa3d3d551ad4a50"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Seldaek/monolog/zipball/720488632c590286b88b80e62aa3d3d551ad4a50",
"reference": "720488632c590286b88b80e62aa3d3d551ad4a50",
"shasum": "",
"mirrors": [
{
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
"preferred": true
}
]
},
"require": {
"php": ">=7.2",
"psr/log": "^1.0.1 || ^2.0 || ^3.0"
},
"provide": {
"psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0"
},
"require-dev": {
"aws/aws-sdk-php": "^2.4.9 || ^3.0",
"doctrine/couchdb": "~1.0@dev",
"elasticsearch/elasticsearch": "^7 || ^8",
"ext-json": "*",
"graylog2/gelf-php": "^1.4.2",
"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": "^0.12.91",
"phpunit/phpunit": "^8.5.14",
"predis/predis": "^1.1 || ^2.0",
"rollbar/rollbar": "^1.3 || ^2 || ^3",
"ruflin/elastica": "^7",
"swiftmailer/swiftmailer": "^5.3|^6.0",
"symfony/mailer": "^5.4 || ^6",
"symfony/mime": "^5.4 || ^6"
},
"suggest": {
"aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
"doctrine/couchdb": "Allow sending log messages to a CouchDB server",
"elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
"ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
"ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",
"ext-mbstring": "Allow to work properly with unicode symbols",
"ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
"ext-openssl": "Required to send log messages using SSL",
"ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",
"graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
"mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
"php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
"rollbar/rollbar": "Allow sending log messages to Rollbar",
"ruflin/elastica": "Allow sending log messages to an Elastic Search server"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "2.x-dev"
}
},
"autoload": {
"psr-4": {
"Monolog\\": "src/Monolog"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "https://seld.be"
}
],
"description": "Sends your logs to files, sockets, inboxes, databases and various web services",
"homepage": "https://github.com/Seldaek/monolog",
"keywords": [
"log",
"logging",
"psr-3"
],
"support": {
"issues": "https://github.com/Seldaek/monolog/issues",
"source": "https://github.com/Seldaek/monolog/tree/2.8.0"
},
"funding": [
{
"url": "https://github.com/Seldaek",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
"type": "tidelift"
}
],
"time": "2022-07-24T11:55:47+00:00"
},
{
"name": "obs/esdk-obs-php",
"version": "3.22.6",
"source": {
"type": "git",
"url": "https://github.com/huaweicloud/huaweicloud-sdk-php-obs.git",
"reference": "a56a37aa72e35aea1791588889cfe3c57e73cf5e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/huaweicloud/huaweicloud-sdk-php-obs/zipball/a56a37aa72e35aea1791588889cfe3c57e73cf5e",
"reference": "a56a37aa72e35aea1791588889cfe3c57e73cf5e",
"shasum": "",
"mirrors": [
{
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
"preferred": true
}
]
},
"require": {
"guzzlehttp/guzzle": "^6.3.0 || ^7.0",
"guzzlehttp/psr7": "^1.4.2 || ^2.0",
"monolog/monolog": "^1.23.0 || ^2.0",
"php": ">=5.6.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Obs\\": "Obs/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"description": "OBS PHP SDK",
"keywords": [
"OBS",
"php"
],
"support": {
"source": "https://github.com/huaweicloud/huaweicloud-sdk-php-obs/tree/v3.22.6"
},
"time": "2022-06-18T08:58:21+00:00"
},
{
"name": "psr/http-message",
@ -207,7 +499,13 @@
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
"shasum": ""
"shasum": "",
"mirrors": [
{
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
"preferred": true
}
]
},
"require": {
"php": ">=5.3.0"
@ -243,8 +541,67 @@
"request",
"response"
],
"support": {
"source": "https://github.com/php-fig/http-message/tree/master"
},
"time": "2016-08-06T14:39:51+00:00"
},
{
"name": "psr/log",
"version": "1.1.4",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
"reference": "d49695b909c3b7628b6289db5479a1c204601f11"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
"reference": "d49695b909c3b7628b6289db5479a1c204601f11",
"shasum": "",
"mirrors": [
{
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
"preferred": true
}
]
},
"require": {
"php": ">=5.3.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.1.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\Log\\": "Psr/Log/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "https://www.php-fig.org/"
}
],
"description": "Common interface for logging libraries",
"homepage": "https://github.com/php-fig/log",
"keywords": [
"log",
"psr",
"psr-3"
],
"support": {
"source": "https://github.com/php-fig/log/tree/1.1.4"
},
"time": "2021-05-03T11:20:27+00:00"
},
{
"name": "ralouphie/getallheaders",
"version": "3.0.3",
@ -257,7 +614,13 @@
"type": "zip",
"url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
"reference": "120b605dfeb996808c31b6477290a714d356e822",
"shasum": ""
"shasum": "",
"mirrors": [
{
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
"preferred": true
}
]
},
"require": {
"php": ">=5.6"
@ -283,29 +646,45 @@
}
],
"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": "rodneyrehm/plist",
"version": "v2.0.1",
"version": "v2.0.3",
"source": {
"type": "git",
"url": "https://github.com/rodneyrehm/CFPropertyList.git",
"reference": "2ea0483806c989eb0518a767fa29a111bb29cb67"
"url": "https://github.com/TECLIB/CFPropertyList.git",
"reference": "eb1f97cc44427359be9f09e617d68eef57707617"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/rodneyrehm/CFPropertyList/zipball/2ea0483806c989eb0518a767fa29a111bb29cb67",
"reference": "2ea0483806c989eb0518a767fa29a111bb29cb67",
"shasum": ""
"url": "https://api.github.com/repos/TECLIB/CFPropertyList/zipball/eb1f97cc44427359be9f09e617d68eef57707617",
"reference": "eb1f97cc44427359be9f09e617d68eef57707617",
"shasum": "",
"mirrors": [
{
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
"preferred": true
}
]
},
"require": {
"php": ">=5.3"
"ext-dom": "*",
"ext-libxml": "*",
"php": "^7.4 || ^8.0"
},
"require-dev": {
"phpunit/phpunit": "^9.0",
"squizlabs/php_codesniffer": "^3.2"
},
"type": "library",
"autoload": {
"psr-0": {
"CFPropertyList": "classes/"
"psr-4": {
"CFPropertyList\\": "src/CFPropertyList/"
}
},
"notification-url": "https://packagist.org/downloads/",
@ -315,19 +694,303 @@
"authors": [
{
"name": "Christian Kruse",
"email": "cjk@wwwtech.de"
"email": "cjk@wwwtech.de",
"role": "developer"
},
{
"name": "Rodney Rehm",
"email": "mail+github@rodneyrehm.de"
"email": "mail+github@rodneyrehm.de",
"role": "developer"
},
{
"name": "Thierry Bugier",
"email": "tbugier@teclib.com",
"role": "developer"
}
],
"description": "Library for reading and writing Apple's CFPropertyList (plist) files in XML as well as binary format.",
"homepage": "https://github.com/rodneyrehm/CFPropertyList",
"homepage": "https://github.com/TECLIB/CFPropertyList",
"keywords": [
"CFPropertyList",
"Core Foundation",
"apple",
"binary",
"plist",
"xml"
],
"support": {
"docs": "http://teclib.github.io/CFPropertyList/howtos/",
"email": "contact@teclib.com",
"issues": "https://github.com/TECLIB/CFPropertyList/issues",
"rss": "https://teclib.github.io/CFPropertyList/feed.xml",
"source": "https://github.com/TECLIB/CFPropertyList"
},
"time": "2021-12-01T18:24:28+00:00"
},
{
"name": "symfony/polyfill-intl-idn",
"version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git",
"reference": "639084e360537a19f9ee352433b84ce831f3d2da"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da",
"reference": "639084e360537a19f9ee352433b84ce831f3d2da",
"shasum": "",
"mirrors": [
{
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
"preferred": true
}
]
},
"require": {
"php": ">=7.1",
"symfony/polyfill-intl-normalizer": "^1.10",
"symfony/polyfill-php72": "^1.10"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Intl\\Idn\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Laurent Bassin",
"email": "laurent@bassin.info"
},
{
"name": "Trevor Rowbotham",
"email": "trevor.rowbotham@pm.me"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"idn",
"intl",
"polyfill",
"portable",
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
"version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
"reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6",
"reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6",
"shasum": "",
"mirrors": [
{
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
"preferred": true
}
]
},
"require": {
"php": ">=7.1"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Intl\\Normalizer\\": ""
},
"classmap": [
"Resources/stubs"
]
},
"notification-url": "https://packagist.org/downloads/",
"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.27.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/polyfill-php72",
"version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php72.git",
"reference": "869329b1e9894268a8a61dabb69153029b7a8c97"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97",
"reference": "869329b1e9894268a8a61dabb69153029b7a8c97",
"shasum": "",
"mirrors": [
{
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
"preferred": true
}
]
},
"require": {
"php": ">=7.1"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Php72\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"plist"
"compatibility",
"polyfill",
"portable",
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2015-01-28T23:18:19+00:00"
"time": "2022-11-03T14:55:06+00:00"
}
],
"packages-dev": [],
@ -337,5 +1000,6 @@
"prefer-stable": false,
"prefer-lowest": false,
"platform": [],
"platform-dev": []
"platform-dev": [],
"plugin-api-version": "2.3.0"
}

Loading…
Cancel
Save