Gå til innhold

Få php til å kjøre et script automatisk hver time


Anbefalte innlegg

Hei.

 

Er det noen som har et tips om hvordan jeg kan få PHP til å kjøre et script med jevne mellomrom automatisk, f.eks. hver time?

Er det i det hele tatt i PHP jeg skal gjøre det, eller er det muligens noen instillinger på webserveren jeg må gjøre?

 

Jeg VET at det er mulig. Jeg har sett det blitt gjort på noen online spill, bl.a. et ved navn Planetarion, et slags strategispill hvor alle spillerne f.eks fikk penger hver time og slikt.

 

Det kan hende jeg er helt på jordet ang. hva som må til for å få det til, men det er derfor jeg spør :)

Lenke til kommentar
Videoannonse
Annonse

Det lar seg fortsatt løse. Du kan enten bruke planlagte oppgaver, men den er det vel begrenset hvor mange ganger om dagen du kan kjøre ved mindre du legger til veldig mange oppgaver.

 

Løsning 2 er å sette timeout grensen litt lengre i det scriptet som skal kjøres set_time_limit() og bruke funksjonen sleep(). Da kan du bare få scriptet til å "sove" i et par sekunder, minutter eller timer - så kjøres det igjen.

Lenke til kommentar

dostojevski: det er det jeg ikke er helt sikker på, derfor spør jeg her :p

Det med å bruke php ifra kommando linja hadde jeg forsåvidt ikke tenkt på. det skal prøves :)

 

fjartan: ja. php scriptet stopper når du lukker nettleseren, men hva om webserveren har oppe en webside som konstant kjører php scriptet jeg hadde tenkt å kjøre?

 

Det jeg har kommet fram til ved hjelp av infoen fra ???????? er å gjøre noe som dette:

<?php

$ting=0;

 

//skru av time limiten så ikke scriptet stopper etter en stund

set_time_limit(0);

 

while (1)

{

//gjør ting og tang hvert minutt f.eks

$ting++;

//vent et minutt før scriptet fortsetter

sleep(60);

}

?>

 

Er det noe som egentlig bør unngås, det å gjøre det på denne måten?

Lenke til kommentar

Uten å påberope meg orakelmyndighet på dette:

 

Jeg mener å tro at å kjøre et slikt script i loop er en ganske ressurskrevende løsning. Som et minimumskrav bør du legge inn en sperre slik at scriptet terminerer hvis det kjøres fra andre iper.

 

Spør igjen: hva skal du gjøre? Er det virkelig NØDVENDIG å kjøre det hvert minutt/time/sekund/etc. ? Mange oppgaver kan løses ved å kalle et script hver gang index-siden lastes, og kjøre oppgaven hvis en tidsgrense er oversteget.

 

<<<nysgjerrig-modus>>> :)

Lenke til kommentar

Dersom du kjører det lokalt på maskinen din er det vel neppe noe særlig problem å kjøre et script som det. Det er litt avhengig av hva scriptet skal gjøre om det er å anbefale å løse det på den måten.

 

Windows og PHP er ikke den beste kombinasjonen for stabilitet, ved mindre du kjører Zend Winenabler - så det kan være lurt å sette en timelimit på scriptet og laste siden manulet en gang i blandt.

Lenke til kommentar

å sleep'e søtt i en time er ikke ressurskrevende, som mikaelandre poengeter er dette vanlig i java, der sover man ofte bare et par millisekunder og maskinen er mer enn uthvilt etter det :)

 

men du (trådstarter) har fortsatt ikke sagt hva du skal gjøre? Hvis du er usikker på om php er rette verktøy for jobben bør den informasjonen fram...

Lenke til kommentar

dostojevski: Det jeg hadde tenkt å prøve, er å lage et lite online spill, slik som f.eks planetarion (bare ikke så stooort :p). Og da tenkte jeg at jeg skulle kjøre et script f.eks hvert minutt, for å gi hver spiller mer ressurser og slikt og oppdatere alt mulig. Ettersom php ikke er "realtime" så må jeg gjøre det på en slik måte. :)

 

En ting jeg har tenkt litt på etter jeg lagde denne tråden, er å rett og slett lage et lite program i f.eks c++ ellerno, som kjører et php-script med jevne mellomrom.

Når/hvis det blir gjort skal jeg legge det ut på forumet her, i tilfelle noen fler enn meg har tenkt å gjøre det samme (kjøre script med jevne mellomrom) :)

 

PS: Beklager litt sent svar :p

Lenke til kommentar

