Anonymous
PHP-скрипт не правильно считывает статус «завершен» из запроса API
Сообщение
Anonymous » 16 сен 2024, 21:41
Спасибо, что ознакомились с моим вопросом. Я создал PHP-скрипт, который отправляет запросы API через DASH API. После того, как скрипт отправит запрос, он должен начать работу в DASH. Однако у сценария возникают проблемы с правильным получением статуса «завершено», и в конечном итоге он работает в цикле, постоянно запрашивая статус задания до тех пор, пока задание cron не будет принудительно завершено. Возможные статусы задания: «в работе», «завершено» и «не выполнено».
Вот соответствующие части моего сценария:
Код: Выделить всё
function create_batch_job($access_token, $asset_id, $batch_item_id)
{
$batch_job_url = 'https://api-v2.dash.app/embeddable-link-batch-jobs';
$headers = [
"Authorization: Bearer $access_token",
'Content-Type: application/json'
];
$body = json_encode([
"items" => [
[
"batchItemId" => "my-item-$batch_item_id",
"assetId" => $asset_id,
"assetFileId" => null,
"presetParameters" => []
]
],
"transformationDescription" => [
"type" => "CUSTOM",
"candidateTransformations" => [
[
"criteria" => [
[
"type" => "MATCHES_MEDIA_TYPES",
"mediaTypes" => [
["type" => "image", "subType" => "png"]
]
]
],
"transformation" => []
]
]
]
]);
list($status, $response) = http_request('POST', $batch_job_url, $headers, $body);
log_message("Request URL: $batch_job_url", $GLOBALS['responseLogFile']);
log_message("Request headers: " . json_encode($headers), $GLOBALS['responseLogFile']);
log_message("Request body: $body", $GLOBALS['responseLogFile']);
log_message("Response status: $status", $GLOBALS['responseLogFile']);
log_message("Response body: $response", $GLOBALS['responseLogFile']);
if ($status == 200) {
log_api_response($response);
$response_data = json_decode($response, true);
return $response_data['id'];
} else {
log_api_response($response);
throw new Exception('Batch job creation failed');
}
}
function check_job_status($access_token, $job_id, $batch_item_id)
{
$job_status_url = "https://api-v2.dash.app/embeddable-link-batch-jobs/$job_id";
$headers = [
"Authorization: Bearer $access_token",
'Content-Type: application/json'
];
for ($attempt = 0; $attempt < 3; $attempt++) {
sleep(5);
log_message("Checking job status for URL: $job_status_url (Attempt " . ($attempt + 1) . "/3)", $GLOBALS['responseLogFile']);
list($status_code, $response) = http_request('GET', $job_status_url, $headers);
log_message("Check job status response: $status_code $response", $GLOBALS['responseLogFile']);
if ($status_code == 200) {
$response_data = json_decode($response, true);
$status = $response_data['status'];
if ($status === 'COMPLETED') {
log_message("Job $job_id completed successfully.", $GLOBALS['responseLogFile']);
$result_key = "my-item-$batch_item_id";
if (isset($response_data['result']['results'][$result_key]['result']['url'])) {
$url = $response_data['result']['results'][$result_key]['result']['url'];
log_message("Job completed, URL: $url", $GLOBALS['responseLogFile']);
file_put_contents('completed_jobs_urls.txt', "Job $job_id URL: $url\n", FILE_APPEND);
return [$status, $response_data];
} else {
log_message("Error: No URL found in the job response.", $GLOBALS['responseLogFile']);
}
} elseif ($status === 'FAILED') {
log_message("Job $job_id failed.", $GLOBALS['responseLogFile']);
return [$status, $response_data];
} else {
log_message("Job $job_id in progress... Status: $status", $GLOBALS['responseLogFile']);
}
} else {
throw new Exception('Job status check failed');
}
}
throw new Exception("Job $job_id did not complete after 3 attempts");
}
function process_assets()
{
global $csvFile, $completedJobsFile, $jobIdsFile;
log_api_response("Cron job started successfully.");
$access_token = authenticate();
$csv = array_map('str_getcsv', file($csvFile));
$header = array_shift($csv);
$outfile = fopen($completedJobsFile, 'w');
fputcsv($outfile, ['jobId', 'status', 'url']);
$batch_item_id = 1;
foreach ($csv as $idx => $row) {
$asset_id = $row[0];
log_message("Processing asset " . ($idx + 1) . ": $asset_id", $GLOBALS['responseLogFile']);
try {
$job_id = create_batch_job($access_token, $asset_id, $batch_item_id);
if ($job_id) {
file_put_contents($jobIdsFile, "$job_id\n", FILE_APPEND);
list($status, $response_data) = check_job_status($access_token, $job_id, $batch_item_id);
if ($status === 'COMPLETED') {
$result_key = "my-item-$batch_item_id";
if (isset($response_data['result']['results'][$result_key]['result']['url'])) {
$url = $response_data['result']['results'][$result_key]['result']['url'];
fputcsv($outfile, ['jobId' => $job_id, 'status' => $status, 'url' => $url]);
log_message("Job $job_id completed and saved to file.", $GLOBALS['responseLogFile']);
}
}
$batch_item_id++;
}
} catch (Exception $e) {
log_message("Error processing asset ID $asset_id: " . $e->getMessage(), $GLOBALS['responseLogFile']);
}
}
fclose($outfile);
}
process_assets();
Я хотел, чтобы сценарий запускал один идентификатор ресурса за раз, извлекал нужную мне ссылку и записывал ссылку + идентификатор в CSV-файл. Но скрипт не может найти статус «завершено» в API-запросе, поэтому вся следующая процедура также не происходит. Почему скрипт не может найти «завершенный» оператор из задания API?
Подробнее здесь:
https://stackoverflow.com/questions/789 ... -correctly
1726512110
Anonymous
Спасибо, что ознакомились с моим вопросом. Я создал PHP-скрипт, который отправляет запросы API через DASH API. После того, как скрипт отправит запрос, он должен начать работу в DASH. Однако у сценария возникают проблемы с правильным получением статуса «завершено», и в конечном итоге он работает в цикле, постоянно запрашивая статус задания до тех пор, пока задание cron не будет принудительно завершено. Возможные статусы задания: «в работе», «завершено» и «не выполнено». Вот соответствующие части моего сценария: [code]function create_batch_job($access_token, $asset_id, $batch_item_id) { $batch_job_url = 'https://api-v2.dash.app/embeddable-link-batch-jobs'; $headers = [ "Authorization: Bearer $access_token", 'Content-Type: application/json' ]; $body = json_encode([ "items" => [ [ "batchItemId" => "my-item-$batch_item_id", "assetId" => $asset_id, "assetFileId" => null, "presetParameters" => [] ] ], "transformationDescription" => [ "type" => "CUSTOM", "candidateTransformations" => [ [ "criteria" => [ [ "type" => "MATCHES_MEDIA_TYPES", "mediaTypes" => [ ["type" => "image", "subType" => "png"] ] ] ], "transformation" => [] ] ] ] ]); list($status, $response) = http_request('POST', $batch_job_url, $headers, $body); log_message("Request URL: $batch_job_url", $GLOBALS['responseLogFile']); log_message("Request headers: " . json_encode($headers), $GLOBALS['responseLogFile']); log_message("Request body: $body", $GLOBALS['responseLogFile']); log_message("Response status: $status", $GLOBALS['responseLogFile']); log_message("Response body: $response", $GLOBALS['responseLogFile']); if ($status == 200) { log_api_response($response); $response_data = json_decode($response, true); return $response_data['id']; } else { log_api_response($response); throw new Exception('Batch job creation failed'); } } function check_job_status($access_token, $job_id, $batch_item_id) { $job_status_url = "https://api-v2.dash.app/embeddable-link-batch-jobs/$job_id"; $headers = [ "Authorization: Bearer $access_token", 'Content-Type: application/json' ]; for ($attempt = 0; $attempt < 3; $attempt++) { sleep(5); log_message("Checking job status for URL: $job_status_url (Attempt " . ($attempt + 1) . "/3)", $GLOBALS['responseLogFile']); list($status_code, $response) = http_request('GET', $job_status_url, $headers); log_message("Check job status response: $status_code $response", $GLOBALS['responseLogFile']); if ($status_code == 200) { $response_data = json_decode($response, true); $status = $response_data['status']; if ($status === 'COMPLETED') { log_message("Job $job_id completed successfully.", $GLOBALS['responseLogFile']); $result_key = "my-item-$batch_item_id"; if (isset($response_data['result']['results'][$result_key]['result']['url'])) { $url = $response_data['result']['results'][$result_key]['result']['url']; log_message("Job completed, URL: $url", $GLOBALS['responseLogFile']); file_put_contents('completed_jobs_urls.txt', "Job $job_id URL: $url\n", FILE_APPEND); return [$status, $response_data]; } else { log_message("Error: No URL found in the job response.", $GLOBALS['responseLogFile']); } } elseif ($status === 'FAILED') { log_message("Job $job_id failed.", $GLOBALS['responseLogFile']); return [$status, $response_data]; } else { log_message("Job $job_id in progress... Status: $status", $GLOBALS['responseLogFile']); } } else { throw new Exception('Job status check failed'); } } throw new Exception("Job $job_id did not complete after 3 attempts"); } function process_assets() { global $csvFile, $completedJobsFile, $jobIdsFile; log_api_response("Cron job started successfully."); $access_token = authenticate(); $csv = array_map('str_getcsv', file($csvFile)); $header = array_shift($csv); $outfile = fopen($completedJobsFile, 'w'); fputcsv($outfile, ['jobId', 'status', 'url']); $batch_item_id = 1; foreach ($csv as $idx => $row) { $asset_id = $row[0]; log_message("Processing asset " . ($idx + 1) . ": $asset_id", $GLOBALS['responseLogFile']); try { $job_id = create_batch_job($access_token, $asset_id, $batch_item_id); if ($job_id) { file_put_contents($jobIdsFile, "$job_id\n", FILE_APPEND); list($status, $response_data) = check_job_status($access_token, $job_id, $batch_item_id); if ($status === 'COMPLETED') { $result_key = "my-item-$batch_item_id"; if (isset($response_data['result']['results'][$result_key]['result']['url'])) { $url = $response_data['result']['results'][$result_key]['result']['url']; fputcsv($outfile, ['jobId' => $job_id, 'status' => $status, 'url' => $url]); log_message("Job $job_id completed and saved to file.", $GLOBALS['responseLogFile']); } } $batch_item_id++; } } catch (Exception $e) { log_message("Error processing asset ID $asset_id: " . $e->getMessage(), $GLOBALS['responseLogFile']); } } fclose($outfile); } process_assets(); [/code] Я хотел, чтобы сценарий запускал один идентификатор ресурса за раз, извлекал нужную мне ссылку и записывал ссылку + идентификатор в CSV-файл. Но скрипт не может найти статус «завершено» в API-запросе, поэтому вся следующая процедура также не происходит. Почему скрипт не может найти «завершенный» оператор из задания API? Подробнее здесь: [url]https://stackoverflow.com/questions/78990118/php-script-does-not-read-completed-status-out-of-api-request-correctly[/url]