php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Thema geschlossen
 
LinkBack Themen-Optionen Thema bewerten
Alt 18.12.2011, 11:53  
Neuer Benutzer
 
Registriert seit: 16.12.2011
Beiträge: 16
PHP-Kenntnisse:
Fortgeschritten
cececo befindet sich auf einem aufstrebenden Ast
Standard Prozesse mit PHP starten und überwachen

Heute habe ich ein Problem mit Hintergrundprozessen.
Ich habe einen Chefprozess, der 5 Mio Datensätze analysieren und bearbeiten soll. Da diese Aufgabe viele Tage in Anspruch nehmen würde, habe ich auf eine alte Routine zurückgegriffen, um diese Aufgabe schneller zu erledigen.
Der Chefprozess ruft Arbeiterprozesse auf:

Code:
while($row = mysql_fetch_array($result)){
	$pageid = $row['pageid'];
	$clients = count(scandir("clients/"));
	while ($clients > 20) {
		sleep(1);
		$clients = count(scandir("clients/"));
	}
	exec("wget http://domain.de/arbeiter.php?id=".$pageid." >/dev/null &", $execute);
}
Da ich natürlich nicht 5 Mio Arbeiterprozesse gleichzeitig anstossen kann habe ich es auf jeweils 20 Prozesse begrenzt. Die Arbeiterprozesse schreiben zuerst eine kleine Textdatei in das Verzeichnis /clients und löschen dann diese wieder, nachdem die Arbeit erledigt ist.

