Newsgroup: it.comp.www.php
Titolo: verificare attivazione dell'error_prepend_string

$url = '
http://qualcosa
';
 
$contents = file_get_contents($url);
if (false === $contents) exit(1);
 
$error_prepend_string = 'test_666';
 
if (false !== strpos($contents, $error_prepend_string)) throw new 
\Exception(
     "La pagina '$url' contiene l'error-prepend-string 
'$error_prepend_string'."
);
 
 
Naturalmente affinchè tutto funzioni *correttamente* bisogna aprire il 
file */php.ini e controllare che ci sia la riga
 
error_prepend_string = "test_666"
 
e che sia *decommentata*.
 
Infatti spesso succede che in seguito ad aggiornamenti di apache, php, 
ecc., tale impostazione venga riportata allo stato iniziale, e se nella 
pagina '
http://qualcosa
' c'è qualche errore, non viene lanciata 
l'apposita exception: tu pensi che tutto stia funzionando invece quando 
tra una settimana/mese/anno te ne accorgi devi aprire il pronto soccorso :)
 
Come si può fare per verificare che, nell'apposito php.ini, 
l'error_prepend_string sia impostata correttamente?


Naturalmente vorrei evitare istruzioni come questa
 
if 
(parse_ini_file('/etc/php/7.0/apache2/php.ini')['error_prepend_string'] 
!= 'test_666') throw new Exception('valore inaspettato');
 
anche perchè non è detto che il percorso di php.ini sia proprio 
*/etc/php/7.0/apache2/php.ini*
 
Non esiste proprio una funzione tipo 
*apache_get_ini('error_prepend_string')* ?
 

*apache_get_ini('error_prepend_string')* ?
 
Se parli di questa variabile del PHP...
 
http://php.net/manual/it/errorfunc.configuration.php#ini.error-prepend-string
 
 
...la funzione per leggerne il valore c'è:
 
http://php.net/manual/en/function.ini-get.php
 
 
Leonardo
 
-- 
 
Ya se escucha sonar la metralla, ya el clarín toca fuego graneado:
ahora o nunca, muchachos arriba a acabar a estos hijos del diablo.

 
 
Lo script che ho illustrato viene eseguito da console, e normalmente in 
cli-mode quel *prefisso* non viene usato.
Per accedere al valore che voglio lo devo lanciare dal browser, ma 
siccome è uno script di test deve essere usato da cli (come come da 
consuetudine e per agilità d'uso), anche se viene testata una web page.
 
Quindi da cli è possibile accede alla *versione web* di 
error_prepend_string?

error_prepend_string?
 
Non in maniera pulita e portabile, che sappia io. Fra i vari modi sporchi
proverei fra i primi "php -c" per caricare il file di php.ini per il web.
 
Ma, per quella strada, il framework di test diventa un accrocco tenuto su
da spago e chewing-gum (been there, done that), e devi cominciare a farti
qualche test sul framework di test.


 
 
grazie per le opinioni :)


Però se lo script va eseguito nel browser come faccio a lanciarlo 
automaticamente?
Tale script  naturalmente fa parte di una global-test-suite 
(global-test-suite.sh) che lancia a sua volta altri test-script tra cui 
quello di cui stiamo parlando.

automaticamente?
 
Lo script va eseguito nel server, e per farlo da linea di comando
 
<cite>
Secondo me, la via più semplice è usare curl (direttamente o via wrapper,
come ad es. Codeception). YMWV.
</cite>


 </cite>
 
$ cat /tmp/test.php
<?php
 
$error_prepend_string = ini_get('error_prepend_string');
 
if (strlen($error_prepend_string) <= 0) throw new \Exception(
     "Error prepend string non valido."
);
 
$url = $_GET['resource_to_test'];
 
$contents = file_get_contents($url);
if (false === $contents) exit(1);
 
if (false !== strpos($contents, $error_prepend_string)) throw new 
\Exception(
     "La pagina '$url' contiene l'error-prepend-string 
'$error_prepend_string'."
);
 
Proviamo
 
$ curl 
http://tmp.local/test.php?resource_to_test=http://example.com
 && 
echo ok
ok
 
Può andar bene?

 Può andar bene?
 
Pensavo potesse andar bene invece
 
$ curl 
http://tmp.local/test.php?resource_to_test=http://ivalid
 && echo 
"TUTTO OK"
test_643597<br />
<font size='1'><table class='xdebug-error xe-warning' dir='ltr' 
border='1' cellspacing='0' cellpadding='1'>
<tr><th align='left' bgcolor='#f57900' colspan="5"><span 
style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( 
! )</span> Warning: file_get_contents(): php_network_getaddresses: 
getaddrinfo failed: Name or service not known in /tmp/test.php on line ...
TUTTO OK
 
