兔姬桑 4 rokov pred
rodič
commit
39394ba604

+ 1 - 1
app/Components/Namesilo.php

@@ -36,7 +36,7 @@ class Namesilo {
 			$result = XML2Array::createArray($result);
 
 			// 出错
-			if(empty($result['namesilo']) || $result['namesilo']['reply']['code'] != 300 || $result['namesilo']['reply']['detail'] != 'success'){
+			if(empty($result['namesilo']) || $result['namesilo']['reply']['code'] != 300 || $result['namesilo']['reply']['detail'] !== 'success'){
 				Helpers::addNotificationLog('[Namesilo API] - ['.$operation.']', $content, 1,
 					self::$systemConfig['webmaster_email'], 0, $result['namesilo']['reply']['detail']);
 			}else{

+ 2 - 2
app/Components/NetworkDetection.php

@@ -28,7 +28,7 @@ class NetworkDetection {
 			}
 
 			if(!$ret['success']){
-				if($ret['error'] == "execute timeout (3s)"){
+				if($ret['error'] === "execute timeout (3s)"){
 					sleep(10);
 
 					return self::networkCheck($ip, $type, $port);
@@ -76,7 +76,7 @@ class NetworkDetection {
 				return false;
 			}
 
-			if($ret['code'] != 1 || $ret['msg'] != "检测成功!"){
+			if($ret['code'] != 1 || $ret['msg'] !== "检测成功!"){
 				Log::warning("【PING】检测".$ip."时,返回".json_encode($ret));
 
 				return false;

+ 2 - 2
app/Console/Commands/NodeBlockedDetection.php

@@ -63,7 +63,7 @@ class NodeBlockedDetection extends Command {
 			}
 			if($node->detection_type != 1){
 				$icmpCheck = NetworkDetection::networkCheck($node->ip, true);
-				if($icmpCheck != false && $icmpCheck != "通讯正常"){
+				if($icmpCheck != false && $icmpCheck !== "通讯正常"){
 					$message .= "| ".$node->name." | ICMP | ".$icmpCheck." |\r\n";
 					$sendText = true;
 					$info = true;
@@ -71,7 +71,7 @@ class NodeBlockedDetection extends Command {
 			}
 			if($node->detection_type != 2){
 				$tcpCheck = NetworkDetection::networkCheck($node->ip, false, $node->single? $node->port : null);
-				if($tcpCheck != false && $tcpCheck != "通讯正常"){
+				if($tcpCheck != false && $tcpCheck !== "通讯正常"){
 					$message .= "| ".$node->name." | TCP | ".$tcpCheck." |\r\n";
 					$sendText = true;
 					$info = true;

+ 4 - 10
app/Http/Controllers/Admin/CouponController.php

@@ -89,21 +89,15 @@ class CouponController extends Controller {
 			$type = $request->input('type');
 
 			// 优惠卷LOGO
+			$logo = null;
 			if($request->hasFile('logo')){
-				$file = $request->file('logo');
-				$fileType = $file->getClientOriginalExtension();
+				$logo = $this->uploadFile($request->file('logo'));
 
-				// 验证文件合法性
-				if(!in_array($fileType, ['jpg', 'png', 'jpeg', 'bmp'])){
+				if(!$logo){
 					return Redirect::back()->withInput()->withErrors('LOGO不合法');
 				}
-
-				$logoName = date('YmdHis').random_int(1000, 2000).'.'.$fileType;
-				$move = $file->move(base_path().'/public/upload/image/', $logoName);
-				$logo = $move? '/upload/image/'.$logoName : '';
-			}else{
-				$logo = '';
 			}
+
 			try{
 				DB::beginTransaction();
 				$num = $request->input('num');

+ 2 - 1
app/Http/Controllers/Admin/MarketingController.php

@@ -12,6 +12,7 @@ use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Request;
 use Log;
 use Response;
+use RuntimeException;
 
 /**
  * 促销控制器
@@ -81,7 +82,7 @@ class MarketingController extends Controller {
 			if($result->code){ // 失败
 				$this->addMarketing(2, $title, $content, -1, $result->message);
 
-				throw new Exception($result->message);
+				throw new RuntimeException($result->message);
 			}
 
 			$this->addMarketing(2, $title, $content, 1);

+ 5 - 17
app/Http/Controllers/Admin/ShopController.php

@@ -58,20 +58,14 @@ class ShopController extends Controller {
 				'traffic.max' => '内含流量不能超过10TB',
 			]);
 
-			$logo = null;
 			// 商品LOGO
+			$logo = null;
 			if($request->hasFile('logo')){
-				$file = $request->file('logo');
-				$fileType = $file->getClientOriginalExtension();
+				$logo = $this->uploadFile($request->file('logo'));
 
-				// 验证文件合法性
-				if(!in_array($fileType, ['jpg', 'png', 'jpeg', 'bmp'])){
+				if(!$logo){
 					return Redirect::back()->withInput()->withErrors('LOGO不合法');
 				}
-
-				$logoName = date('YmdHis').random_int(1000, 2000).'.'.$fileType;
-				$move = $file->move(base_path().'/public/upload/image/', $logoName);
-				$logo = $move? '/upload/image/'.$logoName : '';
 			}
 
 			try{
@@ -138,19 +132,13 @@ class ShopController extends Controller {
 
 			// 商品LOGO
 			if($request->hasFile('logo')){
-				$file = $request->file('logo');
-				$fileType = $file->getClientOriginalExtension();
+				$logo = $this->uploadFile($request->file('logo'));
 
-				// 验证文件合法性
-				if(!in_array($fileType, ['jpg', 'png', 'jpeg', 'bmp'])){
+				if(!$logo){
 					Session::flash('errorMsg', 'LOGO不合法');
 
 					return Redirect::back()->withInput();
 				}
-
-				$logoName = date('YmdHis').random_int(1000, 2000).'.'.$fileType;
-				$move = $file->move(base_path().'/public/upload/image/', $logoName);
-				$logo = $move? '/upload/image/'.$logoName : '';
 				Goods::query()->whereId($id)->update(['logo' => $logo]);
 			}
 

+ 1 - 1
app/Http/Controllers/Admin/ToolsController.php

@@ -140,7 +140,7 @@ class ToolsController extends Controller {
 			$file = $request->file('uploadFile');
 
 			// 只能上传JSON文件
-			if($file->getClientMimeType() != 'application/json' || $file->getClientOriginalExtension() != 'json'){
+			if($file->getClientMimeType() !== 'application/json' || $file->getClientOriginalExtension() !== 'json'){
 				Session::flash('errorMsg', '只允许上传JSON文件');
 
 				return Redirect::back();

+ 38 - 80
app/Http/Controllers/AdminController.php

@@ -83,23 +83,7 @@ class AdminController extends Controller {
 		                                     ->whereIn('status', [0, 1])
 		                                     ->count(); // 流量超过100G的用户
 
-		// 1小时内流量异常用户
-		$tempUsers = [];
-		$userTotalTrafficList = UserTrafficHourly::query()
-		                                         ->whereNodeId(0)
-		                                         ->where('total', '>', MB * 100)
-		                                         ->where('created_at', '>=', date('Y-m-d H:i:s', time() - 3900))
-		                                         ->groupBy('user_id')
-		                                         ->selectRaw("user_id, sum(total) as totalTraffic")
-		                                         ->get(); // 只统计100M以上的记录,加快速度
-		if(!$userTotalTrafficList->isEmpty()){
-			foreach($userTotalTrafficList as $vo){
-				if($vo->totalTraffic > (self::$systemConfig['traffic_ban_value'] * GB)){
-					$tempUsers[] = $vo->user_id;
-				}
-			}
-		}
-		$view['flowAbnormalUserCount'] = User::query()->whereIn('id', $tempUsers)->count();
+		$view['flowAbnormalUserCount'] = count($this->trafficAbnormal());// 1小时内流量异常用户
 		$view['nodeCount'] = SsNode::query()->count();
 		$view['unnormalNodeCount'] = SsNode::query()->whereStatus(0)->count();
 		$flowCount = SsNodeTrafficDaily::query()
@@ -123,6 +107,24 @@ class AdminController extends Controller {
 		return Response::view('admin.index', $view);
 	}
 
+	// 1小时内流量异常用户
+	private function trafficAbnormal(): array {
+		$result = [];
+		$userTotalTrafficList = UserTrafficHourly::query()
+		                                         ->whereNodeId(0)
+		                                         ->where('total', '>', 50 * MB)
+		                                         ->where('created_at', '>=', date('Y-m-d H:i:s', time() - 3900))
+		                                         ->groupBy('user_id')
+		                                         ->selectRaw("user_id, sum(total) as totalTraffic")
+		                                         ->get(); // 只统计50M以上的记录,加快速度
+		foreach($userTotalTrafficList as $user){
+			if($user->totalTraffic > (self::$systemConfig['traffic_ban_value'] * GB)){
+				$result[] = $user->user_id;
+			}
+		}
+		return $result;
+	}
+
 	// 用户列表
 	public function userList(Request $request): \Illuminate\Http\Response {
 		$id = $request->input('id');
@@ -194,22 +196,7 @@ class AdminController extends Controller {
 
 		// 1小时内流量异常用户
 		if($flowAbnormal){
-			$tempUsers = [];
-			$userTotalTrafficList = UserTrafficHourly::query()
-			                                         ->whereNodeId(0)
-			                                         ->where('total', '>', MB * 100)
-			                                         ->where('created_at', '>=', date('Y-m-d H:i:s', time() - 3900))
-			                                         ->groupBy('user_id')
-			                                         ->selectRaw("user_id, sum(total) as totalTraffic")
-			                                         ->get(); // 只统计100M以上的记录,加快速度
-			if(!$userTotalTrafficList->isEmpty()){
-				foreach($userTotalTrafficList as $vo){
-					if($vo->totalTraffic > (self::$systemConfig['traffic_ban_value'] * GB)){
-						$tempUsers[] = $vo->user_id;
-					}
-				}
-			}
-			$query->whereIn('id', $tempUsers);
+			$query->whereIn('id', $this->trafficAbnormal());
 		}
 
 		$userList = $query->orderByDesc('id')->paginate(15)->appends($request->except('page'));
@@ -490,20 +477,15 @@ class AdminController extends Controller {
 			}else{
 				$logo = '';
 				if($request->hasFile('logo')){
-					$file = $request->file('logo');
-					$fileType = $file->getClientOriginalExtension();
+					$logo = $this->uploadFile($request->file('logo'));
 
-					// 验证文件合法性
-					if(!in_array($fileType, ['jpg', 'png', 'jpeg', 'bmp'])){
+					if(!$logo){
 						Session::flash('errorMsg', 'LOGO不合法');
 
 						return Redirect::back()->withInput();
 					}
-
-					$logoName = date('YmdHis').random_int(1000, 2000).'.'.$fileType;
-					$move = $file->move(base_path().'/public/upload/image/', $logoName);
-					$logo = $move? '/upload/image/'.$logoName : '';
 				}
+
 				$article = new Article();
 				$article->title = $request->input('title');
 				$article->type = $request->input('type', 1);
@@ -544,19 +526,13 @@ class AdminController extends Controller {
 			}else{
 				$logo = '';
 				if($request->hasFile('logo')){
-					$file = $request->file('logo');
-					$fileType = $file->getClientOriginalExtension();
+					$logo = $this->uploadFile($request->file('logo'));
 
-					// 验证文件合法性
-					if(!in_array($fileType, ['jpg', 'png', 'jpeg', 'bmp'])){
+					if(!$logo){
 						Session::flash('errorMsg', 'LOGO不合法');
 
 						return Redirect::back()->withInput();
 					}
-
-					$logoName = date('YmdHis').random_int(1000, 2000).'.'.$fileType;
-					$move = $file->move(base_path().'/public/upload/image/', $logoName);
-					$logo = $move? '/upload/image/'.$logoName : '';
 				}
 			}
 
@@ -674,7 +650,7 @@ class AdminController extends Controller {
 				$proxyType = 'V2Ray';
 			}
 
-			$data = $this->getUserNodeInfo($id, $node->id, $infoType != 'text'? 0 : 1);
+			$data = $this->getUserNodeInfo($id, $node->id, $infoType !== 'text'? 0 : 1);
 
 			return Response::json(['status' => 'success', 'data' => $data, 'title' => $proxyType]);
 
@@ -906,40 +882,22 @@ class AdminController extends Controller {
 
 			// 首页LOGO
 			if($request->hasFile('website_home_logo')){
-				$file = $request->file('website_home_logo');
-				$fileType = $file->getClientOriginalExtension();
-
-				// 验证文件合法性
-				if(!in_array($fileType, ['jpg', 'png', 'jpeg', 'bmp'])){
+				$ret = $this->uploadFile($request->file('website_home_logo'));
+				if(!$ret){
 					Session::flash('errorMsg', 'LOGO不合法');
-
 					return Redirect::back();
 				}
-
-				$logoName = date('YmdHis').random_int(1000, 2000).'.'.$fileType;
-				$move = $file->move(base_path().'/public/upload/image/', $logoName);
-				$websiteHomeLogo = $move? '/upload/image/'.$logoName : '';
-
-				Config::query()->whereName('website_home_logo')->update(['value' => $websiteHomeLogo]);
+				Config::query()->whereName('website_home_logo')->update(['value' => $ret]);
 			}
 
 			// 站内LOGO
 			if($request->hasFile('website_logo')){
-				$file = $request->file('website_logo');
-				$fileType = $file->getClientOriginalExtension();
-
-				// 验证文件合法性
-				if(!in_array($fileType, ['jpg', 'png', 'jpeg', 'bmp'])){
+				$ret = $this->uploadFile($request->file('website_logo'));
+				if(!$ret){
 					Session::flash('errorMsg', 'LOGO不合法');
-
 					return Redirect::back();
 				}
-
-				$logoName = date('YmdHis').random_int(1000, 2000).'.'.$fileType;
-				$move = $file->move(base_path().'/public/upload/image/', $logoName);
-				$websiteLogo = $move? '/upload/image/'.$logoName : '';
-
-				Config::query()->whereName('website_logo')->update(['value' => $websiteLogo]);
+				Config::query()->whereName('website_logo')->update(['value' => $ret]);
 			}
 
 			Config::query()->whereName('website_analytics')->update(['value' => $websiteAnalytics]);
@@ -1094,13 +1052,13 @@ class AdminController extends Controller {
 		}
 
 		$country = Country::query()->whereId($id)->first();
-		if(empty($country)){
+		if($country){
 			return Response::json(['status' => 'fail', 'data' => '', 'message' => '国家/地区不存在']);
 		}
 
 		// 校验该国家/地区下是否存在关联节点
 		$existNode = SsNode::query()->whereCountryCode($country->code)->get();
-		if(!$existNode->isEmpty()){
+		if(!$existNode){
 			return Response::json(['status' => 'fail', 'data' => '', 'message' => '该国家/地区下存在关联节点,请先取消关联']);
 		}
 
@@ -1121,13 +1079,13 @@ class AdminController extends Controller {
 		}
 
 		$country = Country::query()->whereId($id)->first();
-		if(empty($country)){
+		if(!$country){
 			return Response::json(['status' => 'fail', 'data' => '', 'message' => '国家/地区不存在']);
 		}
 
 		// 校验该国家/地区下是否存在关联节点
 		$existNode = SsNode::query()->whereCountryCode($country->code)->get();
-		if(!$existNode->isEmpty()){
+		if(!$existNode){
 			return Response::json(['status' => 'fail', 'data' => '', 'message' => '该国家/地区下存在关联节点,请先取消关联']);
 		}
 		$ret = false;
@@ -1234,7 +1192,7 @@ class AdminController extends Controller {
 		}
 
 		// 如果是返利比例,则需要除100
-		if($name == 'referral_percent'){
+		if($name === 'referral_percent'){
 			$value = intval($value) / 100;
 		}
 
@@ -1380,7 +1338,7 @@ class AdminController extends Controller {
 			$query->whereStatus($status);
 		}
 
-		if(isset($range_time) && $range_time != ','){
+		if(isset($range_time) && $range_time !== ','){
 			$range_time = explode(',', $range_time);
 			$query->where('created_at', '>=', $range_time[0])->where('created_at', '<=', $range_time[1]);
 		}

+ 17 - 1
app/Http/Controllers/Controller.php

@@ -9,6 +9,7 @@ use Exception;
 use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
 use Illuminate\Foundation\Bus\DispatchesJobs;
 use Illuminate\Foundation\Validation\ValidatesRequests;
+use Illuminate\Http\UploadedFile;
 use Illuminate\Routing\Controller as BaseController;
 use RuntimeException;
 
@@ -113,6 +114,21 @@ class Controller extends BaseController {
 		return '';
 	}
 
+	// 上传文件处理
+	public function uploadFile(UploadedFile $file): string {
+		$fileType = $file->getClientOriginalExtension();
+
+		// 验证文件合法性
+		if(!in_array($fileType, ['jpg', 'png', 'jpeg', 'bmp'])){
+			return false;
+		}
+
+		$name = date('YmdHis').random_int(1000, 2000).'.'.$fileType;
+		$move = $file->move(base_path().'/public/upload/image/', $name);
+
+		return $move? '/upload/image/'.$name : '';
+	}
+
 	/**
 	 * 节点信息
 	 *
@@ -122,7 +138,7 @@ class Controller extends BaseController {
 	 *
 	 * @return string
 	 */
-	public function getUserNodeInfo($uid, $nodeId, $infoType): ?string {
+	public function getUserNodeInfo($uid, $nodeId, $infoType): string {
 		$user = User::whereId($uid)->first();
 		$node = SsNode::whereId($nodeId)->first();
 		$scheme = null;

+ 2 - 2
app/Http/Controllers/Gateway/CodePay.php

@@ -30,7 +30,7 @@ class CodePay extends AbstractPayment {
 		$urls = '';
 
 		foreach($data as $key => $val){
-			if($val == '' || $key == 'sign'){
+			if($val == '' || $key === 'sign'){
 				continue;
 			}
 			if($sign != ''){
@@ -52,7 +52,7 @@ class CodePay extends AbstractPayment {
 		reset($_POST);
 		$sign = '';
 		foreach($_POST as $key => $val){
-			if($val == '' || $key == 'sign'){
+			if($val == '' || $key === 'sign'){
 				continue;
 			}
 			if($sign){

+ 2 - 2
app/Http/Controllers/Gateway/F2Fpay.php

@@ -82,9 +82,9 @@ class F2Fpay extends AbstractPayment {
 		}
 
 		$ret = "fail";
-		if($result['code'] == 10000 && $result['msg'] == "Success"){
+		if($result['code'] == 10000 && $result['msg'] === "Success"){
 			$ret = "success";
-			if($_POST['trade_status'] == 'TRADE_FINISHED' || $_POST['trade_status'] == 'TRADE_SUCCESS'){
+			if($_POST['trade_status'] === 'TRADE_FINISHED' || $_POST['trade_status'] === 'TRADE_SUCCESS'){
 				$this->postPayment($request->input('out_trade_no'), '支付宝当面付');
 			}else{
 				Log::info('支付宝当面付-POST:交易失败['.getClientIp().']');

+ 1 - 1
app/Http/Controllers/Gateway/PayPal.php

@@ -124,7 +124,7 @@ class PayPal extends AbstractPayment {
 
 		$response = (string) $this->provider->verifyIPN($post);
 
-		if($response == 'VERIFIED' && $request['invoice']){
+		if($response === 'VERIFIED' && $request['invoice']){
 			if(Payment::whereTradeNo($request['invoice'])->first()->status == 0){
 				$this->postPayment($request['invoice'], 'PayPal');
 			}

+ 3 - 3
app/Http/Controllers/PaymentController.php

@@ -110,7 +110,7 @@ class PaymentController extends Controller {
 			}
 
 			//非余额付款下,检查对应的在线支付是否开启
-			if(self::$method != 'credit'){
+			if(self::$method !== 'credit'){
 				// 判断是否开启在线支付
 				if(!Helpers::systemConfig()['is_onlinePay']){
 					return Response::json(['status' => 'fail', 'message' => '订单创建失败:系统并未开启在线支付功能']);
@@ -153,12 +153,12 @@ class PaymentController extends Controller {
 				return Response::json(['status' => 'fail', 'message' => '订单创建失败:订单总价异常']);
 			}
 
-			if($amount == 0 && self::$method != 'credit'){
+			if($amount == 0 && self::$method !== 'credit'){
 				return Response::json(['status' => 'fail', 'message' => '订单创建失败:订单总价为0,无需使用在线支付']);
 			}
 
 			// 验证账号余额是否充足
-			if(self::$method == 'credit' && Auth::getUser()->credit < $amount){
+			if(self::$method === 'credit' && Auth::getUser()->credit < $amount){
 				return Response::json(['status' => 'fail', 'message' => '您的余额不足,请先充值']);
 			}
 		}

+ 1 - 1
app/Http/Controllers/UserController.php

@@ -180,7 +180,7 @@ class UserController extends Controller {
 			}else{
 				$proxyType = 'V2Ray';
 			}
-			$data = $this->getUserNodeInfo(Auth::id(), $node->id, $infoType != 'text'? 0 : 1);
+			$data = $this->getUserNodeInfo(Auth::id(), $node->id, $infoType !== 'text'? 0 : 1);
 
 			return Response::json(['status' => 'success', 'data' => $data, 'title' => $proxyType]);
 		}

+ 1 - 1
app/Http/Middleware/Authenticate.php

@@ -13,7 +13,7 @@ class Authenticate extends Middleware {
 	 */
 	protected function redirectTo($request) {
 		if(!$request->expectsJson()){
-			return route('/login');
+			return route('login');
 		}
 	}
 }

+ 3 - 3
app/Http/Middleware/isForbidden.php

@@ -70,8 +70,8 @@ class isForbidden {
 		if(!in_array($ipInfo['country'], ['本机地址', '局域网'])){
 			// 拒绝大陆IP访问
 			if(Helpers::systemConfig()['is_forbid_china']){
-				if(($isIPv6 && $ipInfo['country'] == 'China')
-				   || ($ipInfo['country'] == '中国'
+				if(($isIPv6 && $ipInfo['country'] === 'China')
+				   || ($ipInfo['country'] === '中国'
 				       && !in_array($ipInfo['province'], ['香港', '澳门', '台湾']))){
 					Log::info('识别到大陆IP,拒绝访问:'.$ip);
 
@@ -81,7 +81,7 @@ class isForbidden {
 
 			// 拒绝非大陆IP访问
 			if(Helpers::systemConfig()['is_forbid_oversea']){
-				if(($isIPv6 && $ipInfo['country'] != 'China') || $ipInfo['country'] != '中国'
+				if(($isIPv6 && $ipInfo['country'] !== 'China') || $ipInfo['country'] !== '中国'
 				   || in_array($ipInfo['province'], ['香港', '澳门', '台湾'])){
 					Log::info('识别到海外IP,拒绝访问:'.$ip.' - '.$ipInfo['country']);
 

+ 3 - 7
app/Models/Order.php

@@ -148,9 +148,6 @@ class Order extends Model {
 		$base_path = '/assets/images/payment/';
 
 		switch($this->attributes['pay_type']){
-			case 0:
-				$pay_type_icon = $base_path.'coin.png';
-				break;
 			case 1:
 				$pay_type_icon = $base_path.'alipay.png';
 				break;
@@ -160,14 +157,13 @@ class Order extends Model {
 			case 3:
 				$pay_type_icon = $base_path.'wechat.png';
 				break;
-			case 4:
-				$pay_type_icon = $base_path.'coin.png';
-				break;
 			case 5:
 				$pay_type_icon = $base_path.'paypal.png';
 				break;
+			case 0:
+			case 4:
 			default:
-				$pay_type_icon = '';
+				$pay_type_icon = $base_path.'coin.png';
 		}
 		return $pay_type_icon;
 	}

+ 2 - 2
app/helpers.php

@@ -153,7 +153,7 @@ if(!function_exists('getClientIP')){
 			$ip = getenv('REMOTE_ADDR');
 		}
 
-		if(trim($ip) == '::1'){
+		if(trim($ip) === '::1'){
 			$ip = '127.0.0.1';
 		}
 
@@ -196,7 +196,7 @@ if(!function_exists('getIPv6')){
 		try{
 			$result = json_decode(Curl::send($url), true);
 			if(!is_array($result) || isset($result['code'])){
-				throw new \RuntimeException('解析IPv6异常:'.$ip);
+				throw new RuntimeException('解析IPv6异常:'.$ip);
 			}
 
 			return $result;

+ 1 - 1
readme.md

@@ -17,7 +17,7 @@ Support but not limited to: Shadowsocks,ShadowsocksR,ShadowsocksRR,V2Ray,Trojan,
 - Mysql 5.5 +
 - Memory 1G +
 - Disk 10G +
-- PHP Extensions: ZIP、XML、CURL、GD2、FileInfo、OpenSSL、Mbstring、PDO、Tokenizer、Ctype、JSON、BCMath
+- PHP Extensions: ZIP、XML、CURL、GD2、FileInfo、Imagick、OpenSSL、Mbstring、PDO、Tokenizer、Ctype、JSON、BCMath
 - Laravel 5.8
 
 ## Thanks