> /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";