Mein Problem ist, dass einige dieser Arbeiterprozesse wegen fehlerhafter Daten oder Zeitüberschreitung abschmieren und dann die Textdatei nicht mehr löschen. Der Chef weiss also nicht mehr, ob seine Arbeiter noch arbeiten und hängt sich nach einer geraumen Zeit in der Endlosschleife
Code:
while ($clients > 20) {
auf.

Gibt es eine Möglichkeit, das der Chef überprüfen kann, ob der Arbeiter nach am arbeiten ist?

Entschuldigt die sinnbildliche Darstellung...
cececo ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 18.12.2011, 12:40  
Erfahrener Benutzer
 
Registriert seit: 01.06.2011
Beiträge: 391
PHP-Kenntnisse:
Anfänger
achtelpetit befindet sich auf einem aufstrebenden Ast
Standard

5 Mio DS / 86.400 Sekunden (pro Tag) = ca. 60 Sekunden pro DS
bei nur 1 Tag Arbeitszeit
Bei mehreren Tagen Arbeitszeit also mehrere Minuten pro Datensatz.
Das interessiert mich.

Zitat:
...dass einige dieser Arbeiterprozesse wegen fehlerhafter Daten oder Zeitüberschreitung abschmieren...
Ich würde die Daten vor der Verarbeitung auf Gültigkeit prüfen.
achtelpetit ist offline  
Alt 18.12.2011, 12:59  
Neuer Benutzer
 
Registriert seit: 16.12.2011
Beiträge: 16
PHP-Kenntnisse:
Fortgeschritten
cececo befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von achtelpetit Beitrag anzeigen
5 Mio DS / 86.400 Sekunden (pro Tag) = ca. 60 Sekunden pro DS
bei nur 1 Tag Arbeitszeit
Bei mehreren Tagen Arbeitszeit also mehrere Minuten pro Datensatz.
Das interessiert mich.



Ich würde die Daten vor der Verarbeitung auf Gültigkeit prüfen.
Hast Du da nicht einen kleinen Rechenfehler?
5 Mio / 86400 Sekunden = 60 Datensätze pro Sekunde
oder irre ich mich jetzt????

Da die Bearbeitung eines Datensatzes (jeder enthält eine komplette Webseite oder ein PDF-Dokument plus zusätzlicher Informationen) bis zu 5 Minuten dauern kann, ergibt sich diese lange Verarbeitungszeit.
cececo ist offline  
Alt 18.12.2011, 13:08  
Benutzer
 
Registriert seit: 25.01.2011
Beiträge: 59
PHP-Kenntnisse:
Fortgeschritten
Renner befindet sich auf einem aufstrebenden Ast
Standard

Wenn die Prozesse idempotent sind, kannst du mit einem Timeout arbeiten. Wenn nicht, musst du zusätzlich Transaktionen einbauen.
Renner ist offline  
Alt 18.12.2011, 14:01  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Nicht mit exec arbeiten. Und vor allem nicht über den Webserver arbeiten (d.h. keine http-Aufrufe)!

Benutz das CLI Interface von PHP und proc_open(), dann kannst du mittels proc_get_status() den Status der gestarteten Prozesse abfragen.
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline  
Alt 18.12.2011, 14:45  
Erfahrener Benutzer
 
Registriert seit: 01.06.2011
Beiträge: 391
PHP-Kenntnisse:
Anfänger
achtelpetit befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Hast Du da nicht einen kleinen Rechenfehler?
5 Mio / 86400 Sekunden = 60 Datensätze pro Sekunde
Sorry, natürlich 60 pro sec.
achtelpetit ist offline  
Alt 27.12.2011, 16:44  
Neuer Benutzer
 
Registriert seit: 16.12.2011
Beiträge: 16
PHP-Kenntnisse:
Fortgeschritten
cececo befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von lstegelitz Beitrag anzeigen
Nicht mit exec arbeiten. Und vor allem nicht über den Webserver arbeiten (d.h. keine http-Aufrufe)!

Benutz das CLI Interface von PHP und proc_open(), dann kannst du mittels proc_get_status() den Status der gestarteten Prozesse abfragen.
Ich habe mich jetzt mal ein paar Stunden (oder sind es schon Tage?) mit proc_open beschäftigt.
Der erste Eindruck war auch viel versprechend...
... der 2. und x. allerdings nicht wirklich

irgendwie verstehe ich dieses System noch nicht richtig

hier einmal mein Test-Code:
Code:
echo "<br>".date('Y-m-d H:i:s').": ";
$cwd = null;
$pageid = 721954;
$env = null;

$cmd = "/usr/bin/php -f example.php ".$pageid;

$process = proc_open($cmd , $descriptorspec, $pipes, $cwd, $env);
$maxcount = 0;

if (is_resource($process)) {
	$status = proc_get_status($process);
	file_put_contents("clients/log.txt",date('Y-m-d H:i:s')." Starting Process ".$status["pid"]."\n");
	$running = true;
	
	while ($running == true && $maxcount < 20) {
		$log = print_r($status, true);
		file_put_contents("clients/log.txt",date('Y-m-d H:i:s')." Status: ".$log."\n", FILE_APPEND);
		$maxcount++;
		sleep(5);
		$status = proc_get_status($process);
		if ($status === false) {
			$running = false;
		}
		// if (isset($status["running"])) {
			// $running = $status["running"];
		// } else {
			// $running = false;
		// }
	}
	
	
	
	
	echo "<br>Prozess beendet<br>";
    $return_value = proc_close($process);

	echo "<br>".date('Y-m-d H:i:s').": ";
	print_r($status);

	echo "<br>";
    echo "Rückgabewert des Kommandos: $return_value\n";
}
example.php wird in diesem Beispiel auch wirklich ausgeführt - ist allerdings nach 20 Sekunden fertig.
Wenn ich die Scheife (und den Prozess) nicht beenden würde, dann würde er ewig laufen.
Wenn ich auf
Code:
$status["running"] == true
überprüfe, dann sagt mir die Routine, dass der Prozess bereits nach 5 Sekunden beendet ist, was allerdings nicht stimmt.

Sollte hierzu jemand eine Idee haben, wäre ich wirklich glücklich.
In der Zwischenzeit werde ich weiter testen, ändern, testen, ändern, ... (hoffentlich keine Endlosschleife).
Irgendwie kann ich mir nicht vorstellen, dass ich der Erste bin, der mehrere Prozesse im Hintergrund ausführen will. Das hat doch bestimmt schon jemand gelöst
cececo ist offline  
Alt 03.01.2012, 16:49  
Neuer Benutzer
 
Registriert seit: 16.12.2011
Beiträge: 16
PHP-Kenntnisse:
Fortgeschritten
cececo befindet sich auf einem aufstrebenden Ast
Standard

Aktueller Stand meiner Arbeit:

Ich habe mich jetzt einmal mit Gearman beschäftigt.

Vorab: Die Aussage, dass Gearman schnell und unkompliziert installiert werden kann, kann ich nicht teilen. Ich brauchte einen Tag und musste viel nachinstallieren

Doch inzwischen läuft Gearman tadellos und die ersten Experimente laufen.

Die ersten Test zeigten allerdings ein Problem. Da ich für eine paralelle Verarbeitung ca. 100 Worker einsetzen möchte (evtl. mehr) habe ich folgendes programmiert:
Code:
// 100 Arbeiter starten :-)
$worker = array();
for ($i = 1; $i <= 100; $i++) {
	$cmd = "php -f test_worker.php >/dev/null &";
	$process = proc_open($cmd , $descriptorspec, $pipes, $cwd, $env);
	$worker[$i] = $process;
}



echo "<br>".date('Y-m-d H:i:s').": "."<br>";
echo count($worker);

// 10000 Aufgabe holen
// und diese der Reihe nach an die Arbeiter verteilen

# create our client object
$client= new GearmanClient();
# add the default server (localhost)
$client->addServer();

$jobs = array();
for ($i = 1; $i <= 1000; $i++) {

	$job = $client->doBackground("reverse", "this is test ".$i, $i);

	if ($client->returnCode() == GEARMAN_SUCCESS)
	{
		$jobs[$i] = $job;
	}
}
// Aufgaben überwachen
$running = true;
while ($running == true) {
	sleep(1);

	foreach($jobs AS $key => $value) {
		$status = $client->jobStatus( $value );

		if (!$status[0]) {
			unset($jobs[$key]);
		}
	}
	echo "<br>".date('Y-m-d H:i:s')."  ".count($jobs) ." jobs are running<br />\n";
	if (count($jobs) < 10) {
		$running = false;
	}
}

// Die Arbeiter dürfen aufhören...
foreach ($worker AS $value) {
	// proc_close($value);
	proc_terminate($value);
}
Die letzte Aufgabe (Die Arbeiter dürfen aufhören...) funktioniert aber leider nicht. Die Prozesse (Arbeiter) bleiben weiterhin aktiv und werden bei jedem Aufruf um 100 mehr. Arbeitsplätze schaffen sehe ich anders

Weiss übrigens jemand, wie viele Jobs ich an Gearman senden kann? 5 Mio dürften bestimmt zu viel sein
cececo ist offline  
Alt 03.01.2012, 22:00  
Erfahrener Benutzer
 
Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse:
Fortgeschritten
Jens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nett
Standard

Anmerung zu Multipostings
http://phpforum.de/forum/showthread.php?t=267391

Gruß Jens
Jens Clasen ist offline  
Alt 04.01.2012, 01:10  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.267
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Schade - interessantes Thema, aber zu aufwaendig um in zwei Foren fair diskutiert zu werden. Daher zugemacht.
__________________
"Nuschel ich?" - "Was?"
Chriz ist gerade online  
Thema geschlossen


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
proc_open - Programm im Hintergrund starten und PID auslesen ottixus PHP Einsteiger 8 14.05.2012 11:40
Programm starten Shelter PHP Einsteiger 1 12.07.2011 21:50
Wie am besten Script über Browser auf der Konsole starten smilla PHP Einsteiger 5 15.01.2011 14:46
mehrere Prozesse starten, Möglichkeiten? Matthiasnet PHP-Fortgeschrittene 16 30.12.2010 17:53
Download soll starten, wenn Haken gesetzt wurde DeineOmi PHP Tipps 2010 12 05.10.2010 08:07
Shell Command durch PHP im Hintergrund starten parkourpenner PHP-Fortgeschrittene 1 30.08.2010 20:26
[Erledigt] [Windows] Server starten Pat009 PHP Tipps 2010 2 22.03.2010 23:07
Mediaplayer mit playbutton starten Garfield HTML, Usability und Barrierefreiheit 7 18.02.2010 17:33
Mehrere Prozesse starten Dominik PHP Tipps 2009 24 24.08.2009 21:30
Starten mehrerer PHP-Scripte mit einem Starterscript Wolla PHP Tipps 2009 5 04.06.2009 12:26
Apache läst sich nicht starten pit62 Server, Hosting und Workstations 4 10.09.2007 16:30
per Javascript exe auf Client starten HTML, Usability und Barrierefreiheit 16 05.09.2005 14:04
PHP-Script automatisiert jede Nacht starten, aber wie? PHP Tipps 2005 10 17.02.2005 17:51
[Erledigt] wie soll ich apache starten? Server, Hosting und Workstations 5 20.01.2005 14:49
Sessions starten/ Einstellungen in der PHP.INI PHP Tipps 2004 3 04.08.2004 15:28

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php prozesse überwachen, arbeiter.php, php \proc_open\ beispiele konsole, prozess im hintergrund starten geht nicht mehr im php5, cli php überwachen, prozess überwachung php, proc_open beispiel, php hintergrundprozess parallel, php preozess überwachen, php prozess überwachen, php exec überwachsen, php user überwachen, hintergrundprozesse php

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:46 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum