使用多个“home_url”查询与多次调用一个变量

时间:2014-02-27 作者:Ademos

问题

因为我使用了home_url() 在一个页面模板中,我很好奇下面的方法是否会加快我的页面加载时间。我的方法是存储home_url() 然后每次调用该变量,而不是使用home_url() 每次。

动机我之所以认为回显变量会加快页面加载时间,是因为(如果我的理解正确的话)回显变量不需要每次调用该变量时都查询数据库。

方法A

<ul>
   <li><a href="<?php echo home_url(); ?>/category/blue">Blue Items</a></li>
   <li><a href="<?php echo home_url(); ?>/category/green">Green Items</a></li>
   <li><a href="<?php echo home_url(); ?>/category/red">Red Items</a></li>
   <li><a href="<?php echo home_url(); ?>/category/orange">Orange Items</a></li>
   <li><a href="<?php echo home_url(); ?>/category/purple">Purple Items</a></li>
   <li><a href="<?php echo home_url(); ?>/category/gray">Gray Items</a></li>
</ul>
方法B
<?php $my_home_url = home_url(); ?>       
<ul>
   <li><a href="<?php echo $my_home_url; ?>/category/blue">Blue Items</a></li>
   <li><a href="<?php echo $my_home_url; ?>/category/green">Green Items</a></li>
   <li><a href="<?php echo $my_home_url; ?>/category/red">Red Items</a></li>
   <li><a href="<?php echo $my_home_url; ?>/category/orange">Orange Items</a></li>
   <li><a href="<?php echo $my_home_url; ?>/category/purple">Purple Items</a></li>
   <li><a href="<?php echo $my_home_url; ?>/category/gray">Gray Items</a></li>
</ul>

2 个回复
最合适的回答,由SO网友:bosco 整理而成

如果你看the source for the home_url() function, 您将注意到最终调用get_option(). 如中所述this WPSE Answer, 这个get_option() 函数被缓存,这意味着如果选项的值已经在内存中,get_option() 返回该值,而不是再次查询数据库。因此,即使你打电话home_url() 在一次请求期间,它将只查询数据库一次。

