Gå til innhold

CRONJOB erstatning - To php filer i uendelig loop?


Anbefalte innlegg

Heisann folkens

 

Jeg hoster en site et sted som ikke tillater CRONJOB, og har derfor "spekulert meg grønn" hvordan jeg skal kunne løse "problemet" uten å skifte webhostleverandør.

 

Er det mulig å kjøre to php filer i loop, slik at de trigger hverandre?

 

Her er hva jeg tenker.

 

Starte trigger.php i fra en browser.

 

trigger.php's eneste oppgave er å starte main.php

main.php utfører følgende {

1. åpner en database
2. henter ut databaseinnhold
3. utførere en oppgave med innhentede data.
4. lukker databasen
5. starter en teller som skal telle 60 sekunder før den:
6. gjør et kall til trigger.php
7. avsluttes
}

trigger.php utfører følgende: {
1. starter main.php igjen
2. avsluttes
}

main.php starter og {
1. åpner database
2. blabla osv
osv gjentar sin oppgave igjen
}

prosessen gjentar seg i uendelig loop

 

Er dette mulig, og hvordan kan jeg gjøre det?

 

Er det andre og bedre løsninger som erstatning for en CRONJOB?

 

Mvh

Roger

Lenke til kommentar
Videoannonse
Annonse
hehe... artig tanke. har aldri tenkt på det før. aner ikke om det fungerer, men det finnes jo en enkel måte å finne ut av det på ;) første problemet jeg kan tenke meg er at hvis serveren stopper vil alt stoppe.

I punkt nr. 6, kan den ikke reloade seg selv istedenfor?

Er ikke noe problem hvis serveren stopper, da trigger jeg bare fra en browser igjen, forresten er min host veldig stabil, så jeg tror ikke dette blir et problem

 

Vedr. pnkt. 6, ja hvis det er mulig at filen kan trigge seg selv, så er det jo enda bedre, men jeg har ikke peiling hvordan løse oppgaven.

 

Roger

Lenke til kommentar

Ok, jeg har koden ellers, men forstår ikke helt hvordan jeg lager den telleren:

 

Her er hva jeg har:

 

<? 
//Lager en klasse 
class db 
{ 
//Noen variabler

funksjon connect_til_db()
{
// åpner db
}

funksjon utfør_oppgave()
{
// utfører oppgave
}

funksjon close_db()
{
//lukker database
}

funksjon teller()
{
//aktivere teller som teller ned 60 sekunder (denne koden trenger jeg hjelp til)
}

funksjon trigger()
{
header ("Location: main.php")
}

} Avslutter klasse

//Vi lager et nytt objekt 
$obj =& new db; 
//Så kaller vi opp funksjonene våre 
$obj->connect_til_db(); 
$obj->utfør_oppgave(); 
$obj->close_db();
$obj->teller();
$obj->trigger();
?>

 

Er jeg på rett spor ellers?

Lenke til kommentar

Ja, nå snakker dere MILEVIS over hodet på meg, jeg er ingen php koder, er faktisk totalt grønn på php, men jeg forsøker da :-)

 

Hvis max execution time er 30 sekunder, så må jeg vel likevel ha 2 filer som trigger hverandre, hvor hver av dem har en teller på 30 sekunder hver?

 

Og hva er php-cli modus?

 

Til Torbjørn

Det jeg forespør her, er jo nettopp hjelp til hvordan løse oppgaven UTEN browseren, ved at filene trigger hverandre, ETTER at jeg først har trigget første filen med browseren for å starte "loopen"

Sagt på en annen måte: Hvis jeg VISSTE svaret på hvordan løse oppgaven, så ville jeg jo ikke ha behov for å spørre om hjelp :-)

 

Roger

Endret av RogerM
Lenke til kommentar

Er det mulig å gjøre det slik:

 

Jeg har en HTML side som mottar mye trafikk (flere treff i minuttet)

 

