Endlosschleife im Hintergrund

  • #1
C

cultsibi

Bekanntes Mitglied
Themenersteller
Dabei seit
19.03.2005
Beiträge
64
Reaktionspunkte
0
Diesen Code habe ich im Inet gefunden. Er soll innerhalb eines bestimmten intervalls (hier sind es 10 sec.) eine bestimmte Aufgabe erfüllen. In diesem Fall schreibt er jewails immer eine 1 und einen Zeilenumbruch in eine txt Datei names ausgabe.txt
Die Anwendung wird erst gestartet, wenn man dieses Script aufruft und dazu in der Datei state.txt das Wort run steht. Wenn man später das runmit einem shutdown überschreibt und speichert soll die Anwendung beendet werden.

Code:
<?php

	ignore_user_abort(true);
	ini_set(max_execution_time,0);

	while (1) 
	{
		if ( ! tickfunction() ) { exit(); }
		sleep(10);
	}

	function tickfunction() 
	{
		$file = fopen(state.txt,r);
		$ausgabe = fopen(ausgabe.txt,a);
		$contents = fread($file, filesize(state.txt));

		if ( $contents==run) 
		{	

			fwrite($ausgabe,1\n);

		} elseif ( $contents==shutdown ) { return false; }

		return true;
	}

?>

Mein Problem ist, dass er die Anwendung nicht beendet. Schreibt man nämlich später noch einmal ein run in die state.txt, so fügt er weiterhin alle 10 sec. eine 1 und einen Zeilenumbruch hinzu, obwohl das Script nicht wieder neu aufgerufen wurde...
Mein Ziel ist es, dass dieser Prozess komplett beendet wird, und nicht stillschweigend im Hintergrund weiter läuft.
Bitte um Fehleranalyse und Verbesserung ;)
 
  • #2
Versuchs mal mit
Code:
if (!tickfunction()) break;

BTW... du öffnest in jedem Schleifendurchlauf die beiden Text-Dateien (state und ausgabe), diese sollten dann aber auch wieder geschlossen werden, also
Code:
function tickfunction() {
 $file = fopen(state.txt,r);
 $ausgabe = fopen(ausgabe.txt,a);
 $contents = fread($file, filesize(state.txt));
 fclose($file);

 if ( $contents==run) {
  fwrite($ausgabe,1\n);
 }
 elseif ( $contents==shutdown ) return false;
 fclose($ausgabe);
 return true;
}

Würde sie aber auch generell etwas umschreiben:
Code:
function tickfunction() {
 $file = fopen(state.txt,r);
 $contents = fread($file, filesize(state.txt));
 fclose($file);

 if ( $contents==run) {
  $ausgabe = fopen(ausgabe.txt,a);
  fwrite($ausgabe,1\n);
  fclose($ausgabe);
  return true;
 }
 return false;
}

Weiss jetzt nicht genau, obs dir weiterhilft... probierst mal aus...

M.
 
  • #3
klasse, es funktioniert *freu*

cronjob wäre zwar einfacher, aber leider habe ich keinen shell Zugriff
 
  • #4
Thema:

Endlosschleife im Hintergrund

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.839
Beiträge
707.962
Mitglieder
51.491
Neuestes Mitglied
haraldmuc
Oben