记住,Method B (重新使用局部变量的值)仍然比Method A (呼叫home_url() 因为它不会循环调用堆栈上的一系列函数调用。这就是说,考虑到现代PHP的性能,这种差异可以忽略不计,如果不是微秒,那么可以在毫秒数内测量出不同的方法。

简言之Method B 如果只通过一个无穷小的度量,将始终胜过其他解决方案。

附录

根据评论中的要求,我已经为我的服务器环境创建了这两种方法的执行时间概要文件。在这样做的过程中,我创建了附在我答案底部的插件,您可以使用它在自己的环境中测试这些方法。

在我的环境中(Varying Vagrant Vagrants\' wordpress-default 站点-Ubuntu服务器12.04,使用PHP 5.4/MySQL 5.5/Nginx 1.4堆栈),平均100个配置文件,1000个echo()\'d个实例,我收到以下结果:

方法AGET 字符串:?hup_method=a&hup_profiles=100&hup_instances=1000

方法A echo()在100个配置文件中平均调用1000个home\\u url(),时间为0.023981981277466秒。

方法BGET 字符串:?hup_method=b&hup_profiles=100&hup_instances=1000

方法B echo()在100个概要文件中平均引用1000个$homeUrl,时间为0.00071162700653076秒。

在此配置文件中,Method B 速度大约是Method A, Method B 拥有echo()\'在0.7毫秒内创建1000个实例,比Method A 管理。这意味着执行对的调用大约需要23微秒(0.000023秒)home_url(), 和小于0.7微秒(0.0000007秒)的时间$homeUrl 参考(大部分时间可归因于最初调用home_url() 用于Method B).

如果您对代码性能的复杂性非常感兴趣,我建议您花些时间学习;大O符号;或者找一门离散数学计算机科学课程。

<?php
/*
Plugin Name: Home URL Method Profiler
Plugin URI: https://wordpress.stackexchange.com/questions/136091
Description: Using Multiple Queries of “home_url” vs. Calling a Variable Multiple Times
Version: 0.1
Author: Adam Bosco
Author URI: https://wordpress.stackexchange.com/users/25324
License: GPL2
*/


class HomeUrlProfile {
    private static $hasPrinted = false;     // Only print out the results once
    private static $method = NULL;          // The method to profile
    private static $executionTimes = [];    // Profile results.
    private static $instanceCount = 1000;   // Number of instances of calls to home_url() or uses of $homeUrl to profile against
    private static $profileCount = 5;       // Number of times to run the same profile

    // Constructor; set up action hooks.
    public function HomeUrlProfile( $method ) {
        self::$method = strtolower( $method );

        if( isset( $_GET[ \'hup_instances\' ] ) )
            self::$instanceCount = $_GET[ \'hup_instances\' ];

        if( isset( $_GET[ \'hup_profiles\' ] ) )
            self::$profileCount = $_GET[ \'hup_profiles\' ];

        add_action( \'init\', \'HomeUrlProfile::run\' );
        add_action( \'loop_start\', \'HomeUrlProfile::printResults\' );
    }

    // Perform a profile
    public static function run() {
        // Perform the same profile of a method with the same number of echo()\'d instances $profileCount times
        for( $i = 0; $i < self::$profileCount; $i++ ) {
            /* For a more realistic scenario, we\'ll actually echo the home URL for each
             * iteration. In order to avoid actually displaying all those URLs, we\'ll
             * capture the output in a buffer, then discard it after we get our execution
             * times. */
            ob_start();

            // Run the requested method and push the results to the $executionTimes array;
            if( self::$method == \'a\' )
                array_push( self::$executionTimes, self::methodA() );
            else
                array_push( self::$executionTimes, self::methodB() );

            // Clear the output buffer.
            ob_end_clean();

            // Remove home_url()\'s cached values after each profile.
            wp_cache_delete( \'home\', \'option\' );
            wp_cache_delete( \'alloptions\', \'options\' );
        }
    }

    public static function printResults() {
        if( self::$hasPrinted )
            return;

        self::$hasPrinted = true;

        $averageTime = array_sum( self::$executionTimes ) / self::$profileCount;
?>
        <div>
            <h3>Home URL "Method <?php echo strtoupper( self::$method ); ?>" Profile Results</h3>
            <p>Averaged across <?php echo self::$profileCount; ?> profiles, Method <?php echo strtoupper( self::$method ); ?> echo()\'d <?php echo self::$instanceCount; echo( self::$method == \'a\' ? \' calls to home_url()\' : \' references to $homeUrl\' ); ?> in <?php echo $averageTime; ?> seconds.</p>
            <ol><?php
        foreach( self::$executionTimes as $executionTime ) {
            echo(\'
                <li>\' . $executionTime . \' seconds</li>\');
        }
            ?></ol>
        </div>
<?php
    }

    // "Method A" - using multiple calls to home_url().
    public static function methodA() {
        // Record the UNIX timestamp as a floating-point value before execution.
        $startTime = microtime( true );

        for( $i = 0; $i < self::$instanceCount; $i++ ) {
            echo( home_url() );
        }

        // Record the UNIX timestamp after execution
        $endTime = microtime( true );

        // Return the difference between the timestamps
        return $endTime - $startTime;
    }

    public static function methodB() {
        // Record the UNIX timestamp as a floating-point value before execution.
        $startTime = microtime( true );

        $homeUrl = home_url();

        for( $i = 0; $i < $instanceCount; $i++ ) {
            echo( $homeUrl );
        }

        // Record the UNIX timestamp after execution
        $endTime = microtime( true );

        // Return the difference between the timestamps
        return $endTime - $startTime;
    }
}

if( ! isset( $HomeUrlProfile ) && isset( $_GET[ \'hup_method\' ] ) ) {
    $method = strtolower( $_GET[ \'hup_method\' ] );

    switch( $method ) {
        case \'a\':
        case \'b\':
            break;
        default:
            die( \'Invalid Home URL profiling method specified (must be \\\'A\\\' or \\\'B\\\'): \' . $_GET[ \'hup_method\' ] );
    }

    $HomeUrlProfile = new HomeUrlProfile( $method );
}

?>
设置GET 变量hup_method 将根据指定的值运行方法a或B的配置文件。这个GET 变量hup_instances 可用于指定配置文件中方法要回显的主URL数(默认为1000),以及变量hup_profiles 可用于指定要运行配置文件以创建平均值的次数(默认值为5)。

有多种方法可以使此配置文件更精确(减去执行for 例如,循环),但在它的当前形式中,它给出了有关时间框架的一个非常好的总体概念。

干杯

SO网友:Cameron Hurd

你的假设完全正确。看看get_home_url() 在里面wp-includes/link-template.php.

旁白:home_url() 只是一种方便的方法get_home_url().

下面是函数定义。通过将其输出分配给变量,您可以避免调用此代码5次以上对性能的影响:

function get_home_url( $blog_id = null, $path = \'\', $scheme = null ) {
    $orig_scheme = $scheme;

    if ( empty( $blog_id ) || !is_multisite() ) {
        $url = get_option( \'home\' );
    } else {
        switch_to_blog( $blog_id );
        $url = get_option( \'home\' );
        restore_current_blog();
    }

    if ( ! in_array( $scheme, array( \'http\', \'https\', \'relative\' ) ) ) {
        if ( is_ssl() && ! is_admin() && \'wp-login.php\' !== $GLOBALS[\'pagenow\'] )
            $scheme = \'https\';
        else
            $scheme = parse_url( $url, PHP_URL_SCHEME );
    }

    $url = set_url_scheme( $url, $scheme );

    if ( $path && is_string( $path ) )
        $url .= \'/\' . ltrim( $path, \'/\' );

    return apply_filters( \'home_url\', $url, $path, $orig_scheme, $blog_id );
}

结束

相关推荐

Passing variables to new page

我试图将变量传递到新页面,我在主题中创建了一个函数来获得结果。现在当我使用yelplist(); 在我的主题首页上,它会得到结果,当我点击链接时,它会按要求将图像和城市返回给我。Questions:<然而,我想知道我能做些什么让变量传递到自己的页面。例如:如果我单击该名称,一个新页面将显示该链接的图像和城市结果</也可以在单曲中完成。php文件,还是将是一个全新的页面/文件Update 1*我在使用$\\u会话方面取得了一些进展,现在我可以将变量传递到单个会话中。然而,当我点击这个链接时,它