以下代码导致有大约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>
答案 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)
当您看到“允许的内存大小耗尽”时,通常意味着您手上有无限循环。检查以确保有参数可以阻止它永远循环。