需要针对“最近的帖子”优化此PHP脚本。发布计数很高时发生致命错误

时间:2010-03-23 19:53:06

标签: php wordpress

以下代码导致有大约1500个帖子的网站出现错误。当帖子计数是名义上时,它表现良好,但是,这个重负荷暴露了代码的弱点,我想优化它。

有趣的是,当我禁用此菜单而不是使用“最近的帖子”小部件时,帖子被绘制得很好。因此,如果我知道在哪里找到它,或者更好的话,我可能会从该代码中借用,如果我可以直接在我的主题中调用小部件,则传递一个post count变量。

  

致命错误:允许的内存大小为   33554432字节耗尽(试图   分配16384个字节)   /home1/est/public_html/mysite/wp-includes/post.php   在第3462行

代码如下。其目的是列出“最近的帖子”。

global $post; 
$cat=get_cat_ID('myMenu'); 
$cathidePost=get_cat_ID('hidePost'); 
$myrecentposts = get_posts(array('post_not_in' => get_option('sticky_posts'), 'cat' => "-$cat,-$cathidePost",'showposts' => $count-of-posts));
$myrecentposts2 = get_posts(array('post_not_in' => get_option('sticky_posts'), 'cat' => "-$cat,-$cathidePost",'showposts' => -1));
$myrecentpostscount = count($myrecentposts2);

if ($myrecentpostscount > 0) 
{ ?>
    <div class="recentPosts"><h4><?php if ($myHeading !=="") { echo $myHeading; } else { echo "Recent Posts";} ?></h4><ul>
    <?php 
    $current_page_recent = get_post( $current_page );
    foreach($myrecentposts as  $idxrecent=>$post) {
        if($post->ID == $current_page_recent->ID)
            {
                $home_menu_recent = ' class="current_page_item';
            } 
            else 
            {
                $home_menu_recent = ' class="page_item';
            }
            $myclassrecent = ($idxrecent == count($myrecentposts) - 1 ? $home_menu_recent.' last"' : $home_menu_recent.'"'); 
        ?>
    <li<?php echo $myclassrecent ?>><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php } ; if (($myrecentpostscount > $count-of-posts) && $count-of-posts > -1){ ?><li><a href="<?php bloginfo('url'); ?>/recent">View All Posts</a></li><?php } ?></ul></div>

3 个答案:

答案 0 :(得分:4)

不要采取错误的方式。在这个答案中,我根本不会解决你的记忆问题。我会发布另一个答案,原因是我相信你可能会遇到mem问题以下只是一个建议我希望你能有所帮助:你有很多html在你的布局逻辑之间混乱,它会花费你3倍的时间要弄清楚什么是破坏和原因。

遵循重构的原则我将举一个例子,说明如何清理它,直到你可以自己调试它。

我正在使用这部分代码重构一下:

if ($myrecentpostscount > 0) 
{ ?>
    <div class="recentPosts"><h4><?php if ($myHeading !=="") { echo $myHeading; } else `{ echo "Recent Posts";} ?></h4><ul>`

首先,将逻辑拉出模板显示(同时重新格式化以便于阅读:

if ($myrecentpostscount > 0)
{
    if ($myHeading !=="") 
    {
        $displayHeading =  $myHeading; 
    } 
    else 
    { 
        $displayHeading =  "Recent Posts";
    }

&GT?;                  

其次,用函数调用[$ myHeading]

替换临时变量
/**
* This function determines if a heading is null, and returns the default if it is.
*/
function getDisplayHeading($customHeading)
{
    if ($customHeading == "") 
    { 
        return "Recent Posts";
    }
    return $customHeading;
}   

if ($myrecentpostscount > 0)
{
    ?>
    <div class="recentPosts"><h4>
    <?php echo getDisplayHeading($myHeading); ?></h4><ul>

现在最后,当您将所有逻辑放在页面顶部时,您可以分析每个函数以查看它使用了多少内存,以及在页面请求中使用了太多内存。我会发布另一个答案,试图帮助那里,因为我相信我有一个想法。

答案 1 :(得分:2)

在您的代码中,您执行以下操作:

$myrecentposts = get_posts(array('post_not_in' => get_option('sticky_posts'), 'cat' => "-$cat,-$cathidePost",'showposts' => $count-of-posts));
$myrecentposts2 = get_posts(array('post_not_in' => get_option('sticky_posts'), 'cat' => "-$cat,-$cathidePost",'showposts' => -1));
$myrecentpostscount = count($myrecentposts2);

你实际上是在获取所有帖子,然后在代码中计算它们...我没有“get_posts”函数的来源,但如果你创建一个名为“get_posts”的新函数,我会打赌大约10块钱get_post_count“不会将所有帖子提取到页面中,而是执行类似”select count(*)“的操作并给出1个结果,您将消除您的内存概率。如果你发布get_posts函数的主体,我们可以帮助确定最简单的get_post_count函数的方法。

答案 2 :(得分:1)

当您看到“允许的内存大小耗尽”时,通常意味着您手上有无限循环。检查以确保有参数可以阻止它永远循环。