我的函数体是否每次都被读取?

时间:2015-12-08 18:08:12

标签: php wordpress

我正在构建一个WordPress主题,并尝试确定导致它运行得如此缓慢的原因。我的functions.php大约有500行,并且具有与数据库交互的功能,例如

add_action( 'wp_ajax_nopriv_get_N_more', 'get_N_more' );
add_action( 'wp_ajax_get_N_more', 'get_N_more' );
$N = 9;
function get_N_more ( )
{
    global $wpdb, $N;
    $thisTable = ($_POST['workType'] === 'projs') ? 'wp_nas_projs' : 'wp_nas_cases';
    $q = $wpdb->prepare(  "SELECT id,compname,descsmall,sumsmall,imageurl FROM $thisTable ORDER BY postdate DESC LIMIT %d, %d",  intval($_POST['numItemsLoaded']), $N);
    $nextNRows = $wpdb->get_results($q);
    removeEscapes($nextNRows);
    $stillSomeLeft = ($_POST['numItemsLoaded'] + $N) < count($wpdb->get_results($wpdb->prepare("SELECT * FROM $thisTable")));
    // ^ would like more efficient way of doing above  
    die(json_encode(array('stillSomeLeft' => $stillSomeLeft, 'workItems' => $nextNRows)));
}

每次读取脚本时,这些函数都不会被调用,但我想知道如果首先将它们放在那里可能会导致性能下降,如果PHP每次都读取它们的话

2 个答案:

答案 0 :(得分:2)

PHP必须只在请求期间读取您的函数一次,因此不会导致速度减慢。

查看函数的定义:

function get_N_more ( )
{
}

function_exists()的支票中没有看守。这意味着,如果此文件在任何地方被解析多次,则执行将失败并报告错误,表明您的get_N_more函数已在此范围内声明。

在解析脚本期间,从不考虑代码的复杂性和运行时效率,500行是相对微不足道的代码量。

tl; dr:这不是导致您放缓的原因。

答案 1 :(得分:2)

简短的回答是可能

  • 如果您对已添加的操作多次调用do_action(...),则可能会出现多个ajax请求,并且在发出新请求时超时或被取消。< / LI>
  • 您运行速度非常慢的主要原因是您正在直接使用数据库。如果这些是自定义表,则很可能未正确设置索引并且查询将永远返回或超时。
  • 您应该考虑使用get_posts或WP_Query作为帖子或页面,然后您可以使用本机wordpress函数来提取数据。如果您已创建自定义帖子类型,则将数据存储在post_meta中,并使用wordpress核心功能与辅助表格。
  • 一般情况下,如果您的查询将在几乎每个页面加载时返回相同的信息,您可能需要考虑将它们存储到缓存中,这样您就不会重新计算每个页面加载。

这一切意味着什么?

  • 检查数据库表索引。运行查询,因为它是由代码构建的,如mysql workbench。
  • 打开浏览器控制台或firebug,查看加载页面时发出的ajax请求。
  • 检查您调用do_action的所有地点并进行相应调整。
  • 调试将文件打印到文件或屏幕时。这将有很大帮助。