Newsgroup: it.comp.www.php
Titolo: Capire se lo script sta girando da shell oppure da server web

Come da oggetto, c'è modo sicuro di capire se lo script è stato
eseguito da un server web oppure da shell ? In particolare, avendo
scritto una libreria, ho bisogno di capire se i messaggi (tipicamente
d'errore) che devo inviare in output devono essere formattati con
'<br>' oppure con "\n" per andare a capo.
Grazie
Gg


io farei un:
isset($_SERVER["SERVER_ADDR"])



puoi farlo tramite le superglobals, ad esempio la $_SERVER contiene chiavi
diverse in base all'ambiente dove gira
quindi un:
semplice isset($_SERVER['HTTP_HOST']) ti dice se sei su web o standalone

 semplice isset($_SERVER['HTTP_HOST']) ti dice se sei su web o standalone
Però questo non è un metodo sicuro.
Un utente può scrivere su quella variabile.


utente?

 Un utente può scrivere su quella variabile.
non vedo come (se non editando il file)


dicesi utente colui che utilizzerà la mia libreria...

> > non vedo come (se non editando il file)
Oops.. ho sbagliato destinatario nel rispondere.. cmq il succo rimane.
Mi chiedevo se esisteva un modo piu elegante che non leggere da una
variabile accessibile a tutti in scrittura, e non perché così non
funzioni, ma semplicemente perché non mi pare il modo piu corretto
diciamo..

 dicesi utente colui che utilizzerà la mia libreria...
sì, e allora?
la deve utilizzare o metterci le mani dentro per editarla?
nel secondo caso puo' far fare al tuo script *quello che vuole* ,
indipendentemente dai tuoi accorgimenti.
mala domandè: perchè diavolo dovrebbe aprire il file e valorizzare
quella variabile?


ribadisco: se puo' cambiare il sorgente, fa quello che vuole
se non puo' cambiare il sorgente non c'è modo che possa cambiare il
valore/l'esistenza di quella variabile. O meglio , puo' anche farlo, ma
non è una cosa da due minuti.


Te la metto dal lato "utente" come dici te, ovvero utilizzatore della
libreria: e se volesse avere la possibilità di avere le stesse
funzionalità CLI anche girando su webserver? Già mi sembra orribile
che la "libreria" si prenda da sola la libertà di scegliere in base
all'ambiente senza la possibilità da parte dell'utilizzatore di avere
voce in capitolo, e mi sembra ancora peggiore che gli si elimini la
possibilità di "forzarla" settando una variabile idealmente
accessibile in sola lettura.
Comunque, se proprio non ne puoi fare a meno: su macchine unix fai una
posix_getppid() per avere il pid del processo padre e vedi se è uguale
a quello del webserver. Sempre sperando che "l'utilizzatore" non sia
troppo stupido o avvelenato da fare una pcntl_fork() per ogni istanza
dello script.





Dal web, un utente non puo' CANCELLARE quella variabile, quindi ti basta
vedere se e' definita. Se e' definita, sei sul web.
Se non e' definita, sei in una shell.
Un utente anonimo via Web non puo' simulare l'esecuzione da shell.
Naturalmente un utente loggato sulla shell puo' simulare l'esecuzione da
web, ma:
	- non ci puoi fare niente. Can't beat root, baby.
	- l'utente non sovrascrive quella variabile a caso. Se lo fa, si
	  merita tutto quel che gli succede.
Leonardo
-- 
And where the black and corkscrew towers climb,
Lost and athirst the ragged pack abides,
Old as the aeons, trapped in tombs of time,
Sailing the tortuous temporal tides

Giacomo ha scritto:

php_sapi_name() fa al caso tuo.
http://it2.php.net/manual/en/function.php-sapi-name.php
Se php_sapi_name() == "cli" allora sei su shell.
Se non ti piace chiamare la funzione, puoi usare la costante predefinita
PHP_SAPI. Ha gli stessi valori della funzione.


E' da due nanosecondi forse, e che c'entra editare il sorgente ?
<?
$_SERVER['HTTP_HOST'] = 'quello che mi pare';
include 'mia.librerira.php';
?>
Ciauz

 PHP_SAPI. Ha gli stessi valori della funzione.
Si, grazie. E' quello che cercavo..
Ciao
Gg

 Ciauz
Editare il sorgente = accesso alla htdocs del server web, quindi se puoi 
fare un nuovo script che ti consente di impostare il valore e includere 
la libreria, puoi tranquillamente editare il file mia.librerira.php e 
risparmi un include :-)
	Francesco

 E' da due nanosecondi forse, e che c'entra editare il sorgente ?
c'entra che nel sorgente avrai:
if(qualcosa)=> sono nel web
else => sono cli
tu puoi usare funzioni sicure quanto vuoi per capire dove sei, ma se lui
alla fine aggiunge un semplice ! davanti a quel *qualcosa*, ti ha già
fregato
per quanto riguarda i due nanosecondi, hai ragione, pero' intendevo
simulare in toto di essere un web server (in modo da ingannarti
qualsiasi cosa abbia fatto)
detto questo: ma una tua curiosità o c'è un motivo particolare per
questa tua paura dell'utente ingannatore?

 questa tua paura dell'utente ingannatore?
Questo è il leitmotif degli sviluppatori di librerie. Non devono
aiutare il futuro utilizzatore, ma remargli contro. Tra se e se
pensano: "questa libreria fa ciò che ti serve, ma non la puoi
utilizzare. (*risata malefica*). Potevi scrivertene una da solo, se
proprio ti serviva." A volte sono così malefici che il loro prodotto
diventa inutile perfino per loro stessi.
Giacomo, sei ancora in tempo, non lo fare: metti una funzione
(pubblica) per cambiare il behavior dell'output.

 questa tua paura dell'utente ingannatore?
Rispondo qui e poi mi fermo che siamo andati anche troppo oltre :)
In programmazione esistono diversi modi di fare una cosa, ma di solito
una sola è corretta. Semplicemente non mi accontento che le cose
funzionino ma preferisco farle nel modo corretto. Niente di che eh..
solo personali modi di fare.
Concorderete con me che delle due soluzioni proposte usare una
funzione nativa piuttosto che leggere una variabile editabile sia piu
_corretto_, qualunque cosa questo significhi.
Ciao ciao, e grazie a tutti


bah, non in php, visto che niente ti vieta di avere un:
runkit_function_redefine("php_sapi_name", "", "return 'eheh';");