Ontwikkel een geavanceerde PHP-gebaseerde taakplanner voor achtergrondprocessen
description
Deze prompt helpt je een betrouwbare en flexibele taakplanner in PHP te ontwikkelen waarmee je achtergrondprocessen automatisch en efficiënt kunt beheren. Het lost problemen op zoals het handmatig starten van taken en het ontbreken van monitoring, waardoor je systeem stabieler en onderhoudsvriendelijker wordt.
prompt
Help me een geavanceerde taakplanner te ontwikkelen in PHP die achtergrondprocessen uitvoert op basis van een schema. Leg uit hoe ik taken kan definiëren, plannen, uitvoeren en ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Het ontwikkelen van een geavanceerde taakplanner in PHP die achtergrondprocessen op basis van een schema uitvoert, vereist een gestructureerde aanpak. Hieronder leg ik uit hoe je taken kunt definiëren, plannen, uitvoeren, monitoren, inclusief foutafhandeling en logging, met een concrete voorbeeld voor het versturen van dagelijkse rapporten.
1. Taken Definiëren
Maak een gestructureerde manier om taken te beschrijven. Bijvoorbeeld door een database of configuratiebestand te gebruiken.
Voorbeeld database tabel: `tasks`
- id
- naam
- beschrijving
- schema (bijv. cron expressie of vaste tijd)
- status (actief/inactief)
- laatste_uitvoering
- volgende_uitvoering
2. Planning Instellen
Gebruik een cronjob die periodiek controleert welke taken uitgevoerd moeten worden. Bijvoorbeeld elke minuut een PHP-script laten draaien dat controleert op taken die gepland staan.
3. Uitvoeren van Taken
Voor elke taak die op dat moment moet draaien, voer je een PHP-functie uit die de taak bevat. Voor jouw voorbeeld:
```php
function verstuurDagelijkseRapporten() {
// Logica om rapporten te genereren en te versturen
}
```
Je voert deze functie uit wanneer de planning aangeeft dat de taak moet starten.
4. Monitoring en Foutafhandeling
- Log alle uitvoeringen met datum, tijd, resultaat en eventuele fouten.
- Gebruik een logfile of een database om logs te bewaren.
- Bij fouten, stuur bijvoorbeeld een e-mail naar de beheerder of sla het op voor later onderzoek.
Voorbeeld logging:
```php
function logTask($taskId, $status, $message) {
file_put_contents('log.txt', date('Y-m-d H:i:s') . " - Taak $taskId: $status - $message\n", FILE_APPEND);
}
```
5. Automatisering en Achtergrondverwerking
Gebruik een cronjob op de server:
```bash
* * * * * /usr/bin/php /pad/naar/je/script.php
```
Dit script controleert welke taken uitgevoerd moeten worden en start ze, bijvoorbeeld via `exec()` of door een queue-systeem te gebruiken.
6. Concrete Implementatie voor Rapporten
Hier is een eenvoudige schets:
```php
// script.php
include 'db.php'; // Database connectie
// Haal taken op die gepland staan voor nu
$now = date('Y-m-d H:i:s');
$tasks = getScheduledTasks($now);
foreach ($tasks as $task) {
try {
if ($task['naam'] == 'Verstuur Dagelijkse Rapporten') {
verstuurDagelijkseRapporten();
logTask($task['id'], 'succes', 'Rapporten verstuurd.');
updateLastExecution($task['id']);
}
// Voeg meer taken toe indien nodig
} catch (Exception $e) {
logTask($task['id'], 'fout', $e->getMessage());
// eventueel notificatie bij fout
}
}
function getScheduledTasks($now) {
// Query op database om taken te vinden die nu uitgevoerd moeten worden
}
function updateLastExecution($taskId) {
// Update de laatste uitvoeringsdatum in de database
}
```
7. Rapport Generatie en Versturen
Het genereren van rapporten kan bijvoorbeeld door data uit de database te halen en te formatteren in PDF of HTML, en dan via PHPMailer te versturen.
```php
use PHPMailer\PHPMailer\PHPMailer;
function verstuurDagelijkseRapporten() {
// Generateer rapport
$rapport = generateRapport();
// Verstuur e-mail
$mail = new PHPMailer();
// configuratie mail
$mail->addAddress('management@bedrijf.com');
$mail->Subject = 'Dagelijks Rapport';
$mail->Body = $rapport;
if (!$mail->send()) {
throw new Exception('E-mail niet verzonden: ' . $mail->ErrorInfo);
}
}
function generateRapport() {
// Data ophalen en formatteren
return "Hier komt het rapport.";
}
```
Samenvatting:
- Gebruik een database of configuratie voor taken.
- Gebruik een cronjob om periodiek te controleren.
- Voer taken uit met PHP functies.
- Log alles en handel fouten af.
- Verstuur rapporten per e-mail.
- Breid uit met een dashboard of notificaties voor monitoring.
Door deze gestructureerde aanpak bouw je een robuuste en schaalbare taakplanner in PHP.
provider: deepseek
model: deepseek-chat
Ik help je graag met het ontwikkelen van een geavanceerde taakplanner in PHP. Hier is een complete uitleg:
## 1. Basisstructuur met cronjob
Eerst maak je een cronjob aan die elke minuut draait:
```bash
* * * * * /usr/bin/php /pad/naar/taakplanner.php >> /var/log/taakplanner.log 2>&1
```
## 2. Database Structuur
Maak een database tabel voor taken:
```sql
CREATE TABLE scheduled_tasks (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT,
schedule VARCHAR(100) NOT NULL,
command VARCHAR(500) NOT NULL,
last_run DATETIME NULL,
next_run DATETIME NOT NULL,
is_active BOOLEAN DEFAULT true,
max_execution_time INT DEFAULT 300,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
## 3. Taakplanner Klasse
```php
<?php
class AdvancedTaskScheduler {
private $db;
private $logFile = '/var/log/task_scheduler.log';
public function __construct($dbConnection) {
$this->db = $dbConnection;
}
public function log($message, $level = 'INFO') {
$timestamp = date('Y-m-d H:i:s');
$logMessage = "[$timestamp] [$level] $message" . PHP_EOL;
file_put_contents($this->logFile, $logMessage, FILE_APPEND);
}
public function executeDueTasks() {
try {
$now = date('Y-m-d H:i:00');
$stmt = $this->db->prepare("
SELECT * FROM scheduled_tasks
WHERE is_active = true AND next_run <= ?
FOR UPDATE SKIP LOCKED
");
$stmt->execute([$now]);
$tasks = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($tasks as $task) {
$this->executeTask($task);
}
} catch (Exception $e) {
$this->log("Fout bij uitvoeren taken: " . $e->getMessage(), 'ERROR');
}
}
private function executeTask($task) {
$taskId = $task['id'];
$startTime = microtime(true);
try {
$this->updateTaskStatus($taskId, 'running');
// Voer de taak uit
$output = [];
$returnCode = 0;
exec($task['command'] . ' 2>&1', $output, $returnCode);
$executionTime = microtime(true) - $startTime;
if ($returnCode === 0) {
$this->log("Taak '{$task['name']}' succesvol uitgevoerd in " . round($executionTime, 2) . "s");
$this->updateTaskStatus($taskId, 'success', $executionTime, implode("\n", $output));
} else {
throw new Exception("Exit code: $returnCode, Output: " . implode("\n", $output));
}
} catch (Exception $e) {
$this->log("Fout in taak '{$task['name']}': " . $e->getMessage(), 'ERROR');
$this->updateTaskStatus($taskId, 'failed', microtime(true) - $startTime, $e->getMessage());
}
}
private function updateTaskStatus($taskId, $status, $executionTime = null, $output = null) {
$nextRun = $this->calculateNextRun($taskId);
$stmt = $this->db->prepare("
UPDATE scheduled_tasks
SET last_run = NOW(),
next_run = ?,
last_status = ?,
last_execution_time = ?,
last_output = ?
WHERE id = ?
");
$stmt->execute([$nextRun, $status, $executionTime, $output, $taskId]);
}
private function calculateNextRun($taskId) {
$stmt = $this->db->prepare("SELECT schedule FROM scheduled_tasks WHERE id = ?");
$stmt->execute([$taskId]);
$task = $stmt->fetch(PDO::FETCH_ASSOC);
// Ondersteunt cron-achtige syntax: "0 0 * * *" voor dagelijks om middernacht
return date('Y-m-d H:i:00', strtotime('+1 day'));
}
}
?>
```
## 4. E-mail Rapport Taak
Maak een apart script voor de e-mailtaak:
```php
<?php
// daily_report.php
class DailyReportTask {
public function execute() {
// Genereer rapport
$report = $this->generateDailyReport();
// Verstuur e-mail
$this->sendEmailReport($report);
return "Rapport succesvol verzonden";
}
private function generateDailyReport() {
// Je rapport generatie logica hier
return "Dagelijks management rapport - " . date('Y-m-d');
}
private function sendEmailReport($report) {
$to = 'management@bedrijf.nl';
$subject = 'Dagelijks Management Rapport - ' . date('Y-m-d');
$headers = 'From: noreply@bedrijf.nl' . "\r\n" .
'Content-Type: text/html; charset=UTF-8';
mail($to, $subject, $report, $headers);
}
}
// Uitvoeren als standalone script
if (php_sapi_name() === 'cli') {
$task = new DailyReportTask();
echo $task->execute();
}
?>
```
## 5. Taak Registreren
Voeg je dagelijkse e-mailtaak toe aan de database:
```php
<?php
// register_task.php
$db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
$stmt = $db->prepare("
INSERT INTO scheduled_tasks
(name, description, schedule, command, next_run)
VALUES (?, ?, ?, ?, ?)
");
$nextRun = date('Y-m-d 00:00:00', strtotime('+1 day'));
$stmt->execute([
'Dagelijkse Management Rapport',
'Verstuur dagelijks rapport per e-mail naar management',
'0 0 * * *', // Dagelijks om middernacht
'/usr/bin/php /pad/naar/daily_report.php',
$nextRun
]);
?>
```
## 6. Monitoring Script
```php
<?php
// monitor_tasks.php
class TaskMonitor {
public function getTaskStatus() {
$stmt = $this->db->prepare("
SELECT name, last_run, last_status, last_execution_time
FROM scheduled_tasks
ORDER BY last_run DESC
");
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
public function checkFailedTasks() {
$stmt = $this->db->prepare("
SELECT name, last_run, last_output
FROM scheduled_tasks
WHERE last_status = 'failed'
AND last_run > DATE_SUB(NOW(), INTERVAL 24 HOUR)
");
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
?>
```
## 7. Gebruik
```php
<?php
// taakplanner.php
require_once 'AdvancedTaskScheduler.php';
$db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
$scheduler = new AdvancedTaskScheduler($db);
$scheduler->executeDueTasks();
?>
```
## Belangrijke Kenmerken:
- **Foutafhandeling**: Uitgebreide logging en status tracking
- **Preventie van overlapping**: Gebruikt database locks
- **Monitoring**: Bijhoudt uitvoeringstijd en status
- **Flexibel schema**: Ondersteunt cron-achtige planning
- **Security**: Commands worden veilig uitgevoerd
Dit systeem biedt een robuuste basis voor geavanceerde taakplanning met professionele fouthantering en monitoring mogelijkheden.
error: Generation failed [deepseek] prompt_id=1505 locale=fr err=DeepSeek connection/timeout | Generation failed [deepseek] prompt_id=1505 locale=es err=DeepSeek connection/timeout