为什么这个PHP会导致执行超时?

时间:2012-10-18 18:42:20

标签: php wordpress-plugin wordpress

我刚刚发布了我编写的第一个版本的WordPress插件,我收到一份报告,至少有一个使用我的插件的人正在接收执行超时错误,引用了这段代码:

function getNumericAttributeFromHTML($htmlElement, $attribute){
    $attrStartPos = stripos($htmlElement, $attribute) + strlen($attribute);

    $strOffset = 0;
    $searchWithin = substr($htmlElement, $attrStartPos);

    while(!(is_numeric($searchWithin[$strOffset]))){
        $strOffset++;
    }
    $attrStartPos += $strOffset;

    $strOffset = 0;
    $searchWithin = substr($htmlElement, $attrStartPos);

    while((is_numeric($searchWithin[$strOffset]))){
        $strOffset++;
    }

    return substr($htmlElement, $attrStartPos, $strOffset);
}

页面上每个图像调用此函数两次。我疯狂的效率低下,还是他们的主人可能很糟糕?

提前感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:2)

如果while(!(is_numeric($searchWithin[$strOffset])))没有数字字符,

$searchWithin运行infinte times

请注意,问题可能出在其他地方。

为了查明实际问题,我建议您从错误中获取可重现的步骤,并使用profiler来分析代码。你肯定会找到问题所在。

答案 1 :(得分:1)

你有一个无限的while循环。您只是在不更改$strOffset的值的情况下递增$searchWithin[$strOffset]的值,所以如果它不是数字,那么它永远不会,并且会永远陷入循环。

答案 2 :(得分:0)

如果它导致超时,那么你有一个额外的大或无限循环。你在这里有2个循环,检查它们是否是无限的。

如果这不是问题,请通过在脚本开头添加此内容来增加最长执行时间:

ini_set('max_execution_time', 36000); //3600 seconds = 1 hour