Update taskExecuter.php

This commit is contained in:
Roman Schenk 2026-05-17 16:37:27 +02:00
parent 5011f714e1
commit 59b1a95e02
1 changed files with 56 additions and 16 deletions

View File

@ -5,7 +5,7 @@ include "emailSender.php";
$maxExecutionTime = 120; $maxExecutionTime = 120;
$taskDir = __DIR__ . '/tasks'; $taskDir = __DIR__ . '/tasks';
$downloadDir = __DIR__ . '/download'; $downloadDir = __DIR__ . '/download';
$downloadUrlBase = 'https://zefix.silias.ch/download'; $downloadUrlBase = 'download';
$minTaskOldness = 10; $minTaskOldness = 10;
$latesEndTime = time() + $maxExecutionTime; $latesEndTime = time() + $maxExecutionTime;
@ -37,19 +37,26 @@ function doRequest($data, $filename, $username, $password)
if (!is_array($responseObject)) { if (!is_array($responseObject)) {
logMsg("ERROR: API response is not valid JSON"); logMsg("ERROR: API response is not valid JSON");
logMsg("Raw response: " . htmlspecialchars($response)); logMsg("Raw response: " . htmlspecialchars($response));
return ['status' => 'error']; return ['status' => 'error', 'writtenRows' => 0];
} }
if (array_key_exists("error", $responseObject)) { if (array_key_exists("error", $responseObject)) {
$errorCode = $responseObject['error']['code'] ?? '';
if ($errorCode === 'API.ZFR.SEARCH.NORESULT') {
logMsg("API returned no results. Treating as empty search result.");
return ['status' => 'empty', 'writtenRows' => 0];
}
logMsg("ERROR: API returned error"); logMsg("ERROR: API returned error");
logMsg("API error response: " . htmlspecialchars(json_encode($responseObject))); logMsg("API error response: " . htmlspecialchars(json_encode($responseObject)));
return ['status' => 'error']; return ['status' => 'error', 'writtenRows' => 0];
} }
if (!isset($responseObject['list']) || !is_array($responseObject['list'])) { if (!isset($responseObject['list']) || !is_array($responseObject['list'])) {
logMsg("ERROR: API response has no valid list"); logMsg("ERROR: API response has no valid list");
logMsg("API response: " . htmlspecialchars(json_encode($responseObject))); logMsg("API response: " . htmlspecialchars(json_encode($responseObject)));
return ['status' => 'error']; return ['status' => 'error', 'writtenRows' => 0];
} }
$companies = $responseObject['list']; $companies = $responseObject['list'];
@ -57,7 +64,7 @@ function doRequest($data, $filename, $username, $password)
if (count($companies) === 0) { if (count($companies) === 0) {
logMsg("No companies found in this request."); logMsg("No companies found in this request.");
return ['status' => 'empty']; return ['status' => 'empty', 'writtenRows' => 0];
} }
$isNewFile = !file_exists($filename); $isNewFile = !file_exists($filename);
@ -65,7 +72,7 @@ function doRequest($data, $filename, $username, $password)
if (!$file) { if (!$file) {
logMsg("ERROR: Could not open CSV file for writing"); logMsg("ERROR: Could not open CSV file for writing");
return ['status' => 'error']; return ['status' => 'error', 'writtenRows' => 0];
} }
if ($isNewFile) { if ($isNewFile) {
@ -128,13 +135,13 @@ function doRequest($data, $filename, $username, $password)
fclose($file); fclose($file);
logMsg("Rows written to CSV: " . $writtenRows); logMsg("Rows written to CSV in this request: " . $writtenRows);
logMsg("CSV exists after writing: " . (file_exists($filename) ? "YES" : "NO")); logMsg("CSV exists after writing: " . (file_exists($filename) ? "YES" : "NO"));
logMsg("CSV size after writing: " . (file_exists($filename) ? filesize($filename) : 0) . " bytes"); logMsg("CSV size after writing: " . (file_exists($filename) ? filesize($filename) : 0) . " bytes");
if ($writtenRows === 0) { if ($writtenRows === 0) {
logMsg("No rows could be written although search returned companies."); logMsg("ERROR: Search returned companies, but no rows could be written.");
return ['status' => 'error']; return ['status' => 'error', 'writtenRows' => 0];
} }
if (!empty($responseObject['hasMoreResults'])) { if (!empty($responseObject['hasMoreResults'])) {
@ -143,12 +150,17 @@ function doRequest($data, $filename, $username, $password)
return [ return [
'status' => 'more', 'status' => 'more',
'nextOffset' => $nextOffset 'nextOffset' => $nextOffset,
'writtenRows' => $writtenRows
]; ];
} }
logMsg("No more results. Request completed."); logMsg("No more results. Request completed.");
return ['status' => 'done'];
return [
'status' => 'done',
'writtenRows' => $writtenRows
];
} }
while ($latesEndTime - time() > 30) { while ($latesEndTime - time() > 30) {
@ -207,40 +219,68 @@ while ($latesEndTime - time() > 30) {
continue; continue;
} }
if (!isset($task['stats']) || !is_array($task['stats'])) {
$task['stats'] = [
'totalWrittenRows' => 0,
'emptyRequests' => 0,
'completedRequests' => 0,
'failedRequests' => 0
];
}
$csvFile = str_replace(".json", ".csv", $downloadDir . '/' . $taskFileName); $csvFile = str_replace(".json", ".csv", $downloadDir . '/' . $taskFileName);
$csvUrl = $downloadUrlBase . '/' . basename($csvFile); $csvUrl = $downloadUrlBase . '/' . basename($csvFile);
if (count($task['requests']) > 0) { if (count($task['requests']) > 0) {
$result = doRequest($task['requests'][0], $csvFile, $username, $password); $result = doRequest($task['requests'][0], $csvFile, $username, $password);
if (isset($result['writtenRows'])) {
$task['stats']['totalWrittenRows'] += $result['writtenRows'];
}
if ($result['status'] === 'more') { if ($result['status'] === 'more') {
$task['requests'][0]['offset'] = $result['nextOffset']; $task['requests'][0]['offset'] = $result['nextOffset'];
logMsg("Request updated with next offset"); logMsg("Request updated with next offset");
} elseif ($result['status'] === 'done') { } elseif ($result['status'] === 'done') {
$task['stats']['completedRequests']++;
array_shift($task['requests']); array_shift($task['requests']);
logMsg("Request completed and removed from task"); logMsg("Request completed and removed from task");
} elseif ($result['status'] === 'empty') { } elseif ($result['status'] === 'empty') {
$task['noResults'] = true; $task['stats']['emptyRequests']++;
$task['stats']['completedRequests']++;
array_shift($task['requests']); array_shift($task['requests']);
logMsg("Request had no results and was removed from task"); logMsg("Request had no results and was removed from task");
} else { } else {
$task['stats']['failedRequests']++;
file_put_contents($taskFilePath, json_encode($task));
logMsg("ERROR: Request failed. Task will NOT be deleted and email will NOT be sent."); logMsg("ERROR: Request failed. Task will NOT be deleted and email will NOT be sent.");
break; break;
} }
file_put_contents($taskFilePath, json_encode($task)); file_put_contents($taskFilePath, json_encode($task));
logMsg("Task file updated."); logMsg("Task file updated.");
logMsg("Total written rows so far: " . $task['stats']['totalWrittenRows']);
logMsg("Empty requests so far: " . $task['stats']['emptyRequests']);
logMsg("Completed requests so far: " . $task['stats']['completedRequests']);
continue; continue;
} }
logMsg("All requests completed. Preparing email."); logMsg("All requests completed. Preparing email.");
logMsg("Total written rows: " . ($task['stats']['totalWrittenRows'] ?? 0));
logMsg("Empty requests: " . ($task['stats']['emptyRequests'] ?? 0));
logMsg("Completed requests: " . ($task['stats']['completedRequests'] ?? 0));
logMsg("Failed requests: " . ($task['stats']['failedRequests'] ?? 0));
logMsg("Final CSV path: " . $csvFile); logMsg("Final CSV path: " . $csvFile);
logMsg("Final CSV URL: " . $csvUrl); logMsg("Final CSV URL: " . $csvUrl);
logMsg("CSV exists before email: " . (file_exists($csvFile) ? "YES" : "NO")); logMsg("CSV exists before email: " . (file_exists($csvFile) ? "YES" : "NO"));
logMsg("CSV size before email: " . (file_exists($csvFile) ? filesize($csvFile) : 0) . " bytes"); logMsg("CSV size before email: " . (file_exists($csvFile) ? filesize($csvFile) : 0) . " bytes");
if (!empty($task['noResults']) && (!file_exists($csvFile) || filesize($csvFile) === 0)) { $totalWrittenRows = $task['stats']['totalWrittenRows'] ?? 0;
logMsg("No results found. Sending no-results email.");
if ($totalWrittenRows === 0) {
logMsg("All requests completed but no rows were exported. Sending no-results email.");
sendEmail( sendEmail(
$task['email'], $task['email'],
@ -254,11 +294,11 @@ while ($latesEndTime - time() > 30) {
} }
if (!file_exists($csvFile) || filesize($csvFile) === 0) { if (!file_exists($csvFile) || filesize($csvFile) === 0) {
logMsg("ERROR: CSV file missing or empty. Email will NOT be sent."); logMsg("ERROR: CSV file missing or empty, although rows were counted. Email will NOT be sent.");
break; break;
} }
logMsg("CSV exists. Sending email with download link."); logMsg("CSV exists and contains exported rows. Sending email with download link.");
sendEmail( sendEmail(
$task['email'], $task['email'],