草庐IT

php - call_user_func_array 太慢了吗?

coder 2023-10-19 原文

我正在使用 mysqli 和准备好的语句为我的数据库编写一个简单的搜索引擎,我目前正在使用 call_user_func_array 来动态创建我的查询。我的问题是:使用 mysqli 是否有更快或更好的方法来做到这一点? 这是我的代码:

<?php 
session_start();
require('../../../scripts/bkfunctions.php');
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Content-type: application/json');

//////////////////
$resultParameters = array();
$paramsArr =array();
$results = array();




////DB OPEN//////////////////////////////////////////
$conn = dbConnect("ITbunker");
$paramsArr = explode(",", $_GET['paramsQuery']);
$qStr="";
$bindParams = array('s');

    ////////////////////////////////////
    foreach ($paramsArr as $n=>$k) {

            if ($n==0) {
            $qStr = "SELECT * FROM trabajosEnSubasta WHERE MATCH(titulo, descripcion, habilidades) AGAINST (?)";
            }
            else {
            $qStr .= " UNION SELECT * FROM trabajosEnSubasta WHERE MATCH(titulo, descripcion, habilidades) AGAINST (?)";
            $bindParams[0] .= 's';
            }
            array_push($bindParams, $k);
    }
    ///////////////////////////////////////

    ///Preparar query y ejecutar
    $stmt = $conn->prepare($qStr);
    call_user_func_array(array($stmt, 'bind_param'), makeValuesReferenced($bindParams));
    $stmt->execute();

/////////////////////////////////////////////////////////////////////////////////////////*

$meta = $stmt->result_metadata();  

    while ($campo = $meta->fetch_field() ) {
    $resultParameters[] = &$row[$campo->name];
    }
    call_user_func_array(array($stmt, 'bind_result'), $resultParameters);

    $i=0;
    while ( $stmt->fetch() ) {  
        $i++;
        foreach( $row as $key => $val ) {
        $results["resultado$i"][$key] = $val;
        }  
    }


echo json_encode($results);
///////////////////////////////////////////////////

$conn->close();
?>

最佳答案

您的问题中有很多问题需要解决 - 而 call_user_func_array 不是其中之一。

查看您的查询

这是您正在构建的查询类型:

SELECT
    * 
FROM 
    trabajosEnSubasta 
WHERE 
    MATCH(titulo, descripcion, habilidades) AGAINST (?)
UNION 
    SELECT
        * 
    FROM 
        trabajosEnSubasta 
    WHERE 
        MATCH(titulo, descripcion, habilidades) AGAINST (?)
UNION 
    SELECT
        ...

而且.. 它回避了你为什么要那样做的问题。这在功能上是相同的,并且执行起来可能快得多:

SELECT
    * 
FROM 
    trabajosEnSubasta 
WHERE 
    MATCH(titulo, descripcion, habilidades) AGAINST (?)
    OR
    MATCH(titulo, descripcion, habilidades) AGAINST (?)
    OR
    ...

看你的逻辑

$paramsArr = explode(",", $_GET['paramsQuery']);

因此请求像 /foo?paramsQuery=a,b,c,d,e,f,g,h,i,j 这样的 url 当前将触发 10 表联合查询,如果你更新您的查询语法,这将是一个包含 10 个全文索引的查询。那真的是你想要的吗?它可能是 - 但例如,如果有人搜索已知的 habilidad,这样做会更有效率:

SELECT
    trabajosEnSubasta.*
FROM
    trabajosEnSubasta
LEFT JOIN
    habilidades_map ON habilidades_map.trabajo_id = trabajosEnSubasta.id
WHERE
    habilidades_map.habilidad = "known habilidad"

全文索引的查询成本相对较高,不应该成为您搜索数据的唯一方式。

分析您的代码

我不得不假设您询问的是call_user_func_array,因为您的代码执行起来很慢。不要猜测代码中的问题所在查看并找出

  • 使用explain查看您的查询在做什么
  • 使用xdebug profiling查看您的代码将时间花在哪里
  • Webgrind是一种易于安装的查看 xdebug 配置文件输出的方法。

不要浪费时间优化 0.01%

call_user_func_array 确实有使用成本,这就是为什么 code like this存在。但是区别真的非常微不足道(特别是考虑到问题中超重的 UNION 查询)除非你调用它数百次以上。关注对您的应用程序性能影响最大的事情,而不是那些绝对不会以任何方式产生可衡量差异的事情。

