Facebook图像导入导致504网关超时

时间:2014-08-20 20:19:04

标签: php facebook facebook-graph-api curl facebook-php-sdk

我正在开发一个Facebook Canvas应用程序,其功能之一是复制最大的个人资料照片(50x50)。 20位朋友将其粘贴到600x500像素的模板上。这个特殊功能在上周(8月13日至14日)正常工作,当时我的服务器开始显示504网关超时(NGINX)或500内部服务器错误(Apache)。我尝试了所有可能的选项,包括回滚代码更改,迁移到不同的服务器,增加PHP.ini中的超时,使用FQL而不是Graph API,但没有帮助修复此Timeout问题。

最近,我意识到该应用程序在使用Facebook图片网址(https://graph.facebook.com/uid/picture Facebook CDN路径 imagecreatefromstring / jpeg / png / gif 功能时失败了)作为参数。但是我注意到(并通过测试确认)只有当上述功能对Facebook图像URL进行多次调用时,应用程序才会失败。我尝试使用CURL以及Curl Multi Exec。我也尝试了here给出的解决方案,但Timeout仍在发生。我在我的Facebook请求中添加了 User_Agent 字符串,但这也没有用。

我注意到的另外两件事。

  1. 仅在Facebook / FBCDN域的图像上出现问题。类似的请求在其他几个域上的远程图像没有抛出任何超时。
  2. 尽管投掷超时,但几乎50%的情况下都会复制图像。
  3. 你以前遇到过类似的问题吗?知道出了什么问题或Facebook最近实施了任何图像下载政策吗?

    如果有人可以帮助我,我将感激不尽。

1 个答案:

答案 0 :(得分:0)

使用cURL,您需要使用CURLOPT_FOLLOWLOCATION,以便正确地将请求转发到图像的CDN位置。以下示例演示了如何工作:

header( 'Content-type: image/jpeg' );

$curl = curl_init();
$url = 'https://graph.facebook.com/60506094/picture';

curl_setopt( $curl, CURLOPT_URL, $url );
curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 0 ); 

$resp = curl_exec( $curl );

curl_close( $curl );

echo $resp;

然后,您可以将$resp传递到imagecreatefromstring函数。