Newsgroup: it.comp.www.php
Titolo: eseguire script php ogni due ore (su hosting aruba)

Salve,
ho uno script php che esegue dei controlli sue delle pagine di un mio 
sito web.
Avrei necessità di eseguire tale script ogni due ore, tutti i giorni 
della settimana;
al momento gira sulla mia macchina, lanciato da cron.
Mi farebbe piacere metterlo online su un hosting (aruba per esempio), ma 
non avendo
accesso a cron, e tantomeno a una shell su quel server, non saprei 
proprio come fare
(trattasi di un economicissimo hosting aruba)...
La domanda:
è possibile far eseguire a una pagina web delle azioni, temporizzate, 
senza che essa
venga contattata da un client (browser)?
Ovvero, la pagina "camperebbe" di vita propria, eseguendo, una volta 
messa online,
delle azioni i cui risultati verranno memorizzati in un db.
Grazie a tutti per eventuali risposte!
Un saluto, e buona serata.
Gabriele

 verranno memorizzati in un db.
Le possibili soluzioni che mi vengono in mente:
1) Se il sito ha frequenti accessi e se puoi accettare un certo errore
tra un'esecuzione e quella successiva, in ogni sua pagina potresti
aggiungere uno script che verifica quanto tempo č passato dall'ultima
esecuzione. Se sono passate piů di tot ore, avvia l'esecuzione,
altrimenti no.
2) Utilizzare un servizio di webcron. Prova a cercare con Google. Non
ne ho mai utilizzato uno, per cui non posso dirti molto di piů.
3) Spostare il sito su un hosting che metta a disposizione cron.
Al momento non mi viene in mente altro.
Ciao.
-- 
Federico

 Ciao.
Un saluto.
Gabriele

 Sai consigliarmi qualcosa?
Quanto spendi ora? E che confugirazione hai?
E quanto sei disposto a spendere?
--
rob4you

 da nessuno...dovrebbe "girare" da sola :)
Puoi fare in modo che restituisca in output una gif trasparente e  
includerla in ogni pagina
con <img src="/indexer.php" />.
Se il tuo sito riceve un buon numero di visite può funzionare senza  
problemi, l'utente non si accorge di niente e la pagina non viene  
minimamente rallentata (visto che l'immagine per sua natura viene caricata  
in modo asincrono rispetto alla pagina principale)
Dokuwiki funziona così.
http://www.sitepoint.com/blogs/2005/11/03/web-bugs-for-job-scheduling-hack-or-solution/
http://wiki.splitbrain.org/wiki:indexer?s=indexer
http://dev.splitbrain.org/reference/dokuwiki/nav.html?lib/exe/indexer.php.source.html
Tac
-- 
Using Opera's revolutionary e-mail client: 
http://www.opera.com/mail/

 l'utente non si accorge di niente 
Ma in questo modo la barra/icona di caricamento del browser continua a 
girare, giusto?
Da quanto ho capito _kOws voleva far eseguire uno spider. Supponendo 
che questo spider resta in esecuzione per alcuni minuti prima di 
completare il lavoro, se non erro (correggimi se sbaglio), se l'utente 
chiude il browser, o cambia pagina, l'esecuzione viene interrotta, 
quindi non più portata a termine, o no?
Sicuramente un sistema gratuito, e funzionante senza problemi, è l'uso 
dei cron via web.
--
rob4you

 cron via web.
Dovrebbe chiedere ad Aruba se gli danno questo servizio, o spulciare meglio 
le condizioni e i piani vedendo se a un qualche prezzo gli viene data la 
gestione dei crontab.
ciao,
Luca(riello) 

 problemi
Una soluzione che ricordo avrei voluto implementare in quel caso, per
divertimento più che necessità, era una sorta di ping-pong infinito tra
due pagine php (tanto lo spreco di risorse del server importa poco ;-D).
Una volta avviato, la prima pagina avrebbe richiamato la seconda dopo un
tot di tempo, e viceversa. Se proprio si voleva minimizzare lo spreco di
risorse per server, si poteva prevedere l'uso di N server diversi.
Ecco come sprecare tempo nel cercare soluzioni che mai si attueranno. ;)
Ciao
Maverick
-- 
«Che non siete più liberi di non avere una casa con letto per dormire.
 Lavorate voi - schiavi dei soldi - che non sentite la puzza della
 schiavitù!» (a Mario di Monte Mario, Roma) # 
http://libre.netsons.org/

 Una soluzione che ricordo avrei voluto implementare in quel caso, per
pazzo :-)
ciao,
Luca(riello)

 che poi si occuperà di rigirartelo (che è quello che gestisce i socket).
Hai ragione Luca, come sempre! :-)
Ho provato a eseguire un semplice script che mi inseriva dei dati in un 
db dopo dieci secondi di sonno. Anche quando chiudevo la pagina prima 
dei dieci secondi, i dati erano correttamente inseriti nel db dopo il 
periodo di sonno.
Grazie per l'info, non si finisce mai di imparare. :-)
Credo resti però il fatto che, anche nascondendo il codice in una gif 
trasparente di un pixel, il browser dovrebbe conitnuare a mostrare la 
barra/icona di caricamento, giusto?
--
rob4you

 barra/icona di caricamento, giusto?
questo si... ma sempre meglio che farlo aspettare nel vuoto è.
ciao,
Luca(riello) 

 Se qualcuno sa qualcosa in più che parli ora :-)
Già, sarebbe prezioso sapere bene come funziona il tutto, in modo da 
potersi comportare di conseguenza.
Alla fine, da un punto di vista di richiesta al server, non riesco bene 
a capire perché c'è differenza tra esecuzione tramite linea di comando, 
e tramite browser.
Dico una ca...ata, o quando lo eseguo tramite linea di comando il 
server ne resta fuori?
Lo chiedo perché finora php lo ho sempre "visto" da browser, quindi non 
so bene come avvienein dettaglio il funzionamento da linea di comando.
--
rob4you

 temporale!
