Files
Siro/backend/ride/rides/cron_ride_timeout.php
2026-06-16 02:14:35 +03:00

65 lines
3.0 KiB
PHP

<?php
// cron_cleanup_waiting.php
// مسار الاتصال بقاعدة البيانات
require_once __DIR__ . '/../../get_connect.php';
// تسجيل في اللوج لبداية العملية
error_log("⏰ [Cleanup Cron] Started cleaning old waiting rides...");
try {
// المدة المسموحة بالدقائق
$minutesLimit = 15;
// =========================================================
// الخطوة 1: تحديث الحالة في الجدول الرئيسي (الأرشيف)
// =========================================================
// نقوم بتحديث حالة الرحلات التي ستُحذف ليعلم الراكب أنها انتهت (Time Out)
// بدلاً من أن تبقى 'waiting' للأبد في سجلات الراكب
$sqlUpdate = "UPDATE ride
SET status = 'timeout'
WHERE id IN (
SELECT id FROM waitingRides
WHERE created_at < DATE_SUB(NOW(), INTERVAL $minutesLimit MINUTE)
) AND status = 'waiting'"; // نتأكد أننا نحدث ما هو معلق فقط
$stmtUpdate = $con->prepare($sqlUpdate);
$stmtUpdate->execute();
$updatedCount = $stmtUpdate->rowCount();
// =========================================================
// الخطوة 2: الحذف من جدول الانتظار (تنظيف Hot Data)
// =========================================================
$sqlDelete = "DELETE FROM waitingRides
WHERE created_at < DATE_SUB(NOW(), INTERVAL $minutesLimit MINUTE)";
$stmtDelete = $con->prepare($sqlDelete);
$stmtDelete->execute();
$deletedCount = $stmtDelete->rowCount();
// =========================================================
// الخطوة 3: (اختياري) تنظيف الريدز
// =========================================================
// بما أنك تستخدم Redis، المفترض أن تحذفها منه أيضاً.
// لكن بما أن الريدز يعتمد على TTL (Expire) أو سيتم تحديثه عند الطلب القادم،
// فالحذف من الـ MySQL يكفي لأن getRideWaiting سيفحص MySQL ولن يجدها.
// تقرير العملية
if ($deletedCount > 0) {
$msg = "✅ [Cleanup Cron] Success: Timed out $updatedCount rides in Main DB, and Deleted $deletedCount rides from Waiting DB.";
error_log($msg);
echo json_encode(["status" => "success", "message" => $msg]);
} else {
$msg = "💤 [Cleanup Cron] No expired rides found.";
error_log($msg);
echo json_encode(["status" => "success", "message" => "Nothing to clean."]);
}
} catch (PDOException $e) {
$errorMsg = "❌ [Cleanup Cron] Error: " . $e->getMessage();
error_log($errorMsg);
error_log("[cron_ride_timeout] Error: " . $e->getMessage());
echo json_encode(["status" => "failure", "message" => "An internal error occurred."]);
}
?>