我正在建立一个网站,我的用户可以在其中创建存储在数据库中的名称列表。然后他们可以检查"这些列表,列表中的每个名称都通过cURL函数运行,检查外部站点以查看该名称是否可用(对于域名,Twitter名称,Facebook名称,游戏名称等)。将有一个下拉列表,供他们选择要查找的名称类型,并检查该站点。
这是Runescape名称检查器的代码示例:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://services.runescape.com/m=adventurers-log/display_player_profile.ws?searchName=" . $name);
curl_setopt($ch, CURLOPT_HTTPGET, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$output = curl_exec($ch);
if (stristr($output,"non-member account")) {
echo 'Not available';
}
elseif (stristr($output,"private profile")) {
echo 'Not available';
}
elseif (stristr($output,"top skills")) {
echo 'Not available';
}
else {
echo 'Available';
}
curl_close($ch);
这会对服务器造成太大的压力吗?我也想到了封顶列表,所以每个列表中只有1,000个名字可用于免费会员或者其他东西,并且他们可以升级到运行更大的列表(对于免费用户可能甚至小于1,000)。我能做的另一件事就是在本地存储结果(无论如何我都会这样做),如果最近搜索了名称,则从那里加载它。但那时它并不完全准确。
答案 0 :(得分:1)
答案只能是“取决于”。这取决于您拥有多少用户,这些用户访问相关页面的频率,硬件的强大程度,主机允许的带宽,传输的数据量以及其他一百万个。
通常,您应该在本地(例如,在服务器上)缓存尽可能多的API响应数据。这可以防止对您之前已经拥有的数据进行不必要的重复API请求。至于什么数据有意义缓存,这完全是应用程序/ API特定的,你必须决定。一般来说,良好的缓存候选者不会经常更改,并且在 更改时很容易确定,或者不够重要,以至于有些陈旧的数据将是一件大事。
答案 1 :(得分:0)
CURL请求从根本上来说很慢,并且PHP在很大程度上是一种同步语言,所以除非你想等待每个请求返回(当我测试你的命令时每个请求需要大约1.2秒)你最好打赌要么让PHP通过exec
使用你的操作系统的curl命令来分叉curl请求,要么使用非阻塞套接字。本文对如何操作有很好的解释:
https://segment.io/blog/how-to-make-async-requests-in-php/
但是,您仍然会遇到接收主机可能无法处理您正在发送的请求量(或者会将您列入黑名单)的问题。您可以更轻松地将请求分成多个批处理(一次说十个名称),然后同时针对每个主机(Runescape,FB等)运行这些请求...这样可以让您同时运行几百个请求而无需点击任何一个主持人太难......这仍然是一个缓慢的过程,你可能会被禁止你的知识产权,但这是一个合理的方法。
此外,您可能会考虑让整个过程在很长一段时间内分解......所以用户上传列表,而您的服务器说“谢谢,当我们发送时您会收到一封电子邮件完成“...然后使用cron作业在一小时左右的时间内安排后续的cURL
请求......这应该有助于解决上述所有问题。