cosa fa questo preg_replace_callback in PHP? e come posso smettere di perdere la memoria?
-
08-07-2019 - |
Domanda
Ho una sezione di codice su un sito PHP b2evo che procede come segue:
$content = preg_replace_callback(
'/[\x80-\xff]/',
create_function( '$j', 'return "&#".ord($j[0]).";";' ),
$content);
Cosa fa questa sezione di codice? La mia ipotesi è che rimuova i caratteri ASCII tra 128 e 256, ma non posso esserne sicuro.
Inoltre, così com'è, ogni volta che questo bit di codice viene chiamato da una pagina, PHP alloca e quindi non libera fino a 2K di memoria. Se la funzione viene chiamata 1000+ volte su una pagina (ciò può accadere), la pagina utilizza 2 MB di memoria in più.
Questo sta causando problemi con la mia applicazione web. Perché sto perdendo memoria e come riscrivo questo in modo da non avere una perdita di memoria?
Soluzione
Non proprio spogliarello, sostituisce i personaggi di alto Ascii con le loro entità.
Vedi preg_replace_callback .
create_function viene utilizzato per creare una funzione anonima, ma è invece possibile utilizzare una funzione semplice:
$content = 'Çà ! Nœm dé fîçhïèr tôrdù, @ pöür têstër... ? ~ Œ[€]';
$content = preg_replace_callback('/[\x80-\xff]/', 'CB_CharToEntity', $content);
echo $econtent . '<br>';
echo htmlspecialchars($content) . '<br>';
echo htmlentities($content) . '<br>';
echo htmlentities($content, ENT_NOQUOTES, 'cp1252') . '<br>';
function CB_CharToEntity($matches)
{
return '&#' . ord($matches[0]) . ';';
}
[EDIT] Ho trovato un modo più pulito, probabilmente più veloce per fare il lavoro! ^ _ ^ Usa solo htmlentities con opzioni adatte alle tue esigenze.
Altri suggerimenti
È create_function
che perde la tua memoria - usa invece una normale funzione e andrà tutto bene.
La funzione stessa sta sostituendo i caratteri con entità HTML numeriche ( & amp; #xxx;
)
È molto più semplice usare preg_replace
con la bandiera / e
nel tuo caso:
$content = preg_replace(
'/[\x80-\xff]/e',
'"&#".ord(<*>).";"',
$content);