2012-02-01 12 views
5

nostra error_log apache è stato recentemente riempito con linee simili alle seguenti (circa 50GB):prova per la funzione di decompressione

[Wed Feb 01 16:50:15 2012] [error] [client 123.123.123.123] PHP Warning: 
unpack() [<a href='function.unpack'>function.unpack</a>]: 
Type V: not enough input, need 4, have 1 
    in /var/www/vhosts/domain.com/httpdocs/imagecreatefrombmp.php on line 52 

Linea 52 in imagecreatefrombmp.bmp è la seguente:

$COLOR = unpack("V",substr($IMG,$P,3).$VIDE); 

Questa linea è sepolta in un ciclo while.

Se il problema si ripresenta, desidero che il codice esca quietamente dal ciclo while.

Il problema è che non riesco a replicare il problema da solo, quindi ho bisogno di risolverlo alla cieca.

Ho ideato la seguente piccola soluzione. Servirebbe allo scopo? Se l'errore "Tipo V non viene immesso ..." si ripresenterà, il blocco catch try lo prenderà e restituirà false?

try{ 
     $COLOR = unpack("V",substr($IMG,$P,3).$VIDE);    
    }catch (Exception $e) { 
     return FALSE;   
    } 
+1

Controllare questo http://stackoverflow.com/a/1241751/1164491 – Cheery

+0

Gli avvisi e le eccezioni non sono correlati. –

+0

@Cheery: andare avanti e votare per chiudere se si trova un duplicato. –

risposta

3

Non si può prendere un errore di PHP o di allarme in quanto non è un'eccezione.

È possibile testare, dopo aver chiamato unpack, se è stato generato un errore con error_get_last(), ma ciò non è molto pratico.

Un'altra soluzione è set an error handler per catturare l'avviso e quindi lanciare un ErrorException per tale avviso. Sarai quindi in grado di utilizzare try/catch e return false;.

function my_error_handler($errno = 0, $errstr = null, $errfile = null, $errline = null) { 
    // If error is suppressed with @, don't throw an exception 
    if (error_reporting() === 0) { 
     return true; // return true to continue through the others error handlers 
    } 
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 
} 
set_error_handler('my_error_handler'); 

Attenzione: tutti gli errori, avvisi, avvisi, ecc. Verranno convertiti in un'eccezione. Questo può potenzialmente mandare in crash il tuo programma se ne avevi già uno.

Ora è possibile vedere l'eccezione:

try { 
    $COLOR = unpack("V",substr($IMG,$P,3).$VIDE);    
} catch (ErrorException $e) { 
    return false;   
} 
+0

All'interno di tutte le soluzioni proposte qui. Questa soluzione ha risolto il problema senza un problema tecnico. Grazie! – Haluk

1

No. Si ricevono messaggi di errore ordinari, non eccezioni.
(Vedere anche PHP: exceptions vs errors?)

È necessario dichiarare la lunghezza della stringa di input per evitare questi avvertimenti. - Dovrebbero essere davvero irrilevanti per l'ulteriore esecuzione.

if (strlen($IMG) >= $P+4)) { // message said it needs 4 bytes 
+0

Quindi il seguente sarebbe più o meno il trucco? 'if (strlen ($ IMG)> = $ P + 4)) {$ COLOR = scompattare (" V ", substr ($ IMG, $ P, 3). $ VIDE); } else {return FALSE;} ' – Haluk

+0

Credo di sì. Eviterebbe * il problema, quindi l'avviso verrà registrato. – mario

2

In questo caso (questo non è sempre il caso con unpack, esso dipende dal tipo) sarà sempre impostato $ COLORE alla Boolean false in caso di errore.

È possibile verificare la presenza che in questo modo:

$COLOR = unpack("V",substr($IMG,$P,3).$VIDE); 
if ($COLOR === FALSE) { /* error handling */ } 

Nota l'uso di === invece di ==, controlla che il tipo corrispondente a. Impedisce le istanze in cui 0 == false restituisce true.

+0

Questa sembra una soluzione ordinata. Anche la soluzione di @mario sembra buona. – Haluk

Problemi correlati