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

我使用PHP curl函数通过http请求(和使用proxy)获取数据。我为此创建的功能:

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和Proxies不是造成限制的原因,那还能是什么?我如何找出来?

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


用curl函数替换了file_get_contents以获取
http数据
将https://网址替换为http://网址(这样更快吗?)
索引表
替换了由纯IP地址调用的API域名(因此
DNS时间不是一个因素)
我仅使用延迟低的专用代理。


我的问题:


性能限制的可能原因是什么?
我如何找到限制的原因?
这可能是由于某些TCP / IP限制/配置不正确的apache / windows引起的吗?
该API确实非常快,并且可以为其他人提供许多次查询,因此我认为它不能更快​​地响应。

最佳答案

每次调用curl函数时,您正在读取代理文件。我建议您在功能之外使用读取操作。我的意思是一次读取代理,并将其存储在数组中以重复使用。
使用此卷曲选项​​CURLOPT_TIMEOUT可以为卷曲执行定义固定的时间量(例如3秒)。这将帮助您调试是否是curl操作问题。

10-04 14:40
查看更多