从API获取数据时诊断瓶颈

时间:2013-12-24 09:03:19

标签: 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 | queue_id(AI)|数据

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

我通过125个代理获取数据。 我已经将测试的数量减少到20并且它没有任何差别(表明代理不是瓶颈? - 因为我使用相同的性能时使用5倍以下的代理?)

因此,如果MySQL和代理不是限制的原因,那还有什么呢?我该如何找到?

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

  • 用curl函数替换了file_get_contents以便检索 http数据

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

  • 索引表格

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

  • 我只使用具有低延迟的私有代理。

我的问题:

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

  • 如何找到限制的原因?

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

  • API非常快,它向其他人提供的查询次数要多很多次,所以我认为它无法更快地响应。

1 个答案:

答案 0 :(得分:1)

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

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