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
...
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.

