Ontwikkel een PHP CLI-tool voor batchverwerking
description
Met deze prompt kun je een krachtige PHP CLI-tool ontwikkelen die complexe batchverwerkingstaken efficiënt uitvoert. Dit lost het probleem op om herhalende taken te automatiseren zonder een webinterface, en biedt flexibiliteit via CLI argumenten. Het is een praktische oplossing voor ontwikkelaars die automatisering willen integreren in PHP-projecten buiten een browseromgeving.
prompt
Help me bij het ontwikkelen van een PHP command-line interface (CLI) tool die batchverwerking van bestanden of data uitvoert. Beschrijf hoe ik argumenten kan verwerken, foutafhandeling kan implementeren en de tool kan optimaliseren vo ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een overzicht van hoe je een PHP CLI-tool kunt ontwikkelen voor batchverwerking van CSV-bestanden, inclusief argumentenverwerking, foutafhandeling en optimalisaties.
1. Argumenten verwerken
Gebruik `$argv` of een library zoals getopt() voor meer robuuste argumentverwerking. Bijvoorbeeld:
```php
<?php
$options = getopt("", ["verbose", "output:"]);
$verbose = isset($options['verbose']);
$outputFile = $options['output'] ?? 'result.csv';
$bestanden = ['data1.csv', 'data2.csv', 'data3.csv'];
```
2. Foutafhandeling
Controleer of bestanden bestaan en leesbaar zijn, en geef duidelijke foutmeldingen:
```php
foreach ($bestanden as $file) {
if (!file_exists($file)) {
fwrite(STDERR, "Fout: Bestanden {$file} niet gevonden.\n");
exit(1);
}
if (!is_readable($file)) {
fwrite(STDERR, "Fout: Bestanden {$file} is niet leesbaar.\n");
exit(1);
}
}
```
3. CSV-bestanden samenvoegen en dubbele rijen verwijderen
Gebruik een array om unieke rijen te bewaren, bijvoorbeeld met een hash:
```php
$alleRijen = [];
$headers = null;
foreach ($bestanden as $file) {
if ($verbose) echo "Verwerken {$file}...\n";
if (($handle = fopen($file, 'r')) !== false) {
$fileHeaders = fgetcsv($handle);
if (!$headers) {
$headers = $fileHeaders;
} elseif ($headers !== $fileHeaders) {
fwrite(STDERR, "Fout: Headers komen niet overeen in {$file}.\n");
exit(1);
}
while (($row = fgetcsv($handle)) !== false) {
$hash = md5(implode(',', $row));
$alleRijen[$hash] = $row;
}
fclose($handle);
} else {
fwrite(STDERR, "Fout: Kan {$file} niet openen.\n");
exit(1);
}
}
```
4. Resultaat wegschrijven
Schrijf alle unieke rijen naar het outputbestand:
```php
if (($handle = fopen($outputFile, 'w')) === false) {
fwrite(STDERR, "Fout: Kan outputbestand {$outputFile} niet openen.\n");
exit(1);
}
fputcsv($handle, $headers);
foreach ($alleRijen as $row) {
fputcsv($handle, $row);
}
fclose($handle);
if ($verbose) echo "Batchverwerking voltooid. Resultaat opgeslagen in {$outputFile}.\n";
```
5. Optimalisaties
- Lees bestanden in blokken of gebruik generatoren om geheugen te sparen bij grote bestanden.
- Gebruik hashes om dubbele rijen snel te verwijderen.
- Voeg logging toe voor betere foutopsporing en debugging.
- Gebruik command-line libraries zoals Symfony Console voor complexere CLI-argumenten.
Samenvatting:
- Verwerk argumenten via getopt() of een library.
- Controleer bestanden op bestaan en leesbaarheid.
- Lees CSV-bestanden, controleer headers, en voeg rijen toe aan een array met unieke hash.
- Schrijf de samengevoegde data zonder duplicaten naar de output file.
- Optimaliseer door gebruik van generatoren, hashing en goede foutafhandeling.
Wil je dat ik een volledig voorbeeldscript voor je maak?
provider: deepseek
model: deepseek-chat
Hier is een complete handleiding voor het ontwikkelen van je PHP CLI-tool:
## Basisstructuur CLI-tool
```php
#!/usr/bin/env php
<?php
class BatchProcessor {
private $verbose = false;
private $outputFile = 'output.csv';
private $processedFiles = [];
public function run(array $argv) {
try {
$this->parseArguments($argv);
$this->validateInput();
$this->processFiles();
$this->logSuccess("Verwerking voltooid. Output: " . $this->outputFile);
} catch (Exception $e) {
$this->logError("Fout: " . $e->getMessage());
exit(1);
}
}
private function parseArguments(array $argv) {
array_shift($argv); // verwijder scriptnaam
foreach ($argv as $arg) {
if ($arg === '--verbose') {
$this->verbose = true;
$this->logInfo("Verbose modus geactiveerd");
} elseif (strpos($arg, '--output=') === 0) {
$this->outputFile = substr($arg, 9);
$this->logInfo("Output bestand: " . $this->outputFile);
}
}
}
}
```
## Bestandsverwerking en optimalisatie
```php
private function processFiles() {
$files = ['data1.csv', 'data2.csv', 'data3.csv'];
$uniqueRows = [];
$totalProcessed = 0;
foreach ($files as $file) {
if (!file_exists($file)) {
throw new Exception("Bestand niet gevonden: " . $file);
}
$this->logInfo("Verwerken: " . $file);
$handle = fopen($file, 'r');
if ($handle === false) {
throw new Exception("Kan bestand niet openen: " . $file);
}
// Skip header bij eerste bestand
$isFirstFile = !in_array($file, $this->processedFiles);
if ($isFirstFile) {
$header = fgetcsv($handle);
} else {
fgetcsv($handle); // skip header voor volgende bestanden
}
while (($row = fgetcsv($handle)) !== false) {
$rowKey = md5(implode('', $row)); // Creëer unieke hash voor rij
if (!isset($uniqueRows[$rowKey])) {
$uniqueRows[$rowKey] = $row;
$totalProcessed++;
}
}
fclose($handle);
$this->processedFiles[] = $file;
}
$this->writeOutput($uniqueRows, $header ?? []);
$this->logInfo("Unieke rijen verwerkt: " . $totalProcessed);
}
```
## Geoptimaliseerde output schrijven
```php
private function writeOutput(array $uniqueRows, array $header) {
$outputHandle = fopen($this->outputFile, 'w');
if ($outputHandle === false) {
throw new Exception("Kan output bestand niet aanmaken: " . $this->outputFile);
}
// Schrijf header
if (!empty($header)) {
fputcsv($outputHandle, $header);
}
// Schrijf unieke rijen met geheugenoptimalisatie
$batchSize = 1000;
$batch = [];
foreach ($uniqueRows as $row) {
$batch[] = $row;
if (count($batch) >= $batchSize) {
foreach ($batch as $batchRow) {
fputcsv($outputHandle, $batchRow);
}
$batch = [];
gc_collect_cycles(); // garbage collection
}
}
// Schrijf laatste batch
foreach ($batch as $batchRow) {
fputcsv($outputHandle, $batchRow);
}
fclose($outputHandle);
}
```
## Foutafhandeling en logging
```php
private function validateInput() {
if (empty($this->processedFiles)) {
throw new Exception("Geen bestanden om te verwerken");
}
$outputDir = dirname($this->outputFile);
if ($outputDir && !is_writable($outputDir)) {
throw new Exception("Output directory is niet beschrijfbaar: " . $outputDir);
}
}
private function logInfo(string $message) {
if ($this->verbose) {
fwrite(STDOUT, "[INFO] " . $message . PHP_EOL);
}
}
private function logError(string $message) {
fwrite(STDERR, "[ERROR] " . $message . PHP_EOL);
}
private function logSuccess(string $message) {
fwrite(STDOUT, "[SUCCESS] " . $message . PHP_EOL);
}
```
## Gebruik en uitvoering
```php
// Main execution
if (php_sapi_name() !== 'cli') {
die("Dit script kan alleen via CLI worden uitgevoerd");
}
$processor = new BatchProcessor();
$processor->run($argv);
```
## Gebruiksvoorbeelden:
```bash
# Basis gebruik
php processor.php
# Met verbose modus
php processor.php --verbose
# Aangepaste output
php processor.php --output=resultaat.csv
# Combinatie
php processor.php --verbose --output=final.csv
```
## Optimalisatietips:
1. **Geheugengebruik**: Verwerk in batches i.p.v. alles in memory
2. **Progress monitoring**: Voeg --progress optie toe voor voortgangsbar
3. **Parallel processing**: Gebeerkt `pcntl_fork()` voor multi-threading
4. **Memory limit**: Stel `ini_set('memory_limit', '512M')` in voor grote bestanden
5. **Tijdsmeting**: Meet en log verwerkingstijd in verbose modus
Deze tool verwerkt CSV-bestanden efficiënt, verwijdert duplicaten en biedt flexibele CLI-opties met robuuste foutafhandeling.