当加载时,YouTube API检索数据会显著降低我的网站速度


YouTube API retrieving data slows my site down significantly when loading

我正在使用YouTube的api加载用户在Facebook等订阅源中共享的视频的当前数据,问题是它会大大降低我的网站速度,每组数据大约需要2-4秒,所以如果我有一个2-4秒的视频,然后是两个4-8秒的视频等。所以我的问题是,有没有一种方法可以不检索所有数据,并加快速度。(当用户分享视频时,我会将视频的标题和描述存储在自己的数据库中,但其他数据我不能。这是我的代码:

 $JSON = file_get_contents("http://gdata.youtube.com/feeds/api/videos?q={$videoID}&alt=json");
 $JSON_Data = json_decode($JSON);
 $ratings = $JSON_Data->{'feed'}->{'entry'}[0]->{'gd$rating'}->{'average'};
 $totalRatings = number_format($JSON_Data->{'feed'}->{'entry'}[0]->{'gd$rating'}->{'numRaters'});
 $views = number_format($JSON_Data->{'feed'}->{'entry'}[0]->{'yt$statistics'}->{'viewCount'});

我还加载了缩略图,提交时我可能会将缩略图保存在服务器上,但这似乎并没有让它慢下来,因为当我删除它时,仍然需要很长时间。

 $thumbnail = "http://img.youtube.com/vi/".$videoID."/2.jpg";

您可以使用CURL、file_get_contents。。。。。这不是重点。

重点是:缓存响应!

使用memcached、文件系统、数据库或其他任何东西,但在页面加载时永远不要调用API

据我所知,这通常是PHP不太擅长做的事情。

它根本不支持多线程,线程正是您想要做的(同时执行所有http请求,以便合并它们的延迟)。

也许您可以通过使用javascript将这部分逻辑移动到浏览器中?JavaScript中的XMLHTTPRequest对象支持多线程。

据我所知,在PHP中实现这一点的唯一方法是使用原始套接字(fsockopen(); fwrite(); fread(); fclose();),但这不是为了假装。。。您需要熟悉HTTP规范。

最后,内容变化很大吗?也许您可以在数据库中拥有html的本地缓存,并使用cron作业(可能每30秒运行一次)来重建缓存?这可能违反了谷歌的服务条款。

实际上,最好的解决方案是使用其他支持线程的语言进行服务器通信,并使用PHP脚本进行通信。我可能会用Ruby。