我在b2evo PHP网站上有一段代码,它执行以下操作:
$content = preg_replace_callback(
'/[\x80-\xff]/',
create_function( '$j', 'return "&#".ord($j[0]).";";' ),
$content);
这部分代码有什么作用?我的猜测是它删除了128到256之间的ascii字符,但我不能确定。
此外,就目前而言,每次从页面内调用此代码时,PHP都会分配,然后不会释放高达2K的内存。如果在页面上调用该函数1000次(这可能发生),则该页面使用额外的2MB内存。
这导致我的网络应用程序出现问题。为什么我会丢失内存,如何重写内存以便我不会出现内存泄漏?
答案 0 :(得分:4)
这是create_function
泄露你的记忆 - 只是使用正常的功能而你会没事的。
函数本身正在用数字HTML实体(&#xxx;
)
答案 1 :(得分:3)
不是真的剥离,它取代了实体的高Ascii字符。
请参阅preg_replace_callback create_function用于创建匿名函数,但您可以使用普通函数:
$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]) . ';';
}
[编辑]找到一个更干净,可能更快的方式来完成这项工作! ^ _ ^只需使用符合您需求的选项即可。
答案 2 :(得分:0)
在您的案例中使用带有preg_replace
标记的/e
要简单得多:
$content = preg_replace(
'/[\x80-\xff]/e',
'"&#".ord($0).";"',
$content);