Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: PHP- / cron job -ongelma

Slowdowns [14.10.2011 18:10:34]

#

Hei,

olen kirjoitellut php:llä suhteellisen yksinkertaista palikkaa, joka hakee verkosta tietyn määrän RSS-feedejä ja parsii ne muotoon, jossa sekalaista sisältöä on helppo selailla. Hakiessaan aina tuoreimmat feedit palvelu toimi kuitenkin melko hitaasti, joten päätin kokeilla ns. cron jobin luomista, jossa RSS-tiedostot tallennettaisiin säännöllisin väliajoin omalle palvelimelle, josta niiden lataaminen olisi aina huomattavasti nopeampaa.

Sivuston DirectAdmin-hallintapaneelista löytyi paikka skriptin määrittämiselle, ja sen sainkin ilmeisesti toimimaan — nyt määrittelemäni php-tiedosto ajetaan viiden minuutin välein. Ongelmana on kuitenkin se, että varsinaista tehtäväänsä — tiedostojen tallentamista — skripti ei cron jobilla ajettuna osaa tehdä. Kun itse ajan manuaalisesti skriptin, se toimii ongelmitta.

include_once('feeds_fi.php');

for($i = 0; $i <= count($feeds); $i ++){
	$feedme = file_get_contents($feeds[$i]);
	$fh = fopen('../feeds/fi/feed_'.$i.'.xml', 'w+');
	fwrite($fh, $feedme);
	fclose($fh);
}

Yllä säännöllisin väliajoin ajettava skripti. Ensin haetaan toisesta tiedostosta lista ladattavista feedeistä, loopataan kaikki läpi, luetaan feedi kerrallaan sen sisältö, avataan vastaavalla numerolla merkattu feedi omalta palvelimelta, tallennetaan uusi versio tilalle ja suljetaan tiedosto. Suoraan ajettuna siis toimii, cron jobilla ei.

Osaisiko joku jelppiä?

Metabolix [14.10.2011 18:14:37]

#

Mitä tarkoittaa "suoraan ajettuna"? Entä ajatko sen cronissa suoraan (php skripti.php) vai HTTP-pyynnön avulla (esim. wget http://palvelin/skripti.php -qO-)? Jos et saa muuten toimimaan, wget voi olla hyvä ratkaisu.

Lue virheilmoitukset, sieltä varmaan vika selviää. Veikkaan, että työhakemisto on eri ajotavoilla erilainen, jolloin korjaukseksi saattaisi riittää seuraava rivi PHP-tiedoston alussa:

chdir(__DIR__); // PHP 5.3.0
chdir(dirname(__FILE__)); // Vanhemmat

Toisaalta kannattaa miettiä myös, onko mitään hyötyä hakea tietoja säännöllisesti (eli onko palvelulla aina ja öisinkin käyttäjiä viiden minuutin välein) vai olisiko parempi tehdä päivitys sivunlatauksen yhteydessä silloin, kun tiedot ovat vanhentuneet (filemtime("data.xml") < time()).

Slowdowns [14.10.2011 18:30:38]

#

Ah, suurkiitokset!

Tuon vinkkaamasi rivin lisääminen näyttäisi ratkaisseen ongelman. Viitsisitkö vielä selventää mitä tuo käytännössä tekee — pikaisella googlettelulla en tuota löytänyt?

Ja totta, tuollainen tarpeen tullen tehtävä päivittäminen olisi varmaan vielä fiksumpi. Viiden minuutin välein uusien tiedostojen hakeminen nyt on ainakin turhan tiuhaa, mutta tuo olikin lähinnä testimielessä määritelty.

Kiitokset vielä!

Metabolix [14.10.2011 18:40:11]

#

__FILE__ = nykyisen kooditiedoston koko polku, "/a/b/c/d.php".
__DIR__ = dirname(__FILE__) = kyseisen polun hakemisto-osa, "/a/b/c".
chdir = funktio, joka vaihtaa nykyistä työhakemistoa.

Varmasti olisit saanut tämän kaiken itsekin selville syöttämällä palaset yksitellen hakukoneeseen.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta