slogan3

Help me een PHP-script te maken voor bulkgegevensverwerking van een externe API

description

Door deze prompt te gebruiken, kun je je gegevensverwerking stroomlijnen, zodat je PHP-toepassing grote datasets efficiënt kan verwerken terwijl je fouten minimaliseert en prestaties optimaliseert.

prompt

try_prompt

Ik heb hulp nodig bij het ontwikkelen van een PHP-script dat efficiënt bulkgegevens verwerkt van een externe API. Leg uit hoe je verbinding maakt met de API, gegevens ophaalt, paginer ... more
generate_helper
disclaimerOnPageApi image_legal_disclaimer...

ai_answers

provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een overzicht en een voorbeeld van hoe je een PHP-script kunt ontwikkelen voor het efficiënt ophalen, verwerken en opslaan van bulkgegevens van een externe API, inclusief beste praktijken: 1. Verbinding maken met de API Gebruik cURL of PHP's ingebouwde HTTP-client (bijvoorbeeld Guzzle) om een betrouwbare verbinding te maken. Zorg voor authenticatie indien nodig (API-sleutels, tokens). 2. Gegevens ophalen Gebruik API-endpoints om de gegevens te verkrijgen. Controleer de documentatie voor de juiste parameters. 3. Paginering implementeren Veel API's gebruiken paginering via parameters zoals `page`, `limit`, of via `next`-links in de response. Implementeer een lus om alle pagina's op te halen totdat alle gegevens verwerkt zijn. 4. Gegevens opslaan in de database Gebruik PDO voor veilige database-interacties (prepared statements). Zorg dat de databaseverbinding correct is ingesteld. 5. Beste praktijken - Foutafhandeling: Controleer API-responses, cURL-fouten, databasefouten en log deze consistent. - Logging: Gebruik bijvoorbeeld Monolog of eenvoudige logbestanden om activiteiten bij te houden. - Prestatie: Batch-inserties, transacties en minimaliseer het aantal database-verbindingen. Hieronder een vereenvoudigd voorbeeld: ```php <?php // Configuratie $apiUrl = 'https://api.example.com/data'; $apiToken = 'JOUW_API_TOKEN'; $dbHost = 'localhost'; $dbName = 'mijn_database'; $dbUser = 'gebruikersnaam'; $dbPass = 'wachtwoord'; // Database connectie try { $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("Database verbinding mislukt: " . $e->getMessage()); } // Functie om API data op te halen function fetchApiData($url, $token, $page = 1) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url . '?page=' . $page); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Authorization: Bearer ' . $token, 'Accept: application/json' ]); $response = curl_exec($ch); if (curl_errno($ch)) { error_log('cURL fout: ' . curl_error($ch)); return false; } $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($statusCode !== 200) { error_log('API fout: Statuscode ' . $statusCode); return false; } return json_decode($response, true); } // Data ophalen en opslaan $page = 1; $volgendePagina = true; while ($volgendePagina) { $data = fetchApiData($apiUrl, $apiToken, $page); if (!$data || empty($data['results'])) { break; // Geen data meer } // Batch insertie try { $pdo->beginTransaction(); $stmt = $pdo->prepare("INSERT INTO mijn_tabel (veld1, veld2, veld3) VALUES (?, ?, ?)"); foreach ($data['results'] as $item) { // Pas aan aan je data structuur $stmt->execute([$item['veld1'], $item['veld2'], $item['veld3']]); } $pdo->commit(); } catch (Exception $e) { $pdo->rollBack(); error_log('Database fout: ' . $e->getMessage()); break; } // Controleer of er een volgende pagina is if (isset($data['next']) && $data['next']) { $page++; } else { $volgendePagina = false; } } ?> ``` **Samenvatting van best practices:** - Gebruik PDO met prepared statements voor veilige database-interacties. - Implementeer foutafhandeling en logging voor overzicht en debugging. - Batch-verwerking en transacties verbeteren de prestaties. - Controleer API-responses en paginering-parameters goed. - Maak gebruik van caching indien mogelijk om overbodige API-aanroepen te minimaliseren. Wil je dat ik dit script verder aanpas voor jouw specifieke API of database-schema?
provider: deepseek
model: deepseek-chat
Hier is een uitgebreide uitleg voor het ontwikkelen van een efficiënt PHP-script voor bulkgegevensverwerking: ## 1. API-verbinding en configuratie ```php <?php class BulkDataProcessor { private $apiBaseUrl; private $apiKey; private $db; private $logger; public function __construct($apiConfig, $dbConfig) { $this->apiBaseUrl = $apiConfig['base_url']; $this->apiKey = $apiConfig['api_key']; $this->setupDatabase($dbConfig); $this->setupLogger(); } private function setupDatabase($config) { try { $this->db = new PDO( "mysql:host={$config['host']};dbname={$config['dbname']};charset=utf8mb4", $config['username'], $config['password'], [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4" ] ); } catch (PDOException $e) { throw new Exception("Databaseverbinding mislukt: " . $e->getMessage()); } } } ``` ## 2. API-gegevens ophalen met paginering ```php public function fetchAllData() { $page = 1; $allData = []; do { try { $data = $this->fetchPage($page); if (empty($data['results'])) { break; } $allData = array_merge($allData, $data['results']); $this->logger->info("Pagina $page opgehaald: " . count($data['results']) . " items"); // Controleer of er meer pagina's zijn if (!$this->hasNextPage($data)) { break; } $page++; // Rate limiting respecteren usleep(200000); // 200ms pauze } catch (Exception $e) { $this->logger->error("Fout bij ophalen pagina $page: " . $e->getMessage()); break; } } while (true); return $allData; } private function fetchPage($page) { $url = $this->apiBaseUrl . "?page=" . $page . "&limit=100"; $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer " . $this->apiKey, "Content-Type: application/json", "User-Agent: BulkDataProcessor/1.0" ], CURLOPT_TIMEOUT => 30, CURLOPT_CONNECTTIMEOUT => 10 ]); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $error = curl_error($ch); curl_close($ch); if ($httpCode !== 200) { throw new Exception("API-fout: HTTP $httpCode - $error"); } $data = json_decode($response, true); if (json_last_error() !== JSON_ERROR_NONE) { throw new Exception("Ongeldige JSON-response: " . json_last_error_msg()); } return $data; } ``` ## 3. Efficiënte database-opslag ```php public function saveBulkData($data) { if (empty($data)) { $this->logger->warning("Geen data om op te slaan"); return; } $this->db->beginTransaction(); try { $stmt = $this->db->prepare(" INSERT INTO api_data (external_id, name, email, created_at, updated_at) VALUES (:external_id, :name, :email, NOW(), NOW()) ON DUPLICATE KEY UPDATE name = VALUES(name), email = VALUES(email), updated_at = NOW() "); $batchSize = 100; $processed = 0; foreach ($data as $item) { $stmt->execute([ ':external_id' => $item['id'], ':name' => $item['name'] ?? null, ':email' => $item['email'] ?? null ]); $processed++; // Batch commits voor betere prestaties if ($processed % $batchSize === 0) { $this->db->commit(); $this->db->beginTransaction(); $this->logger->info("Batch van $batchSize records verwerkt"); } } $this->db->commit(); $this->logger->info("Totaal $processed records succesvol opgeslagen"); } catch (Exception $e) { $this->db->rollBack(); $this->logger->error("Transactie mislukt: " . $e->getMessage()); throw $e; } } ``` ## 4. Logging implementatie ```php private function setupLogger() { $logFile = __DIR__ . '/logs/bulk_processor_' . date('Y-m-d') . '.log'; // Eenvoudige logger (gebruik Monolog voor productie) $this->logger = new class($logFile) { private $logFile; public function __construct($logFile) { $this->logFile = $logFile; // Zorg dat log directory bestaat $logDir = dirname($logFile); if (!is_dir($logDir)) { mkdir($logDir, 0755, true); } } public function log($level, $message) { $timestamp = date('Y-m-d H:i:s'); $logEntry = "[$timestamp] [$level] $message" . PHP_EOL; file_put_contents($this->logFile, $logEntry, FILE_APPEND | LOCK_EX); } public function info($message) { $this->log('INFO', $message); } public function error($message) { $this->log('ERROR', $message); } public function warning($message) { $this->log('WARNING', $message); } }; } ``` ## 5. Gebruik en configuratie ```php // Configuratie $apiConfig = [ 'base_url' => 'https://api.voorbeeld.com/data', 'api_key' => 'jouw_api_sleutel' ]; $dbConfig = [ 'host' => 'localhost', 'dbname' => 'jouw_database', 'username' => 'gebruiker', 'password' => 'wachtwoord' ]; // Uitvoering try { $processor = new BulkDataProcessor($apiConfig, $dbConfig); // Haal alle data op $data = $processor->fetchAllData(); // Sla data op $processor->saveBulkData($data); echo "Bulkverwerking succesvol voltooid!" . PHP_EOL; } catch (Exception $e) { echo "Fout tijdens verwerking: " . $e->getMessage() . PHP_EOL; exit(1); } ``` ## Beste praktijken: ### Foutafhandeling: - Gebruik try-catch blokken voor API-aanroepen - Implementeer retry-logica voor tijdelijke fouten - Valideer alle inkomende data ### Prestatieoptimalisatie: - Gebruik prepared statements - Werk in batches (100-1000 records per transactie) - Implementeer rate limiting voor API-aanroepen - Gebruik `ON DUPLICATE KEY UPDATE` voor upserts ### Monitoring: - Log verwerkingsstatistieken - Track verwerkingstijden - Monitor geheugengebruik ### Beveiliging: - Valideer en sanitize alle input - Gebruik HTTPS voor API-communicatie - Sla API-sleutels veilig op (bijv. in environment variables) Dit script biedt een robuuste basis voor bulkgegevensverwerking met aandacht voor schaalbaarheid, foutafhandeling en prestaties.