关于php - call_user_func_array 太慢了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10609794/

有关php - call_user_func_array 太慢了吗?的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby - 在 Ruby 中实现 `call_user_func_array` - 2

    我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)

  3. Ruby Koans about_array_assignment - 非平行与平行分配歧视 - 2

    通过ruby​​koans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John

  4. arrays - 这是 Ruby 中 Array.fill 方法的错误吗? - 2

    这个问题在这里已经有了答案:Arraysmisbehaving(1个回答)关闭6年前。是否应该这样,即我误解了,还是错误?a=Array.new(3,Array.new(3))a[1].fill('g')=>[["g","g","g"],["g","g","g"],["g","g","g"]]它不应该导致:=>[[nil,nil,nil],["g","g","g"],[nil,nil,nil]]

  5. ruby - 怎么来的(a_method || :other) returns :other only when assigning to a var called a_method? - 2

    给定以下方法:defsome_method:valueend以下语句按我的预期工作:some_method||:other#=>:valuex=some_method||:other#=>:value但是下面语句的行为让我感到困惑:some_method=some_method||:other#=>:other它按预期创建了一个名为some_method的局部变量,随后对some_method的调用返回该局部变量的值。但为什么它分配:other而不是:value呢?我知道这可能不是一件明智的事情,并且可以看出它可能有多么模棱两可,但我认为应该在考虑作业之前评估作业的右侧...我已经在R

  6. ruby - Arrays Sets 和 SortedSets 在 Ruby 中是如何实现的 - 2

    通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复

  7. ruby-on-rails - 禁用设备的 :confirmable on-the-fly to batch-generate users - 2

    Devise是一个Ruby库,它为我提供了这个User类:classUser当写入:confirmable时,注册时会发送一封确认邮件。上周我不得不批量创建300个用户,所以我在恢复之前注释掉了:confirmable几分钟。现在我正在为用户批量创建创建一个UI,因此我需要即时添加/删除:confirmable。(我也可以直接修改Devise的源码,但我宁愿不去调和它)问题:如何即时添加/删除:confirmable? 最佳答案 WayneConrad的解决方案:user=User.newuser.skip_confirmation

  8. Ruby on Rails regexp equals-tilde 与 array include 用于检查选项列表 - 2

    我正在使用Rails3.2.3和Ruby1.9.3p0。我发现我经常需要确定某个字符串是否出现在选项列表中。看来我可以使用Ruby数组.includemethod:或正则表达式equals-tildematchshorthand用竖线分隔选项:就性能而言,一个比另一个好吗?还有更好的方法吗? 最佳答案 总结:Array#include?包含String元素,在接受和拒绝输入时均胜出,对于您的示例只有三个可接受的值。对于要检查的更大的集合,看起来Set#include?和String元素可能会获胜。如何测试我们应该根据经验对此进行测试

  9. ruby - 从另一个私有(private)方法中使用 self.xxx() 调用私有(private)方法 xxx,导致错误 "private method ` xxx' called” - 2

    我正在尝试获得良好的Ruby编码风格。为防止意外调用具有相同名称的局部变量,我总是在适当的地方使用self.。但是现在我偶然发现了这个:classMyClass上面的代码导致错误privatemethodsanitize_namecalled但是当删除self.并仅使用sanitize_name时,它会起作用。这是为什么? 最佳答案 发生这种情况是因为无法使用显式接收器调用私有(private)方法,并且说self.sanitize_name是显式指定应该接收sanitize_name的对象(self),而不是依赖于隐式接收器(也是

  10. arrays - 计算数组中的匹配元素 - 2

    给定两个大小相等的数组,如何找到不考虑位置的匹配元素的数量?例如:[0,0,5]和[0,5,5]将返回2的匹配项,因为有一个0和一个5共同;[1,0,0,3]和[0,0,1,4]将返回3的匹配项,因为0有两场,1有一场;[1,2,2,3]和[1,2,3,4]将返回3的匹配项。我尝试了很多想法,但它们都变得相当粗糙和令人费解。我猜想有一些不错的Ruby习惯用法,或者可能是一个正则表达式,可以很好地回答这个解决方案。 最佳答案 您可以使用count完成它:a.count{|e|index=b.index(e)andb.delete_at

随机推荐