我试图从Twitter上嵌入推文。所以,我使用cURL来恢复json。我写了一点测试,但测试大约需要5秒钟,当我在本地运行时。所以,我不确定我在这里做错了什么。
public function get_tweet_embed($tw_id) {
$json_url = "https://api.twitter.com/1/statuses/oembed.json?id={$tw_id}&align=left&omit_script=true&hide_media=false";
$ch = curl_init( $json_url );
$start_time = microtime(TRUE);
$JSON = curl_exec($ch);
$end_time = microtime(TRUE);
echo $end_time - $start_time; //5.7961111068726
return $this->get_html($JSON);
}
private function get_html($embed_json) {
$JSON_Data = json_decode($embed_json,true);
$tw_embed_code = $JSON_Data["html"];
return $tw_embed_code;
}
当我粘贴链接并从浏览器进行测试时,它真的很快。
答案 0 :(得分:16)
我所拥有的最佳速度是重复使用相同的卷曲手柄。
将$ch = curl_init( $json_url );
替换为curl_setopt($ch, CURLOPT_URL, $url);
。然后在函数外面有一个$ch = curl_init();
。您需要在函数中使$ch
全局访问它。
重用curl句柄可以保持与服务器的连接打开。这仅在请求之间服务器相同时才有效。
答案 1 :(得分:13)
加速的最终解决方案是
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
此致
答案 2 :(得分:7)
尝试设置
curl_setopt($ch, CURLOPT_ENCODING, '')
它启用了gzip压缩
答案 3 :(得分:5)
关于环境,我在PHP中观察到cURL通常在大多数环境中运行得非常快,除非在CPU较低且网络性能较低的地方。例如,在我的MAMP安装上的localhost上,curl很快,在更大的亚马逊实例上,curl很快。但是在一个小型的糟糕主机上,我发现它有性能问题,连接速度明显变慢。虽然,我不确定为什么更慢。此外,它肯定不会慢5秒。
为了帮助确定它的PHP或您的环境,您应该尝试通过命令行与curl进行交互。至少你可以排除PHP代码,如果它仍然是5秒。
答案 4 :(得分:2)
为加速cURL,我建议为API创建一个特殊的类(例如ApiClient
)并使用一个共享的cURL处理程序,只为每个请求更改URL。还可以减少名称解析请求,并使用压缩后的响应。
我每天需要从一台API服务器处理大约一百万个实体,这限制了我们只能使用一个并发连接。我创建了该课程。我希望它能帮助其他人优化他们的卷曲要求。
class ApiClient
{
const CURL_TIMEOUT = 3600;
const CONNECT_TIMEOUT = 30;
const HOST = 'api.example.com';
const API_TOKEN = 'token';
/** @var resource CURL handler. Reused every time for optimization purposes */
private $ch;
/** @var string URL for API. Calculated at creating object for optimization purposes */
private $url;
public function __construct()
{
$this->url = 'https://' . self::HOST . '/v1/entity/view?token=' . self::API_TOKEN . '&id=';
// Micro-optimization: every concat operation takes several milliseconds
// But for millions sequential requests it can save a few seconds
$host = [implode(':', [ // $host stores information for domain names resolving (like /etc/hosts file)
self::HOST, // Host that will be stored in our "DNS-cache"
443, // Default port for HTTPS, can be 80 for HTTP
gethostbyname(self::HOST), // IPv4-address where to point our domain name (Host)
])];
$this->ch = curl_init();
curl_setopt($this->ch, CURLOPT_ENCODING, ''); // This will use server's gzip (compress data)
// Depends on server. On some servers can not work
curl_setopt($this->ch, CURLOPT_RESOLVE, $host); // This will cut all requests for domain name resolving
curl_setopt($this->ch, CURLOPT_TIMEOUT, self::CURL_TIMEOUT); // To not wait extra time if we know
// that api-call cannot be longer than CURL_TIMEOUT
curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, self::CONNECT_TIMEOUT); // Close connection if server doesn't response after CONNECT_TIMEOUT
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true); // To return output in `curl_exec`
}
/** @throws \Exception */
public function requestEntity($id)
{
$url = $this->url . $id;
curl_setopt($this->ch, CURLOPT_URL, $url);
$data = curl_exec($this->ch);
if (curl_error($this->ch)) {
throw new \Exception('cURL error (' . curl_errno($this->ch) . '): ' . curl_error($this->ch));
}
return $data;
}
public function __destruct()
{
curl_close($this->ch);
}
}
此外,如果您与服务器只有一个连接没有限制,则可以使用curl_multi_*
函数。
答案 5 :(得分:1)
尝试
CURLOPT_TCP_FASTOPEN => 1
...激活TCP-Fast-Open。
它已添加到cURL 7.49.0,已添加到PHP 7.0.7。
答案 6 :(得分:-1)
仅尝试使用ipv-4。默认情况下,curl使用ipv-6及其速度较慢。我在curl命令中添加了--ipv4参数,成本降低了8秒到4秒