gpt4 book ai didi

php - call_user_func_array 太慢了吗?

转载 作者:可可西里 更新时间:2023-11-01 08:07:03 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com