slogan3

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

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.