Initial commit
This commit is contained in:
		
						commit
						d8bc27fa86
					
				
							
								
								
									
										8
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | |||||||
|  | /runtime | ||||||
|  | /.idea | ||||||
|  | /.vscode | ||||||
|  | /vendor | ||||||
|  | *.log | ||||||
|  | .env | ||||||
|  | /tests/tmp | ||||||
|  | /tests/.phpunit.result.cache | ||||||
							
								
								
									
										21
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							| @ -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. | ||||||
							
								
								
									
										31
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  | ## BPS Ads项目 | ||||||
|  | 
 | ||||||
|  | ### 简介 | ||||||
|  | BPS ads项目是一个基于Google Ads API的广告管理系统,使用PHP webman框架开发。该项目提供了一个简单的API,允许用户创建、管理和优化广告活动。 | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | my_project/ | ||||||
|  | │ | ||||||
|  | ├── app/ | ||||||
|  | │   ├── controller/ | ||||||
|  | │   │   └── GoogleAdsController.php | ||||||
|  | │   ├── model/ | ||||||
|  | │   │   └── Campaign.php | ||||||
|  | │   │   └── CampaignBudget.php | ||||||
|  | │   │   └── AdGroup.php | ||||||
|  | │   │   └── Ad.php | ||||||
|  | │   ├── service/ | ||||||
|  | │   │   └── GoogleAdsService.php | ||||||
|  | │   └── routes.php | ||||||
|  | │ | ||||||
|  | ├── config/ | ||||||
|  | │   ├── google_ads_php.ini | ||||||
|  | │   └── database.php | ||||||
|  | │ | ||||||
|  | ├── public/ | ||||||
|  | │   └── index.php | ||||||
|  | │ | ||||||
|  | ├── vendor/ | ||||||
|  | │   └── (composer dependencies) | ||||||
|  | ├── .env | ||||||
|  | └── composer.json``` | ||||||
							
								
								
									
										108
									
								
								app/controller/GoogleAdsController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								app/controller/GoogleAdsController.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,108 @@ | |||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace app\controller; | ||||||
|  | 
 | ||||||
|  | use app\model\Ad; | ||||||
|  | use app\model\AdGroup; | ||||||
|  | use app\model\Campaign; | ||||||
|  | use app\model\CampaignBudget; | ||||||
|  | use app\service\GoogleAdsService; | ||||||
|  | use Webman\Controller; | ||||||
|  | 
 | ||||||
|  | class GoogleAdsController extends Controller | ||||||
|  | { | ||||||
|  |     protected $googleAdsService; | ||||||
|  | 
 | ||||||
|  |     public function __construct() | ||||||
|  |     { | ||||||
|  |         $this->googleAdsService = new GoogleAdsService(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // 创建广告预算
 | ||||||
|  |     public function createCampaignBudget($request) | ||||||
|  |     { | ||||||
|  |         $data = $request->post(); | ||||||
|  |         $customerId = $data['customer_id']; | ||||||
|  |         $budgetName = $data['budget_name']; | ||||||
|  |         $amountMicros = $data['amount_micros']; | ||||||
|  | 
 | ||||||
|  |         $budgetResourceName = $this->googleAdsService->createCampaignBudget($customerId, $budgetName, $amountMicros); | ||||||
|  | 
 | ||||||
|  |         // 在数据库中保存广告预算信息
 | ||||||
|  |         $budget = new CampaignBudget([ | ||||||
|  |             'name' => $budgetName, | ||||||
|  |             'amount_micros' => $amountMicros, | ||||||
|  |         ]); | ||||||
|  |         $budget->save(); | ||||||
|  | 
 | ||||||
|  |         return json(['status' => 'success', 'data' => $budgetResourceName]); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // 创建广告系列
 | ||||||
|  |     public function createCampaign($request) | ||||||
|  |     { | ||||||
|  |         $data = $request->post(); | ||||||
|  |         $customerId = $data['customer_id']; | ||||||
|  |         $budgetId = $data['budget_id']; | ||||||
|  |         $campaignName = $data['campaign_name']; | ||||||
|  | 
 | ||||||
|  |         $campaignResourceName = $this->googleAdsService->createCampaign($customerId, $budgetId, $campaignName); | ||||||
|  | 
 | ||||||
|  |         // 在数据库中保存广告系列信息
 | ||||||
|  |         $campaign = new Campaign([ | ||||||
|  |             'name' => $campaignName, | ||||||
|  |             'budget_id' => $budgetId, | ||||||
|  |         ]); | ||||||
|  |         $campaign->save(); | ||||||
|  | 
 | ||||||
|  |         return json(['status' => 'success', 'data' => $campaignResourceName]); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // 创建广告组
 | ||||||
|  |     public function createAdGroup($request) | ||||||
|  |     { | ||||||
|  |         $data = $request->post(); | ||||||
|  |         $customerId = $data['customer_id']; | ||||||
|  |         $campaignId = $data['campaign_id']; | ||||||
|  |         $adGroupName = $data['ad_group_name']; | ||||||
|  |         $cpcBidMicros = $data['cpc_bid_micros']; | ||||||
|  | 
 | ||||||
|  |         $adGroupResourceName = $this->googleAdsService->createAdGroup($customerId, $campaignId, $adGroupName, $cpcBidMicros); | ||||||
|  | 
 | ||||||
|  |         // 在数据库中保存广告组信息
 | ||||||
|  |         $adGroup = new AdGroup([ | ||||||
|  |             'name' => $adGroupName, | ||||||
|  |             'campaign_id' => $campaignId, | ||||||
|  |             'cpc_bid_micros' => $cpcBidMicros, | ||||||
|  |         ]); | ||||||
|  |         $adGroup->save(); | ||||||
|  | 
 | ||||||
|  |         return json(['status' => 'success', 'data' => $adGroupResourceName]); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // 创建广告
 | ||||||
|  |     public function createAd($request) | ||||||
|  |     { | ||||||
|  |         $data = $request->post(); | ||||||
|  |         $customerId = $data['customer_id']; | ||||||
|  |         $adGroupId = $data['ad_group_id']; | ||||||
|  |         $adName = $data['ad_name']; | ||||||
|  |         $headline = $data['headline']; | ||||||
|  |         $description = $data['description']; | ||||||
|  |         $finalUrls = $data['final_urls']; | ||||||
|  | 
 | ||||||
|  |         $adResourceName = $this->googleAdsService->createAd($customerId, $adGroupId, $adName, $headline, $description, $finalUrls); | ||||||
|  | 
 | ||||||
|  |         // 在数据库中保存广告信息
 | ||||||
|  |         $ad = new Ad([ | ||||||
|  |             'name' => $adName, | ||||||
|  |             'ad_group_id' => $adGroupId, | ||||||
|  |             'headline' => $headline, | ||||||
|  |             'description' => $description, | ||||||
|  |             'final_urls' => json_encode($finalUrls), | ||||||
|  |         ]); | ||||||
|  |         $ad->save(); | ||||||
|  | 
 | ||||||
|  |         return json(['status' => 'success', 'data' => $adResourceName]); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										28
									
								
								app/controller/IndexController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								app/controller/IndexController.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | |||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace app\controller; | ||||||
|  | 
 | ||||||
|  | use support\Request; | ||||||
|  | 
 | ||||||
|  | class IndexController | ||||||
|  | { | ||||||
|  |     public function index(Request $request) | ||||||
|  |     { | ||||||
|  |         static $readme; | ||||||
|  |         if (!$readme) { | ||||||
|  |             $readme = file_get_contents(base_path('README.md')); | ||||||
|  |         } | ||||||
|  |         return $readme; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function view(Request $request) | ||||||
|  |     { | ||||||
|  |         return view('index/view', ['name' => 'webman']); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function json(Request $request) | ||||||
|  |     { | ||||||
|  |         return json(['code' => 0, 'msg' => 'ok']); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
							
								
								
									
										4
									
								
								app/functions.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								app/functions.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | |||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * Here is your custom functions. | ||||||
|  |  */ | ||||||
							
								
								
									
										42
									
								
								app/middleware/StaticFile.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								app/middleware/StaticFile.php
									
									
									
									
									
										Normal file
									
								
							| @ -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 $next): Response | ||||||
|  |     { | ||||||
|  |         // Access to files beginning with. Is prohibited
 | ||||||
|  |         if (strpos($request->path(), '/.') !== false) { | ||||||
|  |             return response('<h1>403 forbidden</h1>', 403); | ||||||
|  |         } | ||||||
|  |         /** @var Response $response */ | ||||||
|  |         $response = $next($request); | ||||||
|  |         // Add cross domain HTTP header
 | ||||||
|  |         /*$response->withHeaders([ | ||||||
|  |             'Access-Control-Allow-Origin'      => '*', | ||||||
|  |             'Access-Control-Allow-Credentials' => 'true', | ||||||
|  |         ]);*/ | ||||||
|  |         return $response; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										17
									
								
								app/model/Ad.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								app/model/Ad.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | |||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace app\model; | ||||||
|  | 
 | ||||||
|  | use think\Model; | ||||||
|  | 
 | ||||||
|  | class Ad extends Model | ||||||
|  | { | ||||||
|  |     protected $table = 'ad_ga_ads'; | ||||||
|  |     protected $primaryKey = 'id'; | ||||||
|  |     protected $autoWriteTimestamp = true; | ||||||
|  | 
 | ||||||
|  |     public function adGroup() | ||||||
|  |     { | ||||||
|  |         return $this->belongsTo(AdGroup::class, 'ad_group_id', 'id'); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										17
									
								
								app/model/AdGroup.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								app/model/AdGroup.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | |||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace app\model; | ||||||
|  | 
 | ||||||
|  | use think\Model; | ||||||
|  | 
 | ||||||
|  | class AdGroup extends Model | ||||||
|  | { | ||||||
|  |     protected $table = 'ad_ga_ad_groups'; | ||||||
|  |     protected $primaryKey = 'id'; | ||||||
|  |     protected $autoWriteTimestamp = true; | ||||||
|  | 
 | ||||||
|  |     public function campaign() | ||||||
|  |     { | ||||||
|  |         return $this->belongsTo(Campaign::class, 'campaign_id', 'id'); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										20
									
								
								app/model/Campaign.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								app/model/Campaign.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | |||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace app\model; | ||||||
|  | 
 | ||||||
|  | use think\Model; | ||||||
|  | 
 | ||||||
|  | class Campaign extends PgBaseModel | ||||||
|  | { | ||||||
|  |     protected $table = 'ad_ga_campaigns';  // 对应数据库表名
 | ||||||
|  |     protected $primaryKey = 'id';       // 主键
 | ||||||
|  |     protected $autoWriteTimestamp = true; // 自动时间戳
 | ||||||
|  |     protected $createTime = 'created_at'; // 创建时间字段
 | ||||||
|  |     protected $updateTime = 'updated_at'; // 更新时间字段
 | ||||||
|  | 
 | ||||||
|  |     // 关联广告预算
 | ||||||
|  |     public function campaignBudget() | ||||||
|  |     { | ||||||
|  |         return $this->belongsTo(CampaignBudget::class, 'budget_id', 'id'); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										17
									
								
								app/model/CampaignBudget.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								app/model/CampaignBudget.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | |||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace app\model; | ||||||
|  | 
 | ||||||
|  | use think\Model; | ||||||
|  | 
 | ||||||
|  | class CampaignBudget extends Model | ||||||
|  | { | ||||||
|  |     protected $table = 'ad_ga_campaign_budgets'; | ||||||
|  |     protected $primaryKey = 'id'; | ||||||
|  |     protected $autoWriteTimestamp = true; | ||||||
|  | 
 | ||||||
|  |     public function campaigns() | ||||||
|  |     { | ||||||
|  |         return $this->hasMany(Campaign::class, 'budget_id', 'id'); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										29
									
								
								app/model/Test.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								app/model/Test.php
									
									
									
									
									
										Normal file
									
								
							| @ -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
									
								
								app/process/Http.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								app/process/Http.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace app\process; | ||||||
|  | 
 | ||||||
|  | use Webman\App; | ||||||
|  | 
 | ||||||
|  | class Http extends App | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | } | ||||||
							
								
								
									
										262
									
								
								app/process/Monitor.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										262
									
								
								app/process/Monitor.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,262 @@ | |||||||
|  | <?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 $paths = []; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @var array | ||||||
|  |      */ | ||||||
|  |     protected $extensions = []; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @var array | ||||||
|  |      */ | ||||||
|  |     protected $loadedFiles = []; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Pause monitor | ||||||
|  |      * @return void | ||||||
|  |      */ | ||||||
|  |     public static function pause() | ||||||
|  |     { | ||||||
|  |         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 = []) | ||||||
|  |     { | ||||||
|  |         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; | ||||||
|  |                 } | ||||||
|  |                 echo $file . " updated and reload\n"; | ||||||
|  |                 // send SIGUSR1 signal to master process for reload
 | ||||||
|  |                 if (DIRECTORY_SEPARATOR === '/') { | ||||||
|  |                     posix_kill(posix_getppid(), SIGUSR1); | ||||||
|  |                 } else { | ||||||
|  |                     return true; | ||||||
|  |                 } | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         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 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) | ||||||
|  |     { | ||||||
|  |         if (static::isPaused() || $memoryLimit <= 0) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         $ppid = posix_getppid(); | ||||||
|  |         $childrenFile = "/proc/$ppid/task/$ppid/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 | ||||||
|  |      * @return float | ||||||
|  |      */ | ||||||
|  |     protected function getMemoryLimit($memoryLimit) | ||||||
|  |     { | ||||||
|  |         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]); | ||||||
|  |         if ($unit === 'g') { | ||||||
|  |             $memoryLimit = 1024 * (int)$memoryLimit; | ||||||
|  |         } else if ($unit === 'm') { | ||||||
|  |             $memoryLimit = (int)$memoryLimit; | ||||||
|  |         } else if ($unit === 'k') { | ||||||
|  |             $memoryLimit = ((int)$memoryLimit / 1024); | ||||||
|  |         } else { | ||||||
|  |             $memoryLimit = ((int)$memoryLimit / (1024 * 1024)); | ||||||
|  |         } | ||||||
|  |         if ($memoryLimit < 30) { | ||||||
|  |             $memoryLimit = 30; | ||||||
|  |         } | ||||||
|  |         if ($usePhpIni) { | ||||||
|  |             $memoryLimit = (int)(0.8 * $memoryLimit); | ||||||
|  |         } | ||||||
|  |         return $memoryLimit; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										9
									
								
								app/routes.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								app/routes.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | <?php | ||||||
|  | use app\controller\GoogleAdsController; | ||||||
|  | 
 | ||||||
|  | return [ | ||||||
|  |     'POST /google-ads/create-budget' => [GoogleAdsController::class, 'createCampaignBudget'], | ||||||
|  |     'POST /google-ads/create-campaign' => [GoogleAdsController::class, 'createCampaign'], | ||||||
|  |     'POST /google-ads/create-adgroup' => [GoogleAdsController::class, 'createAdGroup'], | ||||||
|  |     'POST /google-ads/create-ad' => [GoogleAdsController::class, 'createAd'], | ||||||
|  | ]; | ||||||
							
								
								
									
										131
									
								
								app/service/GoogleAdsService.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								app/service/GoogleAdsService.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,131 @@ | |||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace app\service; | ||||||
|  | 
 | ||||||
|  | use Google\Ads\GoogleAds\Lib\V18\GoogleAdsClient; | ||||||
|  | use Google\Ads\GoogleAds\V18\Services\AdGroupOperation; | ||||||
|  | use Google\Ads\GoogleAds\V18\Services\AdOperation; | ||||||
|  | use Google\Ads\GoogleAds\V18\Services\CampaignBudgetOperation; | ||||||
|  | use Google\Ads\GoogleAds\V18\Services\CampaignOperation; | ||||||
|  | 
 | ||||||
|  | class GoogleAdsService | ||||||
|  | { | ||||||
|  |     protected $googleAdsClient; | ||||||
|  | 
 | ||||||
|  |     public function __construct() | ||||||
|  |     { | ||||||
|  |         $config = include __DIR__ . '/../../config/google_ads_php.ini'; | ||||||
|  |         $this->googleAdsClient = new GoogleAdsClient([ | ||||||
|  |             'developerToken' => $config['developer_token'], | ||||||
|  |             'clientId' => $config['client_id'], | ||||||
|  |             'clientSecret' => $config['client_secret'], | ||||||
|  |             'refreshToken' => $config['refresh_token'], | ||||||
|  |         ]); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // 创建广告预算
 | ||||||
|  |     public function createCampaignBudget($customerId, $budgetName, $amountMicros) | ||||||
|  |     { | ||||||
|  |         $campaignBudgetService = $this->googleAdsClient->getCampaignBudgetServiceClient(); | ||||||
|  | 
 | ||||||
|  |         $campaignBudget = new \Google\Ads\GoogleAds\V18\Resources\CampaignBudget([ | ||||||
|  |             'name' => $budgetName, | ||||||
|  |             'amountMicros' => $amountMicros, | ||||||
|  |             'deliveryMethod' => 'STANDARD', | ||||||
|  |             'status' => 'ENABLED', | ||||||
|  |         ]); | ||||||
|  | 
 | ||||||
|  |         $operation = new CampaignBudgetOperation(); | ||||||
|  |         $operation->setCreate($campaignBudget); | ||||||
|  | 
 | ||||||
|  |         try { | ||||||
|  |             $response = $campaignBudgetService->mutateCampaignBudgets($customerId, [$operation]); | ||||||
|  |             return $response->getResults()[0]->getResourceName(); | ||||||
|  |         } catch (\Google\Ads\GoogleAds\Errors\GoogleAdsException $e) { | ||||||
|  |             return $e->getMessage(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // 创建广告系列
 | ||||||
|  |     public function createCampaign($customerId, $budgetId, $campaignName) | ||||||
|  |     { | ||||||
|  |         $campaignService = $this->googleAdsClient->getCampaignServiceClient(); | ||||||
|  | 
 | ||||||
|  |         $campaign = new \Google\Ads\GoogleAds\V18\Resources\Campaign([ | ||||||
|  |             'name' => $campaignName, | ||||||
|  |             'advertisingChannelType' => 'SEARCH', | ||||||
|  |             'status' => 'PAUSED', | ||||||
|  |             'startDate' => '2024-12-01', | ||||||
|  |             'endDate' => '2024-12-31', | ||||||
|  |             'manualCpc' => new \Google\Ads\GoogleAds\V18\Resources\ManualCpc([ | ||||||
|  |                 'enhancedCpcEnabled' => true | ||||||
|  |             ]), | ||||||
|  |             'campaignBudget' => "customers/{$customerId}/campaignBudgets/{$budgetId}" | ||||||
|  |         ]); | ||||||
|  | 
 | ||||||
|  |         $operation = new CampaignOperation(); | ||||||
|  |         $operation->setCreate($campaign); | ||||||
|  | 
 | ||||||
|  |         try { | ||||||
|  |             $response = $campaignService->mutateCampaigns($customerId, [$operation]); | ||||||
|  |             return $response->getResults()[0]->getResourceName(); | ||||||
|  |         } catch (\Google\Ads\GoogleAds\Errors\GoogleAdsException $e) { | ||||||
|  |             return $e->getMessage(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // 创建广告组
 | ||||||
|  |     public function createAdGroup($customerId, $campaignId, $adGroupName, $cpcBidMicros) | ||||||
|  |     { | ||||||
|  |         $adGroupService = $this->googleAdsClient->getAdGroupServiceClient(); | ||||||
|  | 
 | ||||||
|  |         $adGroup = new \Google\Ads\GoogleAds\V18\Resources\AdGroup([ | ||||||
|  |             'name' => $adGroupName, | ||||||
|  |             'campaign' => "customers/{$customerId}/campaigns/{$campaignId}", | ||||||
|  |             'status' => 'PAUSED', | ||||||
|  |             'cpcBidMicros' => $cpcBidMicros, | ||||||
|  |             'startDate' => '2024-12-01', | ||||||
|  |             'endDate' => '2024-12-31', | ||||||
|  |         ]); | ||||||
|  | 
 | ||||||
|  |         $operation = new AdGroupOperation(); | ||||||
|  |         $operation->setCreate($adGroup); | ||||||
|  | 
 | ||||||
|  |         try { | ||||||
|  |             $response = $adGroupService->mutateAdGroups($customerId, [$operation]); | ||||||
|  |             return $response->getResults()[0]->getResourceName(); | ||||||
|  |         } catch (\Google\Ads\GoogleAds\Errors\GoogleAdsException $e) { | ||||||
|  |             return $e->getMessage(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // 创建广告
 | ||||||
|  |     public function createAd($customerId, $adGroupId, $adName, $headline, $description, $finalUrls) | ||||||
|  |     { | ||||||
|  |         $adService = $this->googleAdsClient->getAdServiceClient(); | ||||||
|  | 
 | ||||||
|  |         // 创建文本广告
 | ||||||
|  |         $textAd = new \Google\Ads\GoogleAds\V18\Resources\AdTextAdInfo([ | ||||||
|  |             'headline' => $headline, | ||||||
|  |             'description' => $description, | ||||||
|  |             'finalUrls' => $finalUrls, | ||||||
|  |         ]); | ||||||
|  | 
 | ||||||
|  |         $ad = new \Google\Ads\GoogleAds\V18\Resources\Ad([ | ||||||
|  |             'name' => $adName, | ||||||
|  |             'adGroup' => "customers/{$customerId}/adGroups/{$adGroupId}", | ||||||
|  |             'status' => 'PAUSED', | ||||||
|  |             'textAd' => $textAd, | ||||||
|  |         ]); | ||||||
|  | 
 | ||||||
|  |         $operation = new AdOperation(); | ||||||
|  |         $operation->setCreate($ad); | ||||||
|  | 
 | ||||||
|  |         try { | ||||||
|  |             $response = $adService->mutateAds($customerId, [$operation]); | ||||||
|  |             return $response->getResults()[0]->getResourceName(); | ||||||
|  |         } catch (\Google\Ads\GoogleAds\Errors\GoogleAdsException $e) { | ||||||
|  |             return $e->getMessage(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										14
									
								
								app/view/index/view.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								app/view/index/view.html
									
									
									
									
									
										Normal file
									
								
							| @ -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> | ||||||
							
								
								
									
										55
									
								
								composer.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								composer.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,55 @@ | |||||||
|  | { | ||||||
|  |   "name": "workerman/webman", | ||||||
|  |   "type": "project", | ||||||
|  |   "keywords": [ | ||||||
|  |     "high performance", | ||||||
|  |     "http service" | ||||||
|  |   ], | ||||||
|  |   "homepage": "https://www.workerman.net", | ||||||
|  |   "license": "MIT", | ||||||
|  |   "description": "High performance HTTP Service Framework.", | ||||||
|  |   "authors": [ | ||||||
|  |     { | ||||||
|  |       "name": "walkor", | ||||||
|  |       "email": "walkor@workerman.net", | ||||||
|  |       "homepage": "https://www.workerman.net", | ||||||
|  |       "role": "Developer" | ||||||
|  |     } | ||||||
|  |   ], | ||||||
|  |   "support": { | ||||||
|  |     "email": "walkor@workerman.net", | ||||||
|  |     "issues": "https://github.com/walkor/webman/issues", | ||||||
|  |     "forum": "https://wenda.workerman.net/", | ||||||
|  |     "wiki": "https://workerman.net/doc/webman", | ||||||
|  |     "source": "https://github.com/walkor/webman" | ||||||
|  |   }, | ||||||
|  |   "require": { | ||||||
|  |     "php": ">=8.0", | ||||||
|  |     "workerman/webman-framework": "^1.6.8", | ||||||
|  |     "monolog/monolog": "^2.0" | ||||||
|  |   }, | ||||||
|  |   "suggest": { | ||||||
|  |     "ext-event": "For better performance. " | ||||||
|  |   }, | ||||||
|  |   "autoload": { | ||||||
|  |     "psr-4": { | ||||||
|  |       "": "./", | ||||||
|  |       "app\\": "./app", | ||||||
|  |       "App\\": "./app", | ||||||
|  |       "app\\View\\Components\\": "./app/view/components" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "scripts": { | ||||||
|  |     "post-package-install": [ | ||||||
|  |       "support\\Plugin::install" | ||||||
|  |     ], | ||||||
|  |     "post-package-update": [ | ||||||
|  |       "support\\Plugin::install" | ||||||
|  |     ], | ||||||
|  |     "pre-package-uninstall": [ | ||||||
|  |       "support\\Plugin::uninstall" | ||||||
|  |     ] | ||||||
|  |   }, | ||||||
|  |   "minimum-stability": "dev", | ||||||
|  |   "prefer-stable": true | ||||||
|  | } | ||||||
							
								
								
									
										319
									
								
								composer.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										319
									
								
								composer.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @ -0,0 +1,319 @@ | |||||||
|  | { | ||||||
|  |     "_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": "6e6023f44041e2f811fec6345b255443", | ||||||
|  |     "packages": [ | ||||||
|  |         { | ||||||
|  |             "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" | ||||||
|  |             ], | ||||||
|  |             "time": "2024-11-12T12:43:37+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" | ||||||
|  |             ], | ||||||
|  |             "time": "2018-02-13T20:26:39+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" | ||||||
|  |             ], | ||||||
|  |             "time": "2021-11-05T16:47:00+00:00" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "psr/log", | ||||||
|  |             "version": "3.0.2", | ||||||
|  |             "dist": { | ||||||
|  |                 "type": "zip", | ||||||
|  |                 "url": "https://mirrors.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" | ||||||
|  |             ], | ||||||
|  |             "time": "2024-09-11T13:17:53+00:00" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "workerman/webman-framework", | ||||||
|  |             "version": "v1.6.8", | ||||||
|  |             "dist": { | ||||||
|  |                 "type": "zip", | ||||||
|  |                 "url": "https://mirrors.cloud.tencent.com/repository/composer/workerman/webman-framework/v1.6.8/workerman-webman-framework-v1.6.8.zip", | ||||||
|  |                 "reference": "7e1d28d266b2c9aa69b2ca8f4e3c1da778e2ad4a", | ||||||
|  |                 "shasum": "" | ||||||
|  |             }, | ||||||
|  |             "require": { | ||||||
|  |                 "ext-json": "*", | ||||||
|  |                 "nikic/fast-route": "^1.3", | ||||||
|  |                 "php": ">=8.0", | ||||||
|  |                 "psr/container": ">=1.0", | ||||||
|  |                 "workerman/workerman": "^4.2.1 || ^5.0.0 || 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" | ||||||
|  |             ], | ||||||
|  |             "time": "2024-12-10T07:13:15+00:00" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "workerman/workerman", | ||||||
|  |             "version": "v4.2.1", | ||||||
|  |             "dist": { | ||||||
|  |                 "type": "zip", | ||||||
|  |                 "url": "https://mirrors.cloud.tencent.com/repository/composer/workerman/workerman/v4.2.1/workerman-workerman-v4.2.1.zip", | ||||||
|  |                 "reference": "cafb5a43d93d7d30a16b32a57948581cca993562", | ||||||
|  |                 "shasum": "" | ||||||
|  |             }, | ||||||
|  |             "require": { | ||||||
|  |                 "php": ">=8.0" | ||||||
|  |             }, | ||||||
|  |             "suggest": { | ||||||
|  |                 "ext-event": "For better performance. " | ||||||
|  |             }, | ||||||
|  |             "type": "library", | ||||||
|  |             "autoload": { | ||||||
|  |                 "psr-4": { | ||||||
|  |                     "Workerman\\": "./" | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             "license": [ | ||||||
|  |                 "MIT" | ||||||
|  |             ], | ||||||
|  |             "authors": [ | ||||||
|  |                 { | ||||||
|  |                     "name": "walkor", | ||||||
|  |                     "email": "walkor@workerman.net", | ||||||
|  |                     "homepage": "http://www.workerman.net", | ||||||
|  |                     "role": "Developer" | ||||||
|  |                 } | ||||||
|  |             ], | ||||||
|  |             "description": "An asynchronous event driven PHP framework for easily building fast, scalable network applications.", | ||||||
|  |             "homepage": "http://www.workerman.net", | ||||||
|  |             "keywords": [ | ||||||
|  |                 "asynchronous", | ||||||
|  |                 "event-loop" | ||||||
|  |             ], | ||||||
|  |             "time": "2024-11-24T11:45:37+00:00" | ||||||
|  |         } | ||||||
|  |     ], | ||||||
|  |     "packages-dev": [], | ||||||
|  |     "aliases": [], | ||||||
|  |     "minimum-stability": "dev", | ||||||
|  |     "stability-flags": [], | ||||||
|  |     "prefer-stable": true, | ||||||
|  |     "prefer-lowest": false, | ||||||
|  |     "platform": { | ||||||
|  |         "php": ">=8.0" | ||||||
|  |     }, | ||||||
|  |     "platform-dev": [], | ||||||
|  |     "plugin-api-version": "2.6.0" | ||||||
|  | } | ||||||
							
								
								
									
										26
									
								
								config/app.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								config/app.php
									
									
									
									
									
										Normal file
									
								
							| @ -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
									
								
								config/autoload.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								config/autoload.php
									
									
									
									
									
										Normal file
									
								
							| @ -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
									
								
								config/bootstrap.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								config/bootstrap.php
									
									
									
									
									
										Normal file
									
								
							| @ -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, | ||||||
|  |     support\bootstrap\LaravelDb::class, | ||||||
|  | ]; | ||||||
							
								
								
									
										30
									
								
								config/cache.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								config/cache.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | |||||||
|  | <?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' => 'file', | ||||||
|  |     'stores' => [ | ||||||
|  |         'file' => [ | ||||||
|  |             'driver' => 'file', | ||||||
|  |             'path' => runtime_path('cache') | ||||||
|  |         ], | ||||||
|  |         'redis' => [ | ||||||
|  |             'driver' => 'redis', | ||||||
|  |             'connection' => 'default' | ||||||
|  |         ], | ||||||
|  |         'array' => [ | ||||||
|  |             'driver' => 'array' | ||||||
|  |         ] | ||||||
|  |     ] | ||||||
|  | ]; | ||||||
							
								
								
									
										15
									
								
								config/container.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								config/container.php
									
									
									
									
									
										Normal file
									
								
							| @ -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; | ||||||
							
								
								
									
										51
									
								
								config/database.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								config/database.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | |||||||
|  | <?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' => 'pgsql', | ||||||
|  | 
 | ||||||
|  |     // 各种数据库配置
 | ||||||
|  |     'connections' => [ | ||||||
|  |         'mysql' => [ | ||||||
|  |             'driver' => 'mysql', | ||||||
|  |             'host' => getenv('DB_HOST'), | ||||||
|  |             'port' => getenv('DB_PORT'), | ||||||
|  |             'database' => getenv('DB_NAME'), | ||||||
|  |             'username' => getenv('DB_USER'), | ||||||
|  |             'password' => getenv('DB_PASSWORD'), | ||||||
|  |             'unix_socket' => '', | ||||||
|  |             'charset' => 'utf8mb4', | ||||||
|  |             'collation' => 'utf8mb4_unicode_ci', | ||||||
|  |             'prefix' => '', | ||||||
|  |             'strict' => true, | ||||||
|  |             'engine' => null, | ||||||
|  |             'options' => [ | ||||||
|  |                 \PDO::ATTR_TIMEOUT => 3 | ||||||
|  |             ] | ||||||
|  |         ], | ||||||
|  |         'pgsql' => [ | ||||||
|  |             'driver' => getenv('DB_PG_CONNECTION'), | ||||||
|  |             'hostname' => getenv('DB_PG_HOST'), | ||||||
|  |             'hostport' => getenv('DB_PG_PORT'), | ||||||
|  |             'database' => getenv('DB_PG_NAME'), | ||||||
|  |             'username' => getenv('DB_PG_USER'), | ||||||
|  |             'password' => getenv('DB_PG_PASSWORD'), | ||||||
|  |             'unix_socket' => '', | ||||||
|  |             'charset' => 'utf8', | ||||||
|  |             'prefix' => 'ad_',  // 数据表前缀
 | ||||||
|  |             'debug' => true, | ||||||
|  |         ] | ||||||
|  |     ], | ||||||
|  | ]; | ||||||
							
								
								
									
										15
									
								
								config/dependence.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								config/dependence.php
									
									
									
									
									
										Normal file
									
								
							| @ -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 []; | ||||||
							
								
								
									
										17
									
								
								config/exception.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								config/exception.php
									
									
									
									
									
										Normal file
									
								
							| @ -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, | ||||||
|  | ]; | ||||||
							
								
								
									
										5
									
								
								config/google_ads_php.ini
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								config/google_ads_php.ini
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | |||||||
|  | [GOOGLE_ADS] | ||||||
|  | developer_token = "C5wRcPCLwubnNgOEqweLBA" | ||||||
|  | client_id = "117429539543-t73vtg7v1vag5b2dg68qaaaj00gmacjs.apps.googleusercontent.com" | ||||||
|  | client_secret = "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" | ||||||
|  | refresh_token = "1//0eAC5wgBctJo3CgYIARAAGA4SNwF-L9Ir8lepCIkpDPvGHltj_1afFbW7tpb61OdbPdrvsjIVEbvMZnkPTi2f4WtgbtH97eX2iXE" | ||||||
							
								
								
									
										32
									
								
								config/log.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								config/log.php
									
									
									
									
									
										Normal file
									
								
							| @ -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
									
								
								config/middleware.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								config/middleware.php
									
									
									
									
									
										Normal file
									
								
							| @ -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 []; | ||||||
							
								
								
									
										62
									
								
								config/process.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								config/process.php
									
									
									
									
									
										Normal file
									
								
							| @ -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 === '/', | ||||||
|  |             ] | ||||||
|  |         ] | ||||||
|  |     ] | ||||||
|  | ]; | ||||||
							
								
								
									
										22
									
								
								config/redis.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								config/redis.php
									
									
									
									
									
										Normal file
									
								
							| @ -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 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | return [ | ||||||
|  |     'default' => [ | ||||||
|  |         'host' => '127.0.0.1', | ||||||
|  |         'password' => null, | ||||||
|  |         'port' => 6379, | ||||||
|  |         'database' => 0, | ||||||
|  |     ], | ||||||
|  | ]; | ||||||
							
								
								
									
										21
									
								
								config/route.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								config/route.php
									
									
									
									
									
										Normal file
									
								
							| @ -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
									
								
								config/server.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								config/server.php
									
									
									
									
									
										Normal file
									
								
							| @ -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
									
								
								config/session.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								config/session.php
									
									
									
									
									
										Normal file
									
								
							| @ -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
									
								
								config/static.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								config/static.php
									
									
									
									
									
										Normal file
									
								
							| @ -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,
 | ||||||
|  |     ], | ||||||
|  | ]; | ||||||
							
								
								
									
										25
									
								
								config/translation.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								config/translation.php
									
									
									
									
									
										Normal file
									
								
							| @ -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
									
								
								config/view.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								config/view.php
									
									
									
									
									
										Normal file
									
								
							| @ -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 | ||||||
|  | ]; | ||||||
							
								
								
									
										12
									
								
								public/404.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								public/404.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | |||||||
|  | <html> | ||||||
|  | <head> | ||||||
|  |     <title>404 Not Found - webman</title> | ||||||
|  | </head> | ||||||
|  | <body> | ||||||
|  | <center> | ||||||
|  |     <h1>404 Not Found</h1> | ||||||
|  | </center> | ||||||
|  | <hr> | ||||||
|  | <center>webman</center> | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
							
								
								
									
										
											BIN
										
									
								
								public/favicon.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								public/favicon.ico
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 4.2 KiB | 
							
								
								
									
										5
									
								
								start.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										5
									
								
								start.php
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,5 @@ | |||||||
|  | #!/usr/bin/env php
 | ||||||
|  | <?php | ||||||
|  | chdir(__DIR__); | ||||||
|  | require_once __DIR__ . '/vendor/autoload.php'; | ||||||
|  | support\App::run(); | ||||||
							
								
								
									
										24
									
								
								support/Request.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								support/Request.php
									
									
									
									
									
										Normal file
									
								
							| @ -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
									
								
								support/Response.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								support/Response.php
									
									
									
									
									
										Normal file
									
								
							| @ -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
									
								
								support/bootstrap.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								support/bootstrap.php
									
									
									
									
									
										Normal file
									
								
							| @ -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); | ||||||
|  | 
 | ||||||
							
								
								
									
										3
									
								
								windows.bat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								windows.bat
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | CHCP 65001 | ||||||
|  | php windows.php | ||||||
|  | pause | ||||||
							
								
								
									
										136
									
								
								windows.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								windows.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,136 @@ | |||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * Start file for windows | ||||||
|  |  */ | ||||||
|  | chdir(__DIR__); | ||||||
|  | require_once __DIR__ . '/vendor/autoload.php'; | ||||||
|  | 
 | ||||||
|  | use Dotenv\Dotenv; | ||||||
|  | use support\App; | ||||||
|  | use Workerman\Worker; | ||||||
|  | 
 | ||||||
|  | ini_set('display_errors', 'on'); | ||||||
|  | error_reporting(E_ALL); | ||||||
|  | 
 | ||||||
|  | if (class_exists('Dotenv\Dotenv') && file_exists(base_path() . '/.env')) { | ||||||
|  |     if (method_exists('Dotenv\Dotenv', 'createUnsafeImmutable')) { | ||||||
|  |         Dotenv::createUnsafeImmutable(base_path())->load(); | ||||||
|  |     } else { | ||||||
|  |         Dotenv::createMutable(base_path())->load(); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | App::loadAllConfig(['route']); | ||||||
|  | 
 | ||||||
|  | $errorReporting = config('app.error_reporting'); | ||||||
|  | if (isset($errorReporting)) { | ||||||
|  |     error_reporting($errorReporting); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | $runtimeProcessPath = runtime_path() . DIRECTORY_SEPARATOR . '/windows'; | ||||||
|  | $paths = [ | ||||||
|  |     $runtimeProcessPath, | ||||||
|  |     runtime_path('logs'), | ||||||
|  |     runtime_path('views') | ||||||
|  | ]; | ||||||
|  | foreach ($paths as $path) { | ||||||
|  |     if (!is_dir($path)) { | ||||||
|  |         mkdir($path, 0777, true); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | $processFiles = []; | ||||||
|  | if (config('server.listen')) { | ||||||
|  |     $processFiles[] = __DIR__ . DIRECTORY_SEPARATOR . 'start.php'; | ||||||
|  | } | ||||||
|  | foreach (config('process', []) as $processName => $config) { | ||||||
|  |     $processFiles[] = write_process_file($runtimeProcessPath, $processName, ''); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | foreach (config('plugin', []) as $firm => $projects) { | ||||||
|  |     foreach ($projects as $name => $project) { | ||||||
|  |         if (!is_array($project)) { | ||||||
|  |             continue; | ||||||
|  |         } | ||||||
|  |         foreach ($project['process'] ?? [] as $processName => $config) { | ||||||
|  |             $processFiles[] = write_process_file($runtimeProcessPath, $processName, "$firm.$name"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     foreach ($projects['process'] ?? [] as $processName => $config) { | ||||||
|  |         $processFiles[] = write_process_file($runtimeProcessPath, $processName, $firm); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function write_process_file($runtimeProcessPath, $processName, $firm): string | ||||||
|  | { | ||||||
|  |     $processParam = $firm ? "plugin.$firm.$processName" : $processName; | ||||||
|  |     $configParam = $firm ? "config('plugin.$firm.process')['$processName']" : "config('process')['$processName']"; | ||||||
|  |     $fileContent = <<<EOF | ||||||
|  | <?php | ||||||
|  | require_once __DIR__ . '/../../vendor/autoload.php'; | ||||||
|  | 
 | ||||||
|  | use Workerman\Worker; | ||||||
|  | use Workerman\Connection\TcpConnection; | ||||||
|  | use Webman\Config; | ||||||
|  | use support\App; | ||||||
|  | 
 | ||||||
|  | ini_set('display_errors', 'on'); | ||||||
|  | error_reporting(E_ALL); | ||||||
|  | 
 | ||||||
|  | if (is_callable('opcache_reset')) { | ||||||
|  |     opcache_reset(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | if (!\$appConfigFile = config_path('app.php')) { | ||||||
|  |     throw new RuntimeException('Config file not found: app.php'); | ||||||
|  | } | ||||||
|  | \$appConfig = require \$appConfigFile; | ||||||
|  | if (\$timezone = \$appConfig['default_timezone'] ?? '') { | ||||||
|  |     date_default_timezone_set(\$timezone); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | App::loadAllConfig(['route']); | ||||||
|  | 
 | ||||||
|  | worker_start('$processParam', $configParam); | ||||||
|  | 
 | ||||||
|  | if (DIRECTORY_SEPARATOR != "/") { | ||||||
|  |     Worker::\$logFile = config('server')['log_file'] ?? Worker::\$logFile; | ||||||
|  |     TcpConnection::\$defaultMaxPackageSize = config('server')['max_package_size'] ?? 10*1024*1024; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Worker::runAll(); | ||||||
|  | 
 | ||||||
|  | EOF; | ||||||
|  |     $processFile = $runtimeProcessPath . DIRECTORY_SEPARATOR . "start_$processParam.php"; | ||||||
|  |     file_put_contents($processFile, $fileContent); | ||||||
|  |     return $processFile; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | if ($monitorConfig = config('process.monitor.constructor')) { | ||||||
|  |     $monitorHandler = config('process.monitor.handler'); | ||||||
|  |     $monitor = new $monitorHandler(...array_values($monitorConfig)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function popen_processes($processFiles) | ||||||
|  | { | ||||||
|  |     $cmd = '"' . PHP_BINARY . '" ' . implode(' ', $processFiles); | ||||||
|  |     $descriptorspec = [STDIN, STDOUT, STDOUT]; | ||||||
|  |     $resource = proc_open($cmd, $descriptorspec, $pipes, null, null, ['bypass_shell' => true]); | ||||||
|  |     if (!$resource) { | ||||||
|  |         exit("Can not execute $cmd\r\n"); | ||||||
|  |     } | ||||||
|  |     return $resource; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | $resource = popen_processes($processFiles); | ||||||
|  | echo "\r\n"; | ||||||
|  | while (1) { | ||||||
|  |     sleep(1); | ||||||
|  |     if (!empty($monitor) && $monitor->checkAllFilesChange()) { | ||||||
|  |         $status = proc_get_status($resource); | ||||||
|  |         $pid = $status['pid']; | ||||||
|  |         shell_exec("taskkill /F /T /PID $pid"); | ||||||
|  |         proc_close($resource); | ||||||
|  |         $resource = popen_processes($processFiles); | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user