Files
chat/backend/database/run_short_drama_worker.php
T
2026-08-05 15:56:08 +08:00

53 lines
1.6 KiB
PHP

<?php
/**
* Docker 内短剧接力进程。
*
* H3 的下一镜头必须等上一镜头落盘并提取尾帧后才能提交,因此由这个进程
* 持续触发同一套状态接口。页面关闭后,长视频仍会按顺序继续生成。
*/
require __DIR__ . '/../vendor/autoload.php';
$app = new think\App();
$app->initialize();
use app\model\VideoProject;
use app\service\JwtService;
set_time_limit(0);
$internalBaseUrl = rtrim((string) (getenv('SHORT_DRAMA_INTERNAL_URL') ?: 'http://web'), '/');
if (!preg_match('#^https?://#i', $internalBaseUrl)) {
fwrite(STDERR, "[short-drama-worker] SHORT_DRAMA_INTERNAL_URL 必须使用 http 或 https\n");
exit(1);
}
while (true) {
try {
$projects = VideoProject::where('status', 'generating')
->order('updated_at')
->limit(30)
->select();
foreach ($projects as $project) {
$token = JwtService::generateToken(['user_id' => (int) $project->user_id]);
$url = $internalBaseUrl . '/api/short-drama/projects/' . (int) $project->id . '/status';
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_HTTPGET => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 25,
CURLOPT_CONNECTTIMEOUT => 3,
]);
curl_exec($ch);
curl_close($ch);
}
} catch (Throwable $error) {
fwrite(STDERR, '[short-drama-worker] ' . $error->getMessage() . "\n");
}
sleep(8);
}