Hej,
Jag har byggt ett script som jag vill ska köras i "bakgrunden", typ som cronjobb, fast inte schemalagt.
Scriptet i sig hämtar info från en databas, parsar ett gäng XML filer som sedan sparas som en zipfil och mailas till mig som en bilaga.
Jag vill att man som användare ska kunna "trigga" det här "jobbet", fast man ska inte behöva vänta på att det exekveras, utan man ska "starta" scriptet och sen är det bra, så att säga.
Hur gör man enklast? Kan man använda sig av t.ex. shell_exec(); och ange vilken fil som ska köras genom /bin/php (eller vad sökvägen nu är)?
drewMedlem sedan mars 2007845 inlägg shell_exec() har jag aldrig testat. Däremot vet jag att exec() kan köras i bakgrunden. Se till att skicka output från programmet / skriptet till en fil eller /dev/null. Annars väntar php på att den ska köras klart.
Just det, ska kolla mer på exec();
En annan variant som jag tänkte på skulle kunna vara:
1. Man har en tabell i databasen där man sparar de här "jobben".
2. Användare anger att en viss funktion ska "starta".
3. Ett cronjobb körs varje kvart och kollar vilka script som har flagga "starta".
4. Dessa körs och när dom är klara sätts flagga "stopp" i databasen på det scripet.
På så sätt kan man även kolla vilka som körs just nu, av vem de startats och när.
Eller går den infon att få fram på annat, smidigare sätt?
Vilken är den bästa lösningen?
drewMedlem sedan mars 2007845 inlägg Ska skriptet köras med minst en viss tid mellan körningarna så måste du spara någonstans när den senast kördes.
Sätt tid och "körs" när skriptet startar. Då vet nästa som försöker köra den att den håller på. Sen sätter du "klart" och tid när den är klar. Så kan du köra nästa gång när gränsen är nådd igen eller om den har kört för länge. Om "körs" är satt mer än ex en timme så kan man nog anse att den kraschat.
Vill du ha mer info är det bara att fylla på. Men då måste du ha en rad för varje gång skriptet körs. Eller så skriver du det i en loggfil som du raderar / tömmer när du läst det du vill och spar plats i databasen.
Just det, ska nog göra på det sättet. Scriptet tar i nuläget ~10minuter att köras klart så om mitt cronjob körs var 15'e minut så är det alltid "nära" till "nästa körning".
Fyll gärna på med fler förlag om det finns.
Nu har jag fixat det här och det fungerar nästan som det ska.
Mitt script parsar ett gäng filer, packar ihop till en zipfil som sedan mailas till mig.
När jag kör scriptet direkt i browsern funkar allt precis som det ska, efter ~10min får jag ett mail med filen.
Men när cron triggar filen, parsas alla filer, packas ihop till en zip men sen händer inget mer, jag får aldrig något mail.
Vad kan det bero på?
Det här löste jag tillslut. Felet var att min klass som skapade zipfilen fungerar inte när scriptet körs via cron, men samma kod funkar via webbläsare.
Vet inte exakt vad det beror på, men jag gjorde om så att alla filer bifogas separat och det fungerar hur bra som helst.