Dice che è tutto ok, invece... :(

$contents = file_get_contents($url);
 
Allora, tu quello che vuoi controllare è che la risorsa non dia errore.
 
Gli errori possono essere di tre tipi:
 
	- viene ritornato un codice diverso da 200.
	- viene ritornato un output che contiene ERROR_STRING.
	- viene ritornato un output diverso da quello atteso.
 
Tutto questo lo fai già tranquillamente appunto con Codeception. Però se ti
senti di reinventare la ruota, si può.
 
Per controllare il prepend_string, io userei una paginetta fuori mano messa
lì a quello scopo. E anzi, magari le farei stampare il phpinfo() in modo da
controllare tutte le stringhe che mi venissero in mente.
 
Una volta che quella pagina ha dato l'OK, posso usare l'hack del prepend in
modo da accorgermi se si è verificato un errore.
 
    #!/bin/bash
 
    curl --silent --dump-header - "$1" > tmp.txt 2>&1
 
    if (! grep "^HTTP/1.1 200 OK$" tmp.txt > /dev/null ); then
	echo "La risorsa $1 è in errore."
	exit 2
    fi
 
    if (grep $ERROR_PREPEND tmp.txt > /dev/null ); then
        echo "La risorsa $1 ha sollevato una eccezione"
	exit 3
    fi
 
    echo "OK"
 
 
Lo script sopra lo puoi lanciare con ./testresource.sh "
http://example.com
"


      fi
 
$ERROR_PREPEND da dove lo ricavo?

 if (grep $ERROR_PREPEND tmp.txt > /dev/null ); then
 
Chiedo scusa forse intendevi
 
if (grep test-666 "$output" > /dev/null ); then
 
(al posto del file preferisco catturare l'output nell'apposita 
variabile, come ti avevo fatto notare)

 if (grep test-666 "$output" > /dev/null ); then
 
Eh la stanchezza...
 
if ("$output" | grep test-666 > /dev/null ); then

$ERROR_PREPEND da dove lo ricavo?
 
E' la stringa che usi come prepend-string; ci metti quel che ti pare
- basta sia la stessa che c'è in php.ini.



"Forse" ;-) meglio
 
	if (echo "$output" | ... )


 - basta sia la stessa che c'è in php.ini.
 
Certamente... troppo lavoro mi sta stancando :)

 	if (echo "$output" | ... )
 
Si si hai ragione :D :D :D :D :D :D

arrabbiare di nuovo :)
 
Tranquillo. Arrabbiato, seddiovuole, m'hanno visto in pochi.


 
 
Perchè fare pasticci?
Gli errori su stderr, il resto su stdout.
 


http://test/test.php?risorsa_da_tesare=http://a/b/c
 
 
Uhm. Ma perché specifichi "
http://a
", però?


 Uhm. Ma perché specifichi "
http://a
", però?
 
????
Chiedo scusa ma non ho capito la domanda...


Perché ripeti http://? Non è sufficiente il path della risorsa?
 
 
http://test/test.php/risorsa_da_testare=/path/file.php
 
 
Piuttosto, mi pare che così tu possa testare soltanto risorse di tipo
idempotente, che non hanno bisogno di parametri. Se per esempio serve
testare un modulo che riceve i campi di un form di contatto, come gli
passi i valori dei campi?


 passi i valori dei campi?
 
In tal caso come potrei fare?
Richiamare la pagina col metodo POST (rinunciando naturalmente alla 
comodità di file_get_contents() che usa GET) per inviare tutti i dati 
neccessari?

In tal caso come potrei fare?
 
Eh... la verità? Non ne ho la più pallida idea.
 
Mi ricordo che tempo addietro avevo anch'io messo su un framework di test
tipo il tuo. A lungo andare, si è rivelato troppo complicato da gestire e
mantenere per le mie scarse conoscenze informatiche. Così sono passato in
un primo tempo al solo phpunit, poi a phpunit + Codeception. E ogni volta
che mi viene in mente un trucco ganzissimo, che richiede solo una piccola
modifica al php.ini, spengo il PC, vado al cinema ed aspetto che mi passi
di mente (personalmente, raccomando i film della Marvel). Per le idee più
brillanti, mi sbronzo di vodka o sbatto la testa nel muro. Fa male; ma fa
molto meno male del giorno che il provider mi sorride e mormora, "No, sui
nostri server quell'opzione non è disponibile... ma le confermiamo che il
deploy è avvenuto in orario e il collaudo è previsto per domattina. Vuole
avvertire lei il cliente? Noi lo abbiamo già fatto per iscritto" [1].
 
Uso ancora gli script via curl, però ne ho due soli per ciascun sito: uno
effettua una serie di test di integrità e mi ritorna una percentuale, uno
effettua una serie di operazioni predeterminate e lo utilizzo sia per gli
stress test che per i capacity test.
 
Però tu non sei me, e questa è stata la *mia* storia... di cui posso dire
solo di essere abbastanza contento. Non ho altre garanzie da offrire :-)
 
Leonardo
 
[1] questa scena è dovuta avvenire tre volte in vita mia. Sono testardo e
    le cose non le afferro sempre al volo, specie se volano basse, come è
    tipico di certi volatili.


      tipico di certi volatili.
 
Che dire, c'è da imparare soprattutto leggendo queste esperienze :)