Kan et kall til main.php legges inn i HTML filen, som da aktiverer main.php hver gang noen besøker HTML siden.

 

main.php aktiveres så, men gjør først en validering, evt. mot en lokal database eller en annen fil/funksjon som holder styr på tellerfunksjonen, slik at HVIS det er mer enn 60 sekunder siden main.php fikk lov å fullføre sin oppgave, så TRIGGES DEN IGJEN, hvis det er mindre enn 60 sekunder siden main.php sist utførte sin oppgave så avsluttes den uten å utføre sin oppgave?

 

Valideringen vil så repeteres neste gang noen besøker HTML siden

 

Skal tilføye her at jeg vil main.php skal utføre sin oppgave i det skulte, den har ikke noe relasjon til temaet på HTML siden eller til den besøkende, og den besøkende skal ikke kjenne til main.php eller dens funskjoner, jeg ønsker bare å "utnytte" den besøkende til å fungere som en trigger for den skjulte prosess.

 

Er dette en mulig løsning?

Endret av RogerM
Lenke til kommentar

Hva er det du egentlig skal lage?

 

funksjon utfør_oppgave()
{
// utfører oppgave som er å oppdatere en html fil med innholdet i databasen
// dette er en helt grei oppgave som jeg har ferdig kode til, og det er derfor ikke
// denne funksjon jeg søker hjelp til her på forumet
}

 

Det jeg søker hjelp til er hvordan løse en CRONJOB-linknende funksjon slik at jeg kan få utført oppdateringen av html filen HVERT 60 SEKUND, uten å ha CRONTAB tilgjengelig. :-)

 

Når det gjelder problemet ditt, så kan du vel sette opp en cron fra en annen server.

 

Dette vil kreve at jeg kjøper hosting et annet sted, kun for å kjøre EN enkel CRONJOB, og det syns jeg er rimelig sløsing med penger, hvis det er mulig å løse oppgaven ved hjelp av kanskje enkel og KREATIV kode på den webplass jeg allerede har. :)

Endret av RogerM
Lenke til kommentar
Gjest Slettet-rXRozPkg

Kan du ikke heller legge til en timestamp i databasen?

Så kan du sjekke om det er 60 sekunder eller mer siden HTML filen blei generert.

Hvis så, generer ny HTML fil, og send brukeren vidre, hvis ikke send brukeren rett til HTML fila...

 

Kan du også utdype hvorfor det er så viktig at fila skal oppdateres hvert 60 sekund (og ikke hver gang noen spørr etter fila)?

 

Jeg har en HTML side som mottar mye trafikk (flere treff i minuttet)

Hvor mye er det? Snakker vi om 30+ treff så kan jeg skjønne at en oppdatering i minuttet holder for å ikke skape så stor last på serveren.

Endret av Slettet-rXRozPkg
Lenke til kommentar

php-cli: kommando linje modus.

Og i så tilfelle kan du bare glemme max execution time, er rimelig sikker på at den ikke gjelder da.

Har kjørt skript som har gått i uendelig loop i et døgn.

Dette er veldig lett.

 

while (true != false) {

// gjør saker og ting

}

 

Vil gjøre susen. Eller for å lage en mulighet der skript kan avsluttes når noe bestemt skjer:

 

define(UENDELIG, 'YES');

while (UENDELIG == 'YES') {

if (uendelig skal avbrytes) {

define(UENDELIG, 'NO');

}

}

Lenke til kommentar

Er enig med Fjartan

 

Det er lett å la det "gli ut" med snakk om ting som egentlig ikke har så mye med oppgaven å gjøre, altså "utenomspørsmål" som kanskje forvirrer mer enn de klargjør.

 

Så derfor vil jeg oppsummere.

 

