1

ユーザーが撮影した写真を Facebook アカウントで共有できる写真ブース アプリを作成しています。ほとんどの場合、それは非常にうまく機能しています。AJAX を使用して、この PHP ページに投稿しています。

$appID = "#####";
$appSecret = "#####";
$accessToken = $_POST['accessToken'];
$filePath = $_POST['imagePath'];
$message = $_POST['message'];

// Initialize the SDK
$facebook = new Facebook(array(
    'appId' => $appID,
    'secret' => $appSecret,
    'fileUpload' => true,
    'cookie' => true
));

$facebook->setAccessToken($accessToken);

// Upload the photo
$response = $facebook->api("/me/photos", "post", array(
    'message' => $message,
    'image' => '@' . $filePath
));

echo json_encode($response);

応答で Facebook から投稿 ID が返された場合、私の Javascript は成功メッセージを表示します。投稿 ID なしで応答を返すと、エラー メッセージが表示されます。時折、Facebook の速度が遅い、インターネットが切断されている、またはその他の制御できない要因が原因であるかどうかにかかわらず、Facebook へのリクエストが処理され続け、応答がまったく返されないことがあります。

アップロードに時間がかかる場合は、アップロードの途中で「まだ機能しています...」というようなメッセージを作成したいと思います。その後、「申し訳ありませんが、写真をアップロードできませんでした。ページを更新してください。時間がかかりすぎる場合は、もう一度やり直してください。jQuery.ajax リクエストでタイムアウトを簡単に作成できることはわかっていますが、タイムアウトしてエラー コールバックが実行されたとしても、(私の理解では) 問題はサーバー上で引き続き発生します。何らかの理由で元の写真をアップロードするのにタイムアウトよりも時間がかかる場合、ユーザーがページを更新して正常にアップロードすると、重複が発生します。

これに対するいくつかの仮説的な解決策を思いつきましたが、それらの実装方法がわかりません。

1) 一定時間後にサーバー側でアップロード プロセスをキャンセルし (これは不可能であると確信しています)、エラーを表示します 2) アップロードする前に写真が重複していないか確認します (これは、アップロードプロセスが非常に遅い)

そのため、タイムアウト プロセスが終了しないことを願う唯一の解決策が残されています。これは信頼性が低く、いくつかの重複が発生する可能性があります。同時に、アップロードを待とうとすると、いつも我慢できないほど時間がかかります。

この問題を解決するためのアイデアはありますか?

4

1 に答える 1

0

これは可能なはずです。最初に試行で API 呼び出しにラップし、例外をキャッチします。また、リクエストのタイムアウトを長くまたは短く変更します。それは「キャンセル」の1つの方法でしょう。base_facebook.php でこれを変更して、CURLOPT_CONNECTTIMEOUT を探すことができます。

try {
    $response = $facebook->api("/me/photos", "post", array(
        'message' => $message,
        'image' => '@' . $filePath
    ));
} catch (FacebookApiException $e) {
    var_dump($e);
    // Other error handling
}
于 2012-12-05T00:08:33.913 に答える