php - 从 API 获取数据时诊断瓶颈

标签 php mysql optimization curl proxy

我正在运行一个从 API 服务器获取数据的专用服务器。我的机器在 Windows Server 2008 操作系统上运行。

我使用 PHP curl 函数通过 http 请求(并使用代理)获取数据。我为此创建的函数:

function get_http($url)
{

$proxy_file = file_get_contents("proxylist.txt");
$proxy_file = explode("
", $proxy_file);

$how_Many_Proxies = count($proxy_file);

$which_Proxy = rand(0,$how_Many_Proxies);


$proxy = $proxy_file[$which_Proxy];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$curl_scraped_page = curl_exec($ch);
curl_close($ch);

return $curl_scraped_page;
}

然后我使用这个简单的代码将其保存在MySQL数据库中,我与curl并行运行20-40-60-100个版本(在一些数字之后,它不会提高性能,我想知道瓶颈在哪里?) :

function retrieveData($id)
{

$the_data = get_http("http://api-service-ip-address/?id=$id");

return $the_data;   

}

$ids_List = file_get_contents("the-list.txt");
$ids_List = explode("
",$ids_List);

for($a = 0;$a<50;$a++)

{

$array[$a] = get_http($ids_List[$a]);

}


    for($b = 0;$b<50;$b++)
    {


    $insert_Array[] = "('$ids_List[$b]', NULL, '$array[$b]')";


    }
    $insert_Array = implode(',', $insert_Array);

    $sql = "INSERT INTO `the_data` (`id`, `queue_id`, `data`) VALUES $insert_Array;";

    mysql_query($sql);

经过多次优化后,我陷入了每秒检索/获取/保存大约 23 行数据的困境。

MySQL 表非常简单,如下所示:

id |队列 ID(AI) |数据

请记住,数据库似乎并不是瓶颈。当我检查 CPU 使用率时,mysql.exe 进程几乎没有超过 1%。

我通过 125 个代理获取数据。 我已将测试数量减少到 20,但没有任何区别(这表明代理不是瓶颈? - 因为当使用的代理数量减少 5 倍时,我获得了相同的性能?)

那么,如果 MySQL 和代理不是造成限制的原因,那么还有什么原因以及如何找出原因?

到目前为止,我所做的优化:

  • 用curl函数替换file_get_contents来检索 http数据

  • 将 https://网址替换为 http://网址(这样更快吗?)

  • 为表格建立索引

  • 替换了纯IP地址调用的API域名(所以 DNS 时间不是一个因素)

  • 我只使用低延迟的私有(private)代理。

我的问题:

  • 导致性能限制的可能原因是什么?

  • 如何查找限制原因?

  • 这可能是由于某些 TCP/IP 限制/apache/windows 配置不当造成的吗?

  • 该 API 速度非常快,而且它为其他人提供的查询数量要多很多倍,因此我不认为它不能更快​​地响应。

最佳答案

  1. 每次调用curl函数时,您都会读取代理文件。我建议您在函数之外使用读取操作。我的意思是读取代理一次,并将其存储在数组中以重复使用。

  2. 使用此curl选项CURLOPT_TIMEOUT来定义curl执行的固定时间(例如3秒)。它将帮助您调试是否是curl操作的问题。

关于php - 从 API 获取数据时诊断瓶颈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20757908/

相关文章:

php - 如何在变量中获取选择/下拉菜单 PHP 或 HTML 的选择值

phpmailer 用于每个循环自定义主体

php - 带有 php 的 html 表单无法连接并且也没有显示错误

mysql查询选择一个目标的所有目标和完成的目标

algorithm - 优化有风险吗?

algorithm - 如何找到总和刚好高于阈值的元素组合

php - MySQL 搜索查询 - "Keep"不工作

php - MySql 选择结果合并了来自同一个表和其他表的多个查询

mysql - 用于产生所需输出的子查询选项

在 3D 边界框中的其他球体之间最佳拟合球体的算法?