1. Jeg har behov for å kjøre en CRON-liknende funksjon på et php script, og CRON er IKKE tilgjengelig på min webplass. Det er IKKE aktuelt for meg å leie ekstra webhosting et annet sted, kun for å kjøre EN enkelt CRON-jobb, og jeg har IKKE mulighet til å kjøre CRON fra "utrangert maskin hjemmefra" da jeg her ikke kan være påkoblet nett 24 timer i døgnet. (Muligheten for å løse oppgaven via en browser med autorefresh (avant, opera, crazybrowser etc) hvert 60 sekund er derved også utelukket)

 

ALTSÅ: Jeg søker en løsning som ERSTATTER funksjonen som CRON utfører, i det CRON ikke er tilgjengelig for meg.

 

***

 

2. HOVEDFILA I FOKUS, er en main.php, beliggende på min webplass, som hvert 60 sekund skal tilkoble en REMOTE database, hente ut innholdet i databasen, og skrive innholdet til (oppdatere) en STATISK html fil. (For å unngå forvirring med det som senere kommer av forklaring og forslag, kaller vi denne statiske html fila for RESULTAT.HTML)

 

Årsaken til HVORFOR main.php skal kjøres hvert 60 sekund (hverken mer eller mindre) er at eieren av REMOTE DATABASE ikke ønsker høyere frekvens enn hvert 60 sekund, samt at data oppdateres med nye detaljer såpass mange ganger pr. minutt at det forringer kvaliteten på visningen av RESULTAT.HTML dersom den oppdateres med lavere frekvens enn hvert 60 sekund.

 

Så vi må akseptere at "oppgaven" skal løses med kjøring av main.php hvert 60 sekund, slik at den får samme effekt og nytteverdi som om vi hadde CRON tilgjengelig, noe vi ikke har, altså må jeg lete etter andre løsninger via KREATIV koding....om slikt er mulig.

 

***

 

3. Torbjørn nevnte her over:

... og problemet ditt er at alle prosesser trigget av din browser i utgangspunktet vil dø når browseren bryter forbindelsen med serveren

Hvis Torbjørn har rett, HVIS han har rett, så betyr dette at jeg IKKE kan kjøre 2 php filer i loop, hvor den ene trigger den andre, hvor main.php utfører den ønskede funksjon og deretter aktiverer trigger.php, og hvor trigger.php egentlig er en teller som igjen sørger for å gjenstarte main.php hvert 60 sekund. Altså Torbjørn mener en slik loop er umulig å få til - HAR TORBJØRN RETT?

 

 

***

 

4. Med bakgrunn i Torbjørns påstand, legger jeg så frem et alternativt forslag til "angripelse av problemstillingen"

 

Jeg sier at jeg på SAMME webplass, også har en vanlig HTML webite (INDEX.HTML) som pr. tiden mottar ENORME mengder trafikk (kanskje flere hundrede treff pr. minutt). Denne website (med INDEX.HTML) har INGEN relasjon til den PHP oppgave jeg her på forumet søker hjelp til, og nevnte website har INGEN logisk tilknytting til det OUTPUT jeg ønsker HOVEDFUNKSJONEN her skal gi av oppdateringer i RESULTAT.HTML (nevnt i punkt 2 over)

 

Den ENESTE grunn til at jeg her trekker inn nevnte website (INDEX.HTML), er at jeg kanskje kan ane en mulig løsning i at TRAFFIKKEN til denne INDEX.HTML samtidig skal kunne NYTTEGJØRES som den TRIGGERFUNKSJON som om mulig kan AKTIVERE main.php, slik at main.php utfører sin oppgave og oppdaterer RESULTAT.HTML hvert 60 sekund.

 

Da INDEX.HTML mottar så mye trafikk som den gjør, så kan IKKE main.php trigges HVER gang noen besøker INDEX.HTML, i det main.php da vil komme til å gjøre kall til REMOTE DATASE oftere enn hvert 60 sekund, og eieren av REMOTE DATABASE kan bli GALLESUR OG FORBANNET og stenge av databasen for meg.

 

