Simone: Anzahl Max-Fibers bei vorgegebener Hardware

Beitrag lesen

Hallo Rolf,

vielen Dank für Deinen Input ;o) es ist schön, dass es das Forum gibt!

MYSQLI_ASYNC werde ich testen bzw. kannte ich noch nicht.

Alles sehr komplex, aufwändig zu entwickeln und schwierig zu testen. Aber immerhin kann MYSQL dann im Hintergrund arbeiten und die Daten wegschreiben.

Nein, Fibers sind einfach zu implementieren und "PHP-Hauseigen" das ist sehr cool... finde ich

/**
* Verwaltet die Ausführung von Fibers für asynchrone Verarbeitung.
*
* @param array &$activeFibers Referenz auf das Array aktiver Fibers.
* @param mysqli $conn_ln Datenbankverbindung.
* @param array &$idsToProcess Referenz auf das Array der zu verarbeitenden Dateipfade.
* @param int &$nichtGefundenCount Zähler für nicht gefundene Json-Arrays und defekte JsonContent.
* @param bool $waitForAll Gibt an, ob auf die Beendigung aller Fibers gewartet werden soll.
*/

function manageFibersMysql(&$activeFibers, $conn_ln, $totalFiles, $startTime, $maxFibers, &$idsToProcess, &$nichtGefundenCount, $waitForAll = false) {
	foreach ($idsToProcess as $filePath) {
		$fiber = new Fiber(function () use ($filePath, $conn_ln,$totalFiles, $startTime, $maxFibers, &$nichtGefundenCount) {
			$content = readAndParseJsonMysql($filePath);
			if ($content) {
				$result = processStelleJsonContent($content, $conn_ln, $totalFiles, $startTime, $maxFibers);
				if ($result['nichtGefunden']) {
					$nichtGefundenCount++;
				}
			}
		});
		$fiber->start();
		$activeFibers[] = $fiber;
	}

	if (!$waitForAll) {
		// Bereinige das Array für den nächsten Batch
		$idsToProcess = [];
	}

	// Wenn waitForAll aktiv ist, warte bis alle Fibers ihre Arbeit beendet haben
	if ($waitForAll) {

		foreach ($activeFibers as $index => $fiber) {
			if (!$fiber->isTerminated()) {
				$fiber->resume();
			} else {
				unset($activeFibers[$index]);
			}
		}
		// Nach dem Warten, bereinige auch hier das Array für den nächsten Batch
		$activeFibers = [];
	}
}

Aus meiner Sicht ist die etwas bessere und unkompliziertere Idee auch eigentlich, einfach mehrere Kommandozeilen aufzumachen

Ja! Diesen Ansatz hatte ich bei der Programmentwicklung auch, jedoch läuft die Geschichte im Hintergrund lokal per Cronjob... bis es komplett fertig durchgelaufen ist greift:

$lockFile = fopen(__LOCK_FILE__, 'c+');
	if (!$lockFile) {
		error_log("Fehler: Konnte Lock-Datei nicht öffnen.\n", 3, __DIR__ . '/errorlogphp/errorlogphp.log');
		exit("Fehler: Konnte Lock-Datei nicht öffnen.\n");
	}

	if (!flock($lockFile, LOCK_EX | LOCK_NB)) {
		fclose($lockFile);
		exit();
	}

es muss nur eine angemessene Verarbeitungszeit herauskommen! es läuft nichts anderes auf dem NUC-Rechner. Datengewinnen und aufbereiten.

Ich gehe von Datenmengen nach ca. einen Jahr von ca. 23 Millionen Datensätzen aus. Das schafft ein Mini-PC und Mysql nicht mehr zu verarbeiten / denke ich... es seiden es wird rudimentär auf Verzeichnisebene gearbeitet, als bekommt jede *.jsons ein eigenes Verzeichnis wo ich per touch das Modifi-Datum vom Verzeichnis änder sollte ein Update notwendig sein wird das modif-Datum genutzt. Na mal sehen wie robust das wirklich ist nach einem Jahr.

Ich werde Deinen Beitrag meiner Programm-Dokumentation hinzufügen.

Beste Grüße und nochmal Danke Rolf!

Für die Nachwelt hier habe ich Fibers mit unterschiedlichen Anfangswerten getestet. Hier stellte sich heraus das die ursprüngliche / intuitive Config am besten geeignet ist.