prepare($sqlSelect); $stmtSelect->execute(); $staleRides = $stmtSelect->fetchAll(PDO::FETCH_ASSOC); $updatedCount = 0; if (!empty($staleRides)) { $sqlUpdate = "UPDATE ride SET status = 'timeout', updated_at = NOW() WHERE id = ? AND status = 'waiting'"; $stmtUpdate = $con->prepare($sqlUpdate); // نسخة أرشيفية (best-effort) $con_ride = null; try { $con_ride = Database::get('ride'); } catch (Exception $e) { error_log("[cron_ride_timeout] Secondary ride DB unavailable: " . $e->getMessage()); } $stmtUpdate2 = $con_ride ? $con_ride->prepare( "UPDATE ride SET status = 'timeout', updated_at = NOW() WHERE id = ? AND status = 'waiting'" ) : null; foreach ($staleRides as $ride) { $rideId = $ride['id']; $stmtUpdate->execute([$rideId]); $updatedCount += $stmtUpdate->rowCount(); if ($stmtUpdate2) { try { $stmtUpdate2->execute([$rideId]); } catch (PDOException $e) { error_log("[cron_ride_timeout] Secondary DB update failed for #$rideId: " . $e->getMessage()); } } // 🆕 تنظيف Redis + إعلام أي سائقين ما زالوا يرون هذا الطلب على أنه ملغى sendToLocationServer('cancel_ride', [ 'ride_id' => $rideId, 'driver_id' => 0, 'reason' => 'timeout', ]); } } // ========================================================= // الخطوة 2: تنظيف جدول waitingRides القديم (إن وُجدت صفوف فيه من مسار قديم) // ========================================================= $deletedCount = 0; try { $sqlDelete = "DELETE FROM waitingRides WHERE created_at < DATE_SUB(NOW(), INTERVAL $minutesLimit MINUTE)"; $stmtDelete = $con->prepare($sqlDelete); $stmtDelete->execute(); $deletedCount = $stmtDelete->rowCount(); } catch (PDOException $e) { error_log("[cron_ride_timeout] waitingRides cleanup skipped: " . $e->getMessage()); } if ($updatedCount > 0 || $deletedCount > 0) { $msg = "✅ [Cleanup Cron] Success: Timed out $updatedCount ride(s) in ride table, and cleaned $deletedCount legacy waitingRides row(s)."; 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); echo json_encode(["status" => "failure", "message" => "An internal error occurred."]); } ?>