ALTSÅ: HVIS trafikken til denne INDEX.HTML, i det skjulte også kan "konverteres" til å være de konstante triggere som aktiverer main.php, så må der også implementeres en form for VALIDERING hver gang main.php trigges, en VALIDERING som sjekker om det har gått minimum 60 sekunder siden FORRIGE gang main.php ble trigget og utførte sin oppgave.

 

Hvis main.php trigges (aktiveres) og valideringen sier at det er MINDRE ENN 60 SEKUNDER siden main.php sist utførte sin oppgave, ja så skal main.php avsluttes UTEN Å UTFØRE OPPGAVEN (oppdateringen av RESULTAT.HTML)

 

Hvis main.php trigges (aktiveres) og validering sier at det er MER ENN 60 SEKUNDER siden main.php sist utførte sin oppgave, ja så skal main.php gå i gang med å utføre sin tiltenkte oppgave (oppdateringen av RESULTAT.HTML)

 

*****

 

Ble dette noe klarere for dere som forsøker å hjelpe?

 

ELLER FINNES DER ANDRE LØSNINGER, innenfor rammen av de premisser jeg har blitt tildelt av min webhost provider?

 

Roger

Lenke til kommentar

du har så jevn og stor trafikk til index.html at du vil bruke disse hitene til å trigge din cronjob? pass isåfall på at det ikke tar lang tid!

 

Kjedelig for en besøker å vente i 10 sekunder på å få lastet siden bare fordi du utnytter han til å kjøre cronjobber.

 

Min påstand er en sannhet med modifikasjoner.

 

det går an å "dameonize" en prosess i andre språk, (eks perl), sikkert også php.

 

du må gjøre en "fork" og en "setsid" for å løsrive fork'ede prosessen fra "parent process"

 

hvis dette er lyse-gresk for deg så blir det vanskelig, men det går an å søke på google etter relevant informasjon med søkeord som php fork og setsid.

 

men igjen - hvorfor ikke kjøre cronjob på en lokal pc? denne cronjobben kan kalle opp et phpscript på serveren hvert 5. minutt...

 

EDIT: Nei ser at du ikke kan kjøre cron hjemmefra. Merk at hvis du kjører dette på webserveren (får til bakgrunnsprosesser) blir isp muligens sur...

Endret av Torbjørn
Lenke til kommentar
php-cli: kommando linje modus.

Og i så tilfelle kan du bare glemme max execution time, er rimelig sikker på at den ikke gjelder da.

Har kjørt skript som har gått i uendelig loop i et døgn.

Dette er veldig lett.

 

while (true != false) {

// gjør saker og ting

}

 

Vil gjøre susen. Eller for å lage en mulighet der skript kan avsluttes når noe bestemt skjer:

 

define(UENDELIG, 'YES');

while (UENDELIG == 'YES') {

if (uendelig skal avbrytes) {

define(UENDELIG, 'NO');

}

}

Findus

 

Kan du gi et noe mer detaljert og KONKRET kodeeksempel, slik at jeg som er TOTALT GRØNN på PHP kan ha en bedre mulighet til å lære av deg og dine eksempler?

 

Også, kan du utdype, gjerne med ytterligere et KONKRET eksempel på hvordan man starter en php fil i "php-cli: kommando linje modus", og sørger for at den blir værende aktiv i dagevis?

 

Igjen må jeg presisere, at jeg IKKE KAN PHP, men forsøker å lære, og gjør så godt jeg kan, men dere må snakke til en "førskole-elev", og ikke som om dere snakker til datahøyskolestudent. :(

 

Jeg er veldig takknemlig for at du forsøker å hjelpe, så ikke ta dette som negativ kritikk, jeg vil bare forsøke å hjelpe deg til å hjelpe meg bedre, slik at jeg får bedre forutsetninger for å forstå hjelpen din ;)

 

Roger

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...