Update: 2026-07-12 18:53:59
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
<?php
|
||||
/**
|
||||
* transit/cron_sync_members.php
|
||||
* ─────────────────────────────────────────────────────────────────────
|
||||
* يعيد بناء مجموعات transit:org_members:{orgId} في Redis (location server)
|
||||
* من قاعدة البيانات MySQL — للتشغيل اليدوي أو الكرون اليومي.
|
||||
*
|
||||
* يُستخدَم بعد:
|
||||
* • هجرة قاعدة البيانات (ALTER/INSERT جماعي)
|
||||
* • انقطاع Redis (مسح البيانات بعد إعادة التشغيل)
|
||||
* • مزامنة دورية للتأكد من عدم الانزلاق
|
||||
*
|
||||
* crontab مقترح:
|
||||
* 0 3 * * * php /home/intaleq-rides/backend/transit/cron_sync_members.php >> /var/log/transit_sync_members.log 2>&1
|
||||
*/
|
||||
|
||||
require_once __DIR__ . '/../core/bootstrap.php';
|
||||
|
||||
echo "[" . date('Y-m-d H:i:s') . "] Starting transit:org_members sync...\n";
|
||||
|
||||
if (!$redisLocation) {
|
||||
echo "[ERROR] \$redisLocation is not available. Check REDIS_LOCATION_HOST in .env\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
try {
|
||||
$transit_con = Database::get('transit');
|
||||
} catch (Exception $e) {
|
||||
echo "[ERROR] Cannot connect to siroTransitDb: " . $e->getMessage() . "\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// جلب كل العضويات النشطة مع org_id
|
||||
$st = $transit_con->prepare(
|
||||
"SELECT org_id, passenger_id
|
||||
FROM transit_enrollments
|
||||
WHERE status = 'active'
|
||||
AND passenger_id IS NOT NULL"
|
||||
);
|
||||
$st->execute();
|
||||
$rows = $st->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
echo "[INFO] Found " . count($rows) . " active enrollments to sync\n";
|
||||
|
||||
// تجميع per org
|
||||
$byOrg = [];
|
||||
foreach ($rows as $row) {
|
||||
$byOrg[(int)$row['org_id']][] = (string)$row['passenger_id'];
|
||||
}
|
||||
|
||||
$synced = 0;
|
||||
foreach ($byOrg as $orgId => $passengerIds) {
|
||||
$key = "transit:org_members:{$orgId}";
|
||||
|
||||
// بناء كامل: احذف المجموعة القديمة وأعد بناءها بدفعة واحدة
|
||||
$redisLocation->del($key);
|
||||
if (!empty($passengerIds)) {
|
||||
// sAdd يقبل array ابتداءً من phpredis 5.x
|
||||
$redisLocation->sAdd($key, ...$passengerIds);
|
||||
$redisLocation->expire($key, 7 * 86400);
|
||||
}
|
||||
|
||||
echo "[SYNC] org_id={$orgId} → {$key} ({" . count($passengerIds) . "} members)\n";
|
||||
$synced++;
|
||||
}
|
||||
|
||||
echo "[" . date('Y-m-d H:i:s') . "] Done. Synced {$synced} orgs, " . count($rows) . " total enrollments.\n";
|
||||
Reference in New Issue
Block a user