php script nach bestimmter Zeit ausführen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
anpassen
aufrufen
auswirkung
code
datenbank
dienst
file
http
idee
job
leistung
performance
realisieren
server
service
url
verwenden
windows
zugriff
-
Ich möchte, dass nach einen Aufrufen eines php scriptes ein anderes Script aufgerufen wird, und das nach einer im ersten Script berrechneten Zeit, als eine art Cronjob, nur dass ich keine bestimmen Zeitmuster haben und das zweite Script nur einmal aufgerufen wird. Das erste Script soll nicht die ganze Zeit laufen sondern sich beenden.
Und ich möchte das ganze nicht bei lima hosten.
Gibt es dafür eine einfache Art und Weise oder muss man es doch irgentwie mit Cronjobs versuchen? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Zum einen: PHP - Sleep könnte das sein, wonach du suchst, Wenn es nach n Sekunden ausgeführt werden soll. Wenn du es zu einem bestimmten Zeitpunkt ausgeführt haben willst, wirst du meiner Meinung nach kaum um Cronjobs herum kommen.
Zum anderen: Du hast bei PHP oft eine Max-Execution-Time. Diese könnte deinem Vorhaben im Weg stehen. Wobei du die bei eigenen Webservern natürlich selbst einstellen kannst. -
Du könntest es mittels dem Clienten aufbauen, über Javascript und setTimeout. Jenachdem was für einen Hintergrund das Ganze hat, was du überhaupt machen willst. Du könntest auch, wenn du Zugriff auf das Hostsystem hast, kannst du es auch so machen
exec("sleep 100 && php /var/www/test.php > /dev/null 2>&1 &");
Und hier dann das sleep anpassen.
Liebe Grüße -
genau wegen der Max Execution möchte ich sleep nicht verwenden.
Und auch möchte ich keinen Clienten dazuschalten, es soll alles vom Server aus funktionieren.
Wenn ich um Cronjobs nicht herumkomme:
Gibt es einen einfachen phpbefehl der einen Cronjob erstellt und dann wieder löscht.
Kenne mich nicht so besonders mit der shell aus. -
es war mal ein Verbesserungsvorschlag für lima cronjobs hier einzuführen, aber was damit läuft keine ahnung...
derzeit machen es einige extern, über dienste anderer webseiten, wie:
http://www.onlinecronjobs.com/
ich kenn mich mit diesen diensten aber nciht aus, einige wollen geld, andere machen es so... -
ein cronjob von außen bringt mich nicht weiter, da der ja nicht von einem php script beeinflusst werden kann. und wie ich bereits sagte ich möchte es nicht auf lima city hosten
-
kdhdamoria schrieb:
Hast du Zugriff auf das Hostsystem und kannst Befehle vom PHP aus ausführen oder nicht? (CGI-Skripten würden sich für den Job auch eignen)
ein cronjob von außen bringt mich nicht weiter, da der ja nicht von einem php script beeinflusst werden kann. und wie ich bereits sagte ich möchte es nicht auf lima city hosten
Wenn du darauf Zugriff hast solltest du dir ggames Post ansehen (auch wenn das nur 1 Möglichkeit von mehreren ist); wenn nicht musst du mit deinen Cronjobs anfangen zu pfuschen. -
hab jetzt keinen Conreten Hoster möchte nur gerne wissen wie das geht, die Hoster die ich vielleicht verwenden möchte unterstützen Cronjob und CGI script
Kann man das ganze unt Xampp(Windows) auch machen zu testzwecken? -
kdhdamoria schrieb:
Nein, du würdest ein Linux-System benötigen, da du hier Linux-Eigenheiten ausnutzen würdest.
Kann man das ganze unt Xampp(Windows) auch machen zu testzwecken? -
kdhdamoria schrieb:
genau wegen der Max Execution möchte ich sleep nicht verwenden.
Ich habe das ganze mittels exec ausgeführt, unabhängig vom PHP Prozess. Was damit gemacht wird ist:
Bash soll sleep machen (eben die 100sek), und dannach dann dein PHP Script ausführen. Dabei wird ein unabhängiger Prozess gestartet, dein PHP Script läuft einfach zu Ende. Du kannst auch einfach ein Bashfile aufrufen, was genau diese Timeout Triggerung nachstellt, dass du nur das bashscript kurz aufrufst und fertig. Dabei nutze ich eine Besonderheit unter Linux halt aus, und das ist die Sprache Bash.
Unter Windows sollte es aber ähnliche Triggermöglichkeiten baubar geben. Du baust dir einen Batch (das pondon zu bash von Linux), und schreibst dort hinein:
@echo off
timeout /T 100 /nobreak
//Starte die PHP
Damit hast du ein Timeout, das ist das selbe wie ein Sleep. Dies funktioniert aber erst ab Windows7 aufwärts.
Starten kannst du dein PHP zum Beispiel mittels:
C:\PHP5\php.exe -f "C:\PHPScripts\script.php"
Und das Script aufrufen mit:exec( './mybatch.bat &' );
Da ich aber nicht weiß, wie Xampp aufgebaut ist, kann ich leider nichts konkretes geben. Ich bin nur unter Ubuntu unterwegs, hier kann man soetwas leichter aufbauen in meinen Augen.
Notfalls kannst du auch Python als zwischentrigger nutzen, dass du ein Pythonscript startest, welches ein Sleep ausführt, und dein zweites PHP Script ausführt. Das ist Plattformunabhängig. Du könntest den Server aber auhc mittels NodeJS selbst schreiben und das komplette System damit realisieren, und hier einfach ein Timeout nutzen. Du könntest auch mit NodeJS einen Timetriggerservice schreiebn, den du mit deinem ersten Script kurz per Stream anfragst, ihm eine Zeit sendest, und nach einem Timeout wird von NodeJS deine PHP Datei aufgerufen. Auch möglich. Es gibt viele Möglichkeiten, welche allerdings praktikabel ist bleibt dir überlassen.
Liebe Grüße -
die Ideen klingen ja ganz gut, wird aber so sein, dass es ziemlich viele Solche Scripte geben wird 100-1000 je nach unseranzahl und die Zeit kann schon mal 100.000 Secunden betragen. Hat das dann irgentwelche auswirkungen auf die Performance oder kann ich das problemlos machen?
-
kdhdamoria schrieb:
Das ist abhängig von der Ausführungszeit des verzögerten Scripts und wie oft so ein verzögertes Script aufgerufen wird bzw wie viele dieser Scripte gleichzeitig laufen... allgemein lässt sich das jedenfalls nicht sagen.
die Ideen klingen ja ganz gut, wird aber so sein, dass es ziemlich viele Solche Scripte geben wird 100-1000 je nach unseranzahl und die Zeit kann schon mal 100.000 Secunden betragen. Hat das dann irgentwelche auswirkungen auf die Performance oder kann ich das problemlos machen? -
das script was aufgerufen werden soll läuft weniger als 1 sekunde und nur 1 mal, mir geht es um den performaceverlust durch die Verzögerung burch batch/bash
-
Dann würde ich es nicht unbedingt mit Bash oder Batches machen. Auch Python, hmm. Also ich glaube dafür wäre tatsächlich der NodeJS Server das optimalste.
Wenn du dir einen vServer mietest kannst du NodeJS selbst kompilieren, und dann einen eigenen NodeJS-Server schreiben. Einfach:
http = require('http'); url = require('url'); path = require('path'); http.createServer( function( request , response ) { // anfrage in der form: ipadresse/?time=100&file=test.php var url = url.parse( request.url , true ); if ( url.query.time == undefined || url.query.file == undefined ) { response.writeHead( 404 ); response.end(); } else { response.writeHead( 200 ); response.end( 'true' ); setTimeout( function() { http.get( path.join( request.connection.remoteAddress , url.query.file ) ); } , parseInt( qString.time ) * 1000 ); } }).listen( 8080 );
Ob das funktioniert sei mal dahin gestellt, aber das wäre ein Beispiel, welches du natürlich für deinen Fall noch anpassen musst. Dann könntest du einfach deinen Host anpassen, das Script stark beschränken, damit es nicht abused werden kann usw. Wäre meine Variante, aber es gibt sicherlich noch andere. Jedoch hat man bei so vielen Prozessen vllt irgendwann Probleme auf einem kleinerem vServer oder so, und NodeJS ist dafür find ich super ausgelegt.
Liebe Grüße -
Wenn du dir Gedanken dazu machst solltest du einen Service (Server) schreiben, der eigenständig im Hintergrund läuft. Wenn du jetzt ein Script einplanen möchtest machst du das indem du dich mit einem Socket zu diesem Service hinverbindest und ihm die Verzögerung sagst. Der Service merkt sich das und startet nach der vergangenen Zeit das PHP-Script.
Dabei stellt sich natürlich die Frage: warum den Server nicht in PHP? Das spart ständige unnötige Übersetzungen und neue Prozesse... vorausgesetzt das Script ist richtig programmiert. Dann brauchst du auch kein NodeJS, C oder sonst was. -
Ja, in PHP könnte man das natürlich auch realisieren.
Schreib in eine Datenbank, welches Script zu welcher Zeit gestartet werden soll, und das mittels Cronjob so alle 10sek oder so. Dabei prüfe jeweils den ÄLTESTEN Eintrag der Datenbank, und arbeite immer nur einen zur Zeit ab. Für die Abfrage einen Lock auf die Datenbank, damit es nicht zweimal ausgeführt wird. und nach der Abfrage, sofern abgearbeitet wird, vor der Abarbeitung (durch include oder socket) die Zeile entfernen und Lock aufheben.
Dabei musst du aber schauen, wie du das mit dem Cronjob machst, ob das hinhaut von der Menge an auszuführenden Scripten. NodeJS wäre da exakt, aber bräuchte auch entsprechend einen Server der NodeJS kann (Leistung ist unerheblich, NodeJS ist sehr Performanceoptimiert). Das mit den Cronjobs kannst du an sich sogar auf Webspaces mit entsprechend schnellen Cronjobs hinkriegen.
Liebe Grüße -
ggamee schrieb:
Nein, ich meine das so, dass PHP standalone verwendet wird, also statt dem NodeJS. Dann muss das auszuführende Script nur 1x compiliert werden, es müssen nicht ständig neue Prozesse gestartet werden und du brauchst keinen Cronjob.
Dabei musst du aber schauen, wie du das mit dem Cronjob machst, ob das hinhaut von der Menge an auszuführenden Scripten. NodeJS wäre da exakt, aber bräuchte auch entsprechend einen Server der NodeJS kann (Leistung ist unerheblich, NodeJS ist sehr Performanceoptimiert). -
Unabhängig davon, wie man das Code-technisch umsetzt, hört sich das nach einer Art "job queue" an, in der nach Priorität und Ausführungszeitpunkt die Jobs eingetragen werden, und durch einen "Worker-Thread", einen Cronjob mit kurzem Zeitintervall oder was auch immer, abgearbeitet.
Hier beispielsweise wären Pakete angeführt, mit denen sich sowas umsetzten lassen soll.
gearman, beanstalkd, RabbitMQ, etc.
Auch hier wird Gearman empfohlen. -
da ich die einzelnen Scriptaufrufe sowieso in einer Datenbank mit zeit abspeichere, könnte ich ja in dem Aufrufscript eine Bash für den nächsten Aufruf erstellen.
Die Idee kommt mir leider erst jetzt -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage