Discussione:
eseguire script php ogni due ore (su hosting aruba)
(troppo vecchio per rispondere)
_kOws
2007-03-05 18:05:21 UTC
Permalink
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
Federico
2007-03-05 18:31:56 UTC
Permalink
Post by _kOws
è 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.
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
_kOws
2007-03-05 19:11:11 UTC
Permalink
Innanzitutto grazie per la risposta! :)
Post by Federico
Post by _kOws
è possibile far eseguire a una pagina web delle azioni,
temporizzate,
[cut]
Post by Federico
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.
La pagina su cui gira questa sorta di spider, non verrebbe mai contattata
da nessuno...dovrebbe "girare" da sola :)
Dovendola contattare, non farei altro che aggiungere un terzo pezzo al
puzzle...
Avevo pensato a questa soluzione, temporizzando il mio browser a collegarsi
a questa pagina ogni tot tempo, ma non mi sembra per niente una soluzione
al problema :P
Post by Federico
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ù.
Grazie per l'indicazione, cercherò :)
Anche se, devo dirti la verità, speravo che fosse possibile fare in
altri modi.
Post by Federico
3) Spostare il sito su un hosting che metta a disposizione cron.
Sai consigliarmi qualcosa?
Post by Federico
Al momento non mi viene in mente altro.
Grazie ancora!
Post by Federico
Ciao.
Un saluto.
Gabriele
rob4you
2007-03-05 21:30:41 UTC
Permalink
Post by _kOws
Post by Federico
3) Spostare il sito su un hosting che metta a disposizione cron.
Sai consigliarmi qualcosa?
Quanto spendi ora? E che confugirazione hai?

E quanto sei disposto a spendere?

--
rob4you
TAC One
2007-03-05 23:15:06 UTC
Permalink
Post by _kOws
La pagina su cui gira questa sorta di spider, non verrebbe mai contattata
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/
rob4you
2007-03-05 23:47:48 UTC
Permalink
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
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
Luca(riello)
2007-03-06 00:08:03 UTC
Permalink
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?
Non dovrebbe... l'esecuzione viene portata a termine perché il servizio che
si occupa di eseguire lo script non si preoccupa se sei lì ad aspettare
l'output: pensa solo ad eseguire la pagina e a mandare l'output al servizio
che poi si occuperà di rigirartelo (che è quello che gestisce i socket).

Piuttosto se è una operazione che richiede molto tempo (ordine delle decine
di secondi) bisogna stare attenti alle richieste "contemporanee" per evitare
che lo script venga eseguito due volte (basta settare il flag di avvenuta
operazione prima di ogni altra cosa).
Sicuramente un sistema gratuito, e funzionante senza problemi, è l'uso dei
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)
rob4you
2007-03-06 00:37:27 UTC
Permalink
Post by Luca(riello)
Non dovrebbe... l'esecuzione viene portata a termine perché il servizio che
si occupa di eseguire lo script non si preoccupa se sei lì ad aspettare
l'output: pensa solo ad eseguire la pagina e a mandare l'output al servizio
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
Luca(riello)
2007-03-06 00:51:00 UTC
Permalink
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.
ANCHE SE... prima o poi dovrebbe interrompersi. Mi capitava quando provavo
in locale la mia chat (ciclo infinito con i socket): se il motore lo eseguo
da browser e chiudo la finestra, rimane viva dieci minuti e poi si
sconnette. Ma succede lo stesso anche se lascio la finestra attiva... magari
dura poco di più ma non è stabile! In quel caso penso dipenda da Apache.
Eseguendola su server tramite linea di comando invece campa mesi e mesi (e
non va giù a meno che il buffer di qualcuno appeso non si riempie... ancora
non ho risolto completamente! vabbeh sto divagando). Da questa esperienza mi
sento di dire di non affidare al browser le chiamate a script molto pesanti.

Se qualcuno sa qualcosa in più che parli ora :-)
Grazie per l'info, non si finisce mai di imparare. :-)
prego :-)
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?
questo si... ma sempre meglio che farlo aspettare nel vuoto è.


ciao,
Luca(riello)
rob4you
2007-03-06 01:06:33 UTC
Permalink
Post by Luca(riello)
ANCHE SE...
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
Luca(riello)
2007-03-06 01:19:33 UTC
Permalink
Dico una ca...ata, o quando lo eseguo tramite linea di comando il server
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)
rob4you
2007-03-06 02:44:47 UTC
Permalink
Post by Luca(riello)
A linea di comando interpelli direttamente il php.exe senza scomodare il
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
rob4you
2007-03-06 02:48:02 UTC
Permalink
Post by rob4you
Post by Luca(riello)
A linea di comando interpelli direttamente il php.exe senza scomodare il
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.
Come suggerisce Gufo rosso, potrebbe essere utile la funzione
ignore_user_abort.