Om du skal lage et online-spill vil jeg _IKKE_ anbefale å kjøre det via et PHP-script; få det ned på assemblernivå, f.eks. via C++. Det du er ute etter er et system som greier å kjøre alle "krigene", tildeling av ressurser etc. i løpet av sekunder. Jeg har laget et online-spill og kjørte det via et cron-script i PHP, noe som tok nærmere 15 sekunder å kjøre når jeg spilte med meg selv...... Gjett hvor lang tid det kommer til å ta hvis du skal faktisk gjøre noe (med 1000 brukere kommer ikke scriptet til å bli ferdig før neste spill begynner...)

 

 

Men i hvertfall, om du bare skal ha noe enkelt:

 

$run_every = 60; // kjør hvert 60. sekund

$q = query("SELECT value FROM config WHERE config = 'last_run'");
$r = fetch($q);

if($r->value <= time()-$run_every) { // hvis den sist ble kjørt for mer enn $run_every sekunder siden....
include_once 'script_to_run.php';
query("UPDATE config SET value = value + $run_every WHERE config = 'last_run'"); // Oppdater sist kjørt til sist kjørt + run every, dermed vil scriptet kjøres flere ganger om maskina har stått av/ingen har besøkt siden...
}

 

Det blir sånn grovt hvordan det bør gjøres, selv om det ikke er særlig ideelt.... Men var sånn jeg greide å overleve sommerferien på vannet i fjor på en windows 98, 133MHz laptop....

Lenke til kommentar
[quote name='laaknor' date='26/07/2004 : 11:18'] Om du skal lage et online-spill vil jeg _IKKE_ anbefale å kjøre det via et PHP-script; få det ned på assemblernivå, f.eks. via C++. Det du er ute etter er et system som greier å kjøre alle "krigene", tildeling av ressurser etc. i løpet av sekunder. Jeg har laget et online-spill og kjørte det via et cron-script i PHP, noe som tok nærmere 15 sekunder å kjøre når jeg spilte med meg selv...... Gjett hvor lang tid det kommer til å ta hvis du skal faktisk gjøre noe (med 1000 brukere kommer ikke scriptet til å bli ferdig før neste spill begynner...) [/quote]
Det jeg prøver på er ikke å lage et RTS som f.eks Command & conquer, warcraft, starcraft o.l., men et spill som går over (mye) lengre tid.
Sjekk ut www.planetarion.com . Jeg er sikker på at det står mye bedre forklart der enn det jeg klarer å forklare :p
Og det er et spill som har mange tusen spillere.

Nå er ikke jeg sikker på om planetarion ER laget i PHP/mysql, men jeg vet om en klone av det spillet (som jeg forøvrig ikke husker navnet på) som er laget i nettopp php og mysql.

Jeg er klar over at hvis jeg skal lage et spill som kjører i realtime, som f.eks. C&C, SC eller WC, så går ikke det i PHP. Men det er som sagt ikke det jeg prøver på.

Takk for alle svar :)
Lenke til kommentar

Jeg har skjønt det. Spilte Planetarion, nukezone.nu og dawnofmyth en stund, så jeg veit hva slags spill det er.

 

nukezone er laget i ASP

planetarion er laget i Perl ser det ut til

og dawnofmyth er laget i PHP (veit dog at backenden kjører i C)

 

Men fortsatt, det du trenger er å ha en backend som gir penger/ticks ol. i løpet av max 2 sekunder. Ellers kan man utnytte (akkurat hvordan det kan utnyttes er litt avhengig av hvordan systemet programmeres.)

 

Du kan godt lage et realtimespill i PHP, men du vil nok ha problemer med å lage noe annet enn tekstbaserte systemer (okey, du kan lage dynamiske bilder/flashanimasjoner med det, men du vil nok få problemer med at du ikke får plass til flere maskiner i clusteret som trengs for å drive det etterhvert).

Lenke til kommentar
Aha.
Nå skjønner jeg hva du mener.
Men kan virkelig et php script som kjører igjennom tabellene i mysql og oppdaterer dem (legger til ressurser osv.) virkelig være så tregt?

Dette er jo ikke et prosjekt som jeg forventer å bli veldig stort, for meg er det for det meste bare et prosjekt som jeg har hatt lyst til å få til, for morro skyld liksom. :)
Lenke til kommentar

Ja, det blir tregt fordi all koden må kjøres nedover fra selve scriptet, mot PHP-enginen, gjøres om til assembler og kjøres for hver gang scriptet starter. Det er mye jobb for maskina, og det tar tid. Det er derfor en fordel å få det direkte ned i assembler så man slipper å kompilere scriptet hele tiden (okey, PHP cacher noe og kompilerer bare dersom det ikke har vært gjort noen endringer på scriptet, men det tar fortsatt tid å sjekke om det har skjedd endringer).

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...