修复WordPress中的内存泄漏(HHVM)

时间:2015-10-05 作者:Salexes

我的服务器正在运行HHVM。

除了这件事,一切都很顺利。由于内存泄漏,翻译缓存被填满,一旦几乎满了,HHVM就无法再呈现页面,因此每个用户只会看到一个空白页面而不是文章。

为了防止这种情况发生,有必要将所有create\\u函数调用替换为匿名函数。请参阅(有关更多信息):https://github.com/facebook/hhvm/issues/4250#issuecomment-88941383hhvm的文档也表示使用匿名函数:http://docs.hhvm.com/manual/en/function.create-function.php

因此,我现在的问题是如何替换转换中进行的create函数调用。php和po。使用匿名函数的php?

顺致敬意,

2 个回复
SO网友:Mark Kaplun

如果HHVM的核心PHP功能有缺陷,那么它还不能用于生产站点。

SO网友:phatskat

在里面pomo/po.php:

# pomo/po.php
# 168:            $res = implode("\\n", array_map(create_function(\'$x\', "return $php_with.\\$x;"), $lines));
# 256:            $is_final = create_function(\'$context\', \'return $context == "msgstr" || $context == "msgstr_plural";\');
# 349:            if (array() == array_filter($entry->translations, create_function(\'$t\', \'return $t || "0" === $t;\'))) {

            $res = implode( "\\n", array_map( function( $x ) {
                return $php_with.\\$x;
            }, $lines ) );

            $is_final = function( $context ) {
                return $context == "msgstr" || $context == "msgstr_plural";
            }

            if (array() == array_filter($entry->translations, function($t) { return $t || "0" === $t; } ) ) {
然而,在pomo/translations.php, 这条线是

pomo/translations.php
208: return create_function(\'$n\', $func_body);
由于$func\\u body是一个变量,我们必须仔细查看代码:

function make_plural_form_function($nplurals, $expression) {
    $expression = str_replace(\'n\', \'$n\', $expression);
    $func_body = "
        \\$index = (int)($expression);
        return (\\$index < $nplurals)? \\$index : $nplurals - 1;";
    return create_function(\'$n\', $func_body);
}
我们可以尝试使用PHP的use 关键字(尚未测试此项,没有承诺它会起作用):

function make_plural_form_function($nplurals, $expression) {
    $expression = str_replace(\'n\', \'$n\', $expression);
    return function( $n ) use ( $expression, $nplurals ) {
        $index = (int)($expression);
        return ($index < $nplurals) ? $index : $nplurals - 1;
    } 
}
说了这么多,除非你must 不要使用HHVM。这是一个大问题,即使只修复一次这些调用,也意味着每次重新安装或升级WordPress时,都必须反复执行。

EDIT: BIG WARNING HERE. WHAT I AM SUGGESTING IS A MODIFICATION TO WORDPRESS CORE. THIS SHOULD NEVER BE AN OPTION, ESPECIALLY IN A PRODUCTION ENVIRONMENT, UNLESS YOU ARE WILLING TO TAKE ON THE LONG-TERM MAINTENANCE OF A HACK TO THE CORE. DO NOT DO THIS

相关推荐

无法在模板函数.php中使用IS_HOME

我试图在标题中加载一个滑块,但只在主页上加载。如果有帮助的话,我正在使用Ultralight模板。我正在尝试(在template functions.php中)执行以下操作:<?php if ( is_page( \'home\' ) ) : ?> dynamic_sidebar( \'Homepage Widget\' ); <?php endif; ?> 但这行不通。现在,通过快速的google,我似乎需要将请