--
rob4you
TAC One
2007-03-06 20:50:12 UTC
Permalink
Post by rob4you
Post by TAC One
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
Ma in questo modo la barra/icona di caricamento del browser continua a
girare, giusto?
Non è un gran problema. Ad ogni modo il workaround esiste. E' indicato in
uno dei link che ho pastato, quello di sitepoint se non erro.
In breve si tratta di dire al client che si ha finito e farlo
disconnettere, mentre contemporaneamente si dice a php di non abortire lo
script alla disconnessione del client.
Post by rob4you
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?
Normalmente si.
http://it2.php.net/ignore_user_abort
Post by rob4you
Sicuramente un sistema gratuito, e funzionante senza problemi, è l'uso
dei cron via web.
Anche.

Tac
--
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
Maverick FC
2007-03-06 00:14:03 UTC
Permalink
On Tue, 06 Mar 2007 00:15:06 +0100, "TAC One"
Post by TAC One
Puoi fare in modo che restituisca in output una gif trasparente e
includerla in ogni pagina
con <img src="/indexer.php" />.
Forse non ho capito bene di cosa si stia parlando 8-|, ma perché dover
utilizzare una gif e un <img> se si può usare un banale include()?

Io solo una volta ho avuto a che fare con un hosting senza cron o simili
ed ho risolto proprio eseguendo lo script ad ogni visita, purché fosse
passato un tot di tempo dall'ultima volta. Ma usavo un include(). ;-)
Post by TAC One
Se il tuo sito riceve un buon numero di visite può funzionare senza
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/
Luca(riello)
2007-03-06 00:27:41 UTC
Permalink
Post by Maverick FC
Forse non ho capito bene di cosa si stia parlando 8-|, ma perché dover
utilizzare una gif e un <img> se si può usare un banale include()?
Era nel caso l'esecuzione dello script fosse dispendiosa a livello
temporale!
Sarebbe un peccato far aspettare 20 secondi l'utente che si trova ad
attivare lo script.
Una soluzione sarebbe farglielo fare da un iframe di dimensioni 0 o da
appunto un tag IMG che richiama la pagina php "di nascosto".
Post by Maverick FC
Una soluzione che ricordo avrei voluto implementare in quel caso, per
pazzo :-)

ciao,
Luca(riello)
Maverick FC
2007-03-06 01:19:31 UTC
Permalink
On Tue, 6 Mar 2007 01:27:41 +0100, "Luca\(riello\)"
Post by Luca(riello)
Era nel caso l'esecuzione dello script fosse dispendiosa a livello
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/
Luca(riello)
2007-03-06 01:27:26 UTC
Permalink
Post by Maverick FC
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? ;-)
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... :-))
Maverick FC
2007-03-06 14:47:41 UTC
Permalink
On Tue, 6 Mar 2007 02:27:26 +0100, "Luca\(riello\)"
Post by Luca(riello)
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/
rob4you
2007-03-07 00:05:20 UTC
Permalink
Post by Luca(riello)
Post by Maverick FC
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? ;-)
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
TAC One
2007-03-07 01:05:35 UTC
Permalink
Post by rob4you
Post by Luca(riello)
Post by Maverick FC
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? ;-)
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?
...

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;

Tac
--
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
Maverick FC
2007-03-08 02:56:05 UTC
Permalink
Post by rob4you
Post by Maverick FC
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) { }
...
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?
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/
_kOws
2007-03-06 01:27:20 UTC
Permalink
Post by TAC One
Post by _kOws
La pagina su cui gira questa sorta di spider, non verrebbe mai contattata
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,
[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
Gufo Rosso
2007-03-06 02:44:17 UTC
Permalink
Post by _kOws
Post by TAC One
Post by _kOws
La pagina su cui gira questa sorta di spider, non verrebbe mai contattata
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,
[cut]
Scusatemi tutti quanti!
purtroppo nella fretta di scrivere il primo post, ho dato per scontato
un'informazione
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 :/
??????????
nel sito fa un link a <img
src="http://sitodellospider/tua.php?id=cheglidai">
comunque e' meglio che ti rivolgi a host professionale


ignore_user_abort
forse questa fa al caso tuo
Post by _kOws
Un saluto.
Gabriele
Federico
2007-03-06 07:59:51 UTC
Permalink
Post by _kOws
Post by Federico
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.
La pagina su cui gira questa sorta di spider, non verrebbe mai
contattata da nessuno...dovrebbe "girare" da sola :) Dovendola
contattare, non farei altro che aggiungere un terzo pezzo al
puzzle...
[...]

Sì, ma nell'esempio proposto sarebbero gli utenti del sito stesso che
"contatterebbero" la pagina da eseguire ogni tot ore, semplicemente
accedendo alle pagine del sito stesso.
Post by _kOws
Post by Federico
3) Spostare il sito su un hosting che metta a disposizione cron.
Sai consigliarmi qualcosa?
Non saprei, non ho molta esperienza di hosting.

Ciao.
--
Federico
Loading...