totalItems = $totalItems; $this->processedCount = 0; $this->startTime = microtime(true); $this->lastOutputTime = 0; $this->outputInterval = $outputInterval; } public function incrementAndLog() { $this->processedCount++; $currentTime = microtime(true); // Only update the console if enough time has passed or it's the last item if (($currentTime - $this->lastOutputTime > $this->outputInterval) || ($this->processedCount === $this->totalItems)) { $this->logProgress(); $this->lastOutputTime = $currentTime; } } private function logProgress() { $elapsedTime = microtime(true) - $this->startTime; $itemsPerSecond = ($this->processedCount > 0) ? ($this->processedCount / $elapsedTime) : 0; $remainingItems = $this->totalItems - $this->processedCount; $estimatedTimeRemaining = ($itemsPerSecond > 0) ? ($remainingItems / $itemsPerSecond) : 0; $hours = floor($estimatedTimeRemaining / 3600); $minutes = floor(($estimatedTimeRemaining % 3600) / 60); $seconds = floor($estimatedTimeRemaining % 60); printf("\rProcessing: %d/%d (%.2f%%) | Elapsed: %s | Remaining: %02d:%02d:%02d", $this->processedCount, $this->totalItems, ($this->processedCount / $this->totalItems) * 100, gmdate("H:i:s", $elapsedTime), $hours, $minutes, $seconds ); // If all items are processed, add a newline if ($this->processedCount === $this->totalItems) { echo "\n"; } } public function startMessage() { echo "Starting update for {$this->totalItems} items...\n"; } public function finishMessage($type = 'items') { echo "Finished! Updated {$this->processedCount} $type.\n"; } } ?>