# PHP項目如何接入XXL-Job調度系統
## 一、XXL-Job簡介
XXL-Job是一個輕量級分布式任務調度平臺,由大眾點評員工許雪里(XXL)開源。其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。主要特點包括:
1. **簡單易用**:提供Web管理界面,支持任務動態配置
2. **分布式支持**:支持任務分片,適合分布式集群環境
3. **高可用**:調度中心支持集群部署,任務自動故障轉移
4. **彈性擴容**:執行器可動態增減機器
5. **豐富的路由策略**:包括輪詢、隨機、故障轉移等
## 二、PHP項目接入前準備
### 2.1 環境要求
- PHP 7.0+(推薦7.4+)
- Composer(依賴管理工具)
- XXL-Job Admin 2.3.0+(調度中心)
- 可訪問的MySQL數據庫
### 2.2 安裝XXL-Job調度中心
1. 下載最新Release包:
```bash
wget https://github.com/xuxueli/xxl-job/releases/download/v2.3.1/xxl-job-2.3.1.tar.gz
解壓并初始化數據庫:
# 執行源碼中的SQL腳本
/xxl-job/doc/db/tables_xxl_job.sql
修改配置文件:
# /xxl-job/xxl-job-admin/src/main/resources/application.properties
spring.datasource.url=jdbc:mysql://your-mysql-host:3306/xxl_job?useUnicode=true
spring.datasource.username=your_username
spring.datasource.password=your_password
啟動調度中心:
java -jar xxl-job-admin-2.3.1.jar
推薦使用第三方SDK包:
composer require xxtime/xxl-job-php-client
或手動實現HTTP通信(基本原理):
class XxlJobClient {
private $adminUrl;
public function __construct($adminUrl) {
$this->adminUrl = rtrim($adminUrl, '/');
}
public function callback($data) {
$url = $this->adminUrl . '/api/callback';
return $this->post($url, $data);
}
private function post($url, $data) {
// 實現HTTP POST請求
}
}
創建基礎任務處理器類:
abstract class XxlJobHandler {
abstract public function execute($param);
public function init() {
// 初始化邏輯
}
public function destroy() {
// 清理邏輯
}
}
示例任務實現:
class DemoJobHandler extends XxlJobHandler {
public function execute($param) {
$logId = $param['logId'];
$jobParam = json_decode($param['executorParams'], true);
// 業務邏輯
$result = do_something($jobParam);
return [
'code' => 200,
'msg' => 'success',
'content' => $result
];
}
}
創建路由配置文件(如xxl_job_routes.php):
return [
'demoJobHandler' => DemoJobHandler::class,
'otherJobHandler' => OtherJobHandler::class,
];
創建API端點(如/xxl-job):
// 引入路由配置
$routes = require 'xxl_job_routes.php';
// 獲取請求數據
$data = json_decode(file_get_contents('php://input'), true);
// 驗證Token(可選)
if ($_SERVER['HTTP_XXL_JOB_ACCESS_TOKEN'] != 'your_token') {
http_response_code(403);
exit;
}
// 路由分發
$handler = $routes[$data['executorHandler']] ?? null;
if ($handler) {
$instance = new $handler();
$result = $instance->execute($data);
echo json_encode($result);
} else {
http_response_code(404);
}
class ShardingJobHandler extends XxlJobHandler {
public function execute($param) {
$shardIndex = $param['broadcastIndex'];
$shardTotal = $param['broadcastTotal'];
// 獲取待處理數據
$allItems = get_data_from_db();
// 分片處理
$slice = array_chunk($allItems, ceil(count($allItems)/$shardTotal));
$myItems = $slice[$shardIndex] ?? [];
foreach ($myItems as $item) {
process_item($item);
}
return ['code' => 200];
}
}
class TimeoutJobHandler extends XxlJobHandler {
public function execute($param) {
set_time_limit(60); // 設置PHP超時
// 啟動子進程監控
$start = time();
$timeout = 50; // 預留10秒上報時間
while (true) {
if (time() - $start > $timeout) {
throw new Exception('任務執行超時');
}
// 業務邏輯...
}
}
}
class LoggableJobHandler extends XxlJobHandler {
private $logFile;
public function init() {
$this->logFile = fopen('job.log', 'a');
}
public function execute($param) {
$this->log("Job started: ".date('Y-m-d H:i:s'));
// ...業務邏輯
}
public function destroy() {
fclose($this->logFile);
}
private function log($message) {
fwrite($this->logFile, "[".date('Y-m-d H:i:s')."] ".$message.PHP_EOL);
}
}
通過以上步驟,我們成功實現了PHP項目與XXL-Job調度系統的集成。關鍵點包括:
XXL-Job的分布式特性可以很好地補充PHP在定時任務方面的不足,特別適合以下場景:
隨著業務發展,還可以考慮擴展實現: - 任務依賴管理 - 任務流水線 - 更精細的權限控制 “`
注:實際字數約1800字,可根據需要增減內容。建議: 1. 增加具體版本號時檢查最新版本 2. 根據實際項目調整示例代碼 3. 補充安全相關配置說明
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。