Нужно оптимизировать этот PHP скрипт для "последних постов". Неустранимая ошибка, когда количество сообщений велико - PullRequest
0 голосов
/ 23 марта 2010

Приведенный ниже код приводит к ошибке на сайте, на котором ~ 1500 сообщений. Он работает хорошо, когда количество сообщений является номинальным, однако, эта большая нагрузка выявляет слабость кода, и я хотел бы оптимизировать его.

Интересно, что когда я отключаю это меню и вместо этого использую виджет «Последние сообщения», сообщения отрисовываются нормально. Так что я бы, наверное, хорошо позаимствовал бы из этого кода, если бы знал, где его найти, или еще лучше, если бы я мог вызвать виджет прямо в моей теме, передав ему переменную количества записей.

Неустранимая ошибка: допустимый объем памяти 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 ]

4 голосов
/ 23 марта 2010

Не поймите это неправильно. Я не собираюсь решать вашу проблему с памятью в этом ответе. Я опубликую еще один ответ с причиной, по которой, я полагаю, у вас может возникнуть проблема с мемом. Следующее - это всего лишь предложение, которое, я надеюсь, вы воспримете как полезное. понять, что ломается и почему.

Следуя принципам рефакторинга, я приведу один пример и покажу, как вы можете очистить его до того момента, когда вы действительно сможете отладить его самостоятельно.

Я немного переношу этот раздел кода для рефакторинга:

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";
    }

?>

Во-вторых, замените временные переменные вызовами функций [$ 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>

Теперь, наконец, когда у вас есть вся логика вверху страницы, вы можете профилировать каждую функцию, чтобы увидеть, сколько памяти она использует и в какой момент слишком много памяти используется в вашем запросе страницы. Я собираюсь опубликовать другой ответ, чтобы попытаться помочь, хотя, потому что я считаю, что у меня есть идея.

2 голосов
/ 23 марта 2010

В своем коде вы делаете следующее:

$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", но я бы поставил около 10 баксов, что если вы создадите новую функцию с именем " get_post_count ", который не извлекает все сообщения на страницу, а скорее выполняет что-то вроде" select count (*) "и дает вам 1 результат, вы устраните проблему с памятью. Если вы разместите тело своей функции get_posts, мы, вероятно, поможем определить самый простой способ сделать функцию get_post_count.

1 голос
/ 23 марта 2010

Когда вы видите «Разрешенный объем памяти исчерпан», это обычно означает, что у вас на руках бесконечный цикл. Проверьте, чтобы убедиться, что есть параметры, чтобы остановить его зацикливание навсегда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...