try {
    $fd = fsockopen ('localhost', 80, $errno, $errstr, 10 );
    fputs ($fd, "GET /heavy_script.php HTTP/1.0\r\n" .
                "Host: localhost\r\n\r\n");
} catch (Exception $e) { }
Non va bene? ;-)
Ciao.
Maverick
-- 
ĢChe non siete pių liberi di non avere una casa con letto per dormire.
 Lavorate voi - schiavi dei soldi - che non sentite la puzza della
 schiavitų!ģ (a Mario di Monte Mario, Roma) # 
http://libre.netsons.org/

 ne resta fuori?
Certo che no!
Quando lo esegui via browser tu interpelli il web server (nel mio caso 
Apache) in ascolto su una porta (in genere l'80) che si preoccupa poi di far 
elaborare al php.exe la pagina che chiedi.
A linea di comando interpelli direttamente il php.exe senza scomodare il 
webserver.
ciao,
Luca(riello) 

 problemi, 
[cut]
Scusatemi tutti quanti!
purtroppo nella fretta di scrivere il primo post, ho dato per scontato 
un'informazione
essenziale per comprendere il "problema":
il sito da monitorare è da una parte, lo spider da un'altra.
E, nonostante sia in contatto con il webmaster del sito, non mi è 
possibile caricare lo spider
sul suo hosting :/
Un saluto.
Gabriele


Va benissimo...
Ma dov'č l'include che dicevi? :p
ciao,
Luca(riello)
PS: comunque bella lě... non ci avevo pensato. (non ne ho mai avuto bisogno, 
ma se dovesse servirmi... :-)) 

 Gabriele

 webserver.
Deve essere quindi questa la ragione dell'instabilità e del termine 
dell'esecuzione dopo un tot tempo: si vede che apache dopo un periodo 
di "inattività" nel quale non riceve più nulla da inviare fa arrestare 
l'esecuzione dello script.
--
rob4you


Come suggerisce Gufo rosso, potrebbe essere utile la funzione 
ignore_user_abort.
--
rob4you

 Sai consigliarmi qualcosa?
Non saprei, non ho molta esperienza di hosting.
Ciao.
-- 
Federico

 Ma dov'è l'include che dicevi? :p
E' che a furia di include()re tutto, poi dimentico come implemento
effettivamente le cose. Pensa che nel sito in cui usavo quel codice (e
ti parlo di qualche anno fa), veniva incluso header.php in tutte le
pagine, da cui veniva incluso config.php, in cui includevo simucron.php,
in cui, dopo ovviamente il controllo sul tempo trascorso, c'era
effettivamente quel codice. :)) Anche il ping-pong infinito intendevo
farlo a livello di socket, non certo a colpi di include(). ;-)
Ciao.
Maverick
-- 
«Che non siete più liberi di non avere una casa con letto per dormire.
 Lavorate voi - schiavi dei soldi - che non sentite la puzza della
 schiavitù!» (a Mario di Monte Mario, Roma) # 
http://libre.netsons.org/

 dei cron via web.
Anche.


 Va benissimo...
Ma se metto questo pezzo di codice insieme alla pagina principale, non 
ho sempre il problema che mi sembra continui a caricare la pagina? O 
no?
--
rob4you



...
On the first release containing the indexer though, some users reported  
problems that “page loading” had become very slow. It turned out that the  
way the web bug was working, the 1×1 image was only getting displayed  
after the indexing had completed. That meant, although a browser had  
received the full wiki content, it was hanging around (with an open HTTP  
connection) waiting for the image to arrive. This resulted in a throbber  
that kept on throbbing, giving users the impression that the page was  
still loading. Was surprised to see pseudocron has similar problems—while  
the image is displayed immediately, it gives no indication to the browser  
that the image has finished so could leave the connection open.
To fix this in Dokuwiki, the 1×1 image was rendered immediately in the  
indexer script and the browser sent a Content Length header that would  
instruct it to drop the connection once it had the full image. Normally  
when the HTTP connection is a dropped by the client, the corresponding PHP  
script will be killed. But this behaviour can be overruled with  
ignore_user_abort(), so the start of indexer.php became;


 no?
No: il tempo di attesa dell'utente è solo quello per creare il socket ed
eseguire la richiesta (il 10 finale è l'eventuale timeout), dopodiché lo
script richiamato dall'utente prosegue per i fatti suoi, "fregandosene"
dei dati che eventualmente riceve, provenienti da heavy_script.php.
Il server, dal canto suo, si vede arrivare una richiesta legittima come
qualsiasi altra, ed esegue lo script pesante autonomamente.
Se non mi credi ;-), ecco un heavy_script.php d'esempio:
	$sec = 10; echo "Attesa di $sec secondi ... ";
	$now = time(); while ($now > time() - $sec);
	$fd = fopen('log.txt', 'a');
	fputs($fd, 'executed at ' . time() ."\n");
	fclose($fd);
Metti un echo 'Done!'; dopo la richiesta coi socket e vedi che succede.
Ti stampa il 'Done!', la barra di caricamento si ferma e puoi anche
chiudere il browser: il log sarà comunque aggiornato dopo 10 secondi.
Se invece cerchi una soluzione più elegante, leggi quel che scrive Tac.
Ciao :-)
Maverick
-- 
«Che non siete più liberi di non avere una casa con letto per dormire.
 Lavorate voi - schiavi dei soldi - che non sentite la puzza della
 schiavitù!» (a Mario di Monte Mario, Roma) # 
http://libre.netsons.org/