# Cronjob jede Sekunde



## Sasser (21. Juni 2010)

Guten Abend!

Gibt es eine Möglichkeit, einen Cronjob einzurichten welcher jede Sekunde ausgeführt wird?

Wenn nicht, ist es dann in PHP irgendwie möglich dies mit einer Schleife und *sleep ()* zu realisieren? Jedoch wäre dies dann doch nicht mehr genau, da ja *sleep ()* erst 1 Sekunde wartet, nachdem die Abfrage ausgeführt wurde. Theoretisch würden doch dann im Endeffekt bei Aufruf von 30 Mal *sleep ( 1 )* insgesamt 60 Sekunden herauskommen oder?


----------



## Dr Dau (22. Juni 2010)

Hallo!

Die kleinste Einheit beim Cronjob ist 1 Minute.

Wenn Du das PHP-Script immer nur in den "Schlaf" schickst, läuft es ja unendlich.
Daher würde ich es zusätzlich per Cronjob z.B. jede Minute erneut anschubsen.
Wie genau Dein Script "einschläft", hängt davon ab wie umfangreich es arbeitet.
Machst Du z.B. eine Datenbankabfrage, könnte diese u.U. auch länger als 1 Sekunde Dauern.
Willst Du hingegen z.B. nur mittels date() die Uhrzeit im Sekundentakt anzeigen lassen, sollte es keine sooo grossen Probleme geben (wobei ich bei diesem Beispiel evtl. eher auf andere Techniken zurück greifen würde).

Allerdings sollte Dir bewusst sein dass Du Dein System beim Sekundentakt entsprechend hoch auslastest..... wenn Du keinen Rootserver hast, werden die anderen Nutzer sicherlich "begeistert" sein.

Gruss Dr Dau.


----------



## Sasser (22. Juni 2010)

Ich nutze einen Rootserver mit Quad-Core, da dürfte dies nicht so belasten.

Also ich habe in einer Datenbank Datensätze mit einem Timestamp, zu welcher Zeit die Aktion ausgeführt werden soll.

Gibt es eventuell andere Möglichkeiten, die Datensätze im Minuten-Cronjob vorzuladen und dann in dieser Minute die Datensätze abzuarbeiten, welche betroffen sind? Ist doch bestimmt sinnvoller, als wenn ich jede Sekunde die Datei erneut aufrufe!?


----------



## Dr Dau (22. Juni 2010)

Ein PHP-Script lässt sich ja auch mehrfach aufrufen.
Daher würde ich es per Cronjob anschubsen und gleich zu Anfang mittels time() den Timestamp in eine Variable speichern, so hast Du den Startzeitpunkt.
Zu dieser Variable zählst Du 59 Sekunden und speicherst sie in einer neuen Variable, so hast Du den Endzeitpunkt.
Anschliessend sucht das Script anhand des Startzeitpunkts und des Endzeitpunkts die entsprechenden Einträge aus der Datenbank raus und führt die gewünschte Aktionen aus.
Wenn ein Scriptaufruf allerdings länger als 1 Minute benötigt, dann überschneidet er sich mit dem nächsten Scriptaufruf.
Ist zwar prinzipiell kein Problem, allerdings weiss ich nicht ob es für Deinen Fall relevant ist.


----------



## Sasser (22. Juni 2010)

Vielen Dank für deine Anregung!

Also ich lege jetzt einen Cronjob an, welcher jede Minute die Datei mit folgendem Inhalt anschubst:


```
$i = date ( "s" );
do {
	$i ++;
	$start = microtime ();
	
	# Prozedur ausführen
	
	$end = microtime ();
	usleep ( 1000000 - ( $end - $start ) );
} while ( $i < 60 );
```

Könnte man das noch verfeinern oder ist das schon die optimale Lösung?


----------



## timestamp (22. Juni 2010)

Ich würde das inkrement hinter die Startzeitabfrage setzen. Kleinvieh macht aus Mist


----------



## Sasser (22. Juni 2010)

```
$i = "-1";
do {
    $i ++;
    $start = microtime ();
    
    # Prozedur ausführen
    
    $end = microtime ();
    usleep ( 1000000 - ( $end - $start ) );
} while ( $i < 59 );
```

Nun müsste ich nur noch die Datenbank abfragen und alle Aufgaben in dieser Minute in ein Array packen und in der entsprechenden Sekunde ausführen. Und wenn keine Aufgaben anstehen, das Script per *exit;* beenden. Dadurch könnte man noch mehr Server-Performance sparen oder?


----------



## Sasser (2. Juli 2010)

Gibt es denn andere Möglichkeiten, ein Script jede Sekunde aufzurufen?

Ich bin bei meinen Recherchen auf Batch und CURL gestoßen.

Batch würde dann ähnlich wie ein Cronjob ein Script aufrufen.

Mit CURL soll es möglich sein, dass man in einer Schleife (jede Sekunde) ein anderes Script aufruft welches dann die Prozedur ausführt. Meine Tests waren jedoch nicht sehr erfolgsversprechend, da hier ebenfalls gewartet wird bis das aufgerufene Script beendet ist.

Gibt es in CURL keine Möglichkeit, die Anfrage im Hintergrund zu senden und nicht auf Antwort zu warten?


----------

