加速 php api 调用
Speedup php api calls
大家好。所以我需要通过 API 调用检查数据库中的大量行。我设法做到了,但是速度很慢。
以下是我的代码执行的步骤:
1.) 我 select 来自本地数据库的唯一标识符。
2.) 我通过 curl_multi 在远程数据库上检查它们(当时是 100 个)。
3.) 根据状态代码,我更新数据库中的行。
4.) 重复前 3 个步骤,直到检查完所有行。
我怎样才能加快这个过程?此时检查600行需要一分多钟。
foreach ($data as $d){
$kupci = [];
$upit = "SELECT * FROM database_table WHERE provjeren IS NULL LIMIT 100";
$result = $conn->query($upit)
while ($r = mysqli_fetch_assoc($result)) {
$kupci[] = $r;
}
$node_count = count($kupci);
$curl_arr = array();
for ($i = 0; $i < $node_count; $i++) {
$ID = str_replace(" ","%20",$kupci[$i]['Customer_ID']) ;
$url = "someapiurl/$ID";
$curl_arr[$i] = curl_init($url);
curl_setopt($curl_arr[$i], CURLOPT_HTTPHEADER, array("Authorization: Bearer"));
curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_arr[$i], CURLOPT_ENCODING, '');
}
$master = curl_multi_init();
for ($i = 0; $i < $node_count; $i++) {
curl_multi_add_handle($master, $curl_arr[$i]);
}
do {
curl_multi_exec($master, $running);
} while ($running > 0);
for ($i = 0; $i < $node_count; $i++) {
$results = curl_multi_getcontent($curl_arr[$i]);
$link = curl_getinfo($curl_arr[$i], CURLINFO_EFFECTIVE_URL);
$id = substr($link, strrpos($link, '/') + 1);
$statusCode = curl_getinfo($curl_arr[$i], CURLINFO_RESPONSE_CODE);
if ($statusCode == 204) {
$conn->query("UPDATE database_table SET provjeren = 1, prigovor = 1, datum = now() WHERE Customer_ID = '$id'");
} elseif ($statusCode == 404) {
$conn->query("UPDATE database_table SET provjeren = 1, prigovor = 0, datum = now() WHERE Customer_ID = '$id'");
}elseif ($statusCode == 429){
echo "Previše";
}elseif ($statusCode == 200){
$conn->query("UPDATE database_table SET provjeren = 1, prigovor = 2, datum = now() WHERE Customer_ID = '$id'");
}
curl_multi_remove_handle($master, $curl_arr[$i]);
curl_close($curl_arr[$i]);
}
curl_multi_close($master);
}
编辑: 我尝试了 Rolling-Curl,得到了相同的结果。所以我的结论是目标服务器很慢,这是我的瓶颈。在我的目标服务器上测试了 500 个请求需要 36 秒才能完成,而在 Google 服务器上只需要 2 秒就可以完成。
您是否尝试过 运行 通过新线程进行 HTTP API 调用。
试试这个 PHP 项目:https://github.com/petewarden/ParallelCurl
根据您需要的文档:
- 创建一个最大的并行 cURL 对象。同时 HTTP 连接数
- 当 API 的答案到达时编写处理程序
- 在迭代数据库中的行时编写 cURL 调用
如果没有帮助,请尝试测量最耗时的内容(数据库提取、API 次调用、数据库更新)
大家好。所以我需要通过 API 调用检查数据库中的大量行。我设法做到了,但是速度很慢。
以下是我的代码执行的步骤:
1.) 我 select 来自本地数据库的唯一标识符。
2.) 我通过 curl_multi 在远程数据库上检查它们(当时是 100 个)。
3.) 根据状态代码,我更新数据库中的行。
4.) 重复前 3 个步骤,直到检查完所有行。
我怎样才能加快这个过程?此时检查600行需要一分多钟。
foreach ($data as $d){
$kupci = [];
$upit = "SELECT * FROM database_table WHERE provjeren IS NULL LIMIT 100";
$result = $conn->query($upit)
while ($r = mysqli_fetch_assoc($result)) {
$kupci[] = $r;
}
$node_count = count($kupci);
$curl_arr = array();
for ($i = 0; $i < $node_count; $i++) {
$ID = str_replace(" ","%20",$kupci[$i]['Customer_ID']) ;
$url = "someapiurl/$ID";
$curl_arr[$i] = curl_init($url);
curl_setopt($curl_arr[$i], CURLOPT_HTTPHEADER, array("Authorization: Bearer"));
curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_arr[$i], CURLOPT_ENCODING, '');
}
$master = curl_multi_init();
for ($i = 0; $i < $node_count; $i++) {
curl_multi_add_handle($master, $curl_arr[$i]);
}
do {
curl_multi_exec($master, $running);
} while ($running > 0);
for ($i = 0; $i < $node_count; $i++) {
$results = curl_multi_getcontent($curl_arr[$i]);
$link = curl_getinfo($curl_arr[$i], CURLINFO_EFFECTIVE_URL);
$id = substr($link, strrpos($link, '/') + 1);
$statusCode = curl_getinfo($curl_arr[$i], CURLINFO_RESPONSE_CODE);
if ($statusCode == 204) {
$conn->query("UPDATE database_table SET provjeren = 1, prigovor = 1, datum = now() WHERE Customer_ID = '$id'");
} elseif ($statusCode == 404) {
$conn->query("UPDATE database_table SET provjeren = 1, prigovor = 0, datum = now() WHERE Customer_ID = '$id'");
}elseif ($statusCode == 429){
echo "Previše";
}elseif ($statusCode == 200){
$conn->query("UPDATE database_table SET provjeren = 1, prigovor = 2, datum = now() WHERE Customer_ID = '$id'");
}
curl_multi_remove_handle($master, $curl_arr[$i]);
curl_close($curl_arr[$i]);
}
curl_multi_close($master);
}
编辑: 我尝试了 Rolling-Curl,得到了相同的结果。所以我的结论是目标服务器很慢,这是我的瓶颈。在我的目标服务器上测试了 500 个请求需要 36 秒才能完成,而在 Google 服务器上只需要 2 秒就可以完成。
您是否尝试过 运行 通过新线程进行 HTTP API 调用。
试试这个 PHP 项目:https://github.com/petewarden/ParallelCurl
根据您需要的文档:
- 创建一个最大的并行 cURL 对象。同时 HTTP 连接数
- 当 API 的答案到达时编写处理程序
- 在迭代数据库中的行时编写 cURL 调用
如果没有帮助,请尝试测量最耗时的内容(数据库提取、API 次调用、数据库更新)