Связывание ответов на запросы с помощью пакетных запросов Facebook - PullRequest
4 голосов
/ 15 сентября 2011

Я использую Пакетные запросы Facebook для публикации на нескольких каналах, и мне нужно связать правильный ответ на каждый запрос в пакете. Поскольку я не нашел точной информации в документации, элементы возвращаемого массива отображаются в том же порядке, что и запросы?

Другими словами, если я получаю ошибку в третьем члене возвращаемого массива, означает ли это, что ошибка относится к третьему запросу, который я отправил в пакете?

Я могу использовать идентификатор для успешных запросов, но сообщения об ошибках кажутся общими и не содержат никаких данных, связанных с запросом, который их сгенерировал (если я что-то упустил).

1 Ответ

8 голосов
/ 09 ноября 2011

Да, это правильно.

Моя стратегия заключается в том, что я создаю массив отслеживания при загрузке своих пакетных запросов. Этот массив соотносит ключ для моего ассоциативного массива с порядком, в котором я разместил пакеты. Когда я зацикливаюсь на результатах, я использую счетчик, чтобы пройти через массив отслеживания и вытащить правильный индекс ассоциативного массива. Затем я использую это для обновления ассоциативного массива результатами этого этапа пакетной операции.

Было бы неплохо, если бы пакетная обработка поддерживала параметр 'name', и этот параметр возвращался с каждым ответом. Но это только работает, если вы используете имя для создания пакетных зависимостей: https://developers.facebook.com/docs/reference/api/batch/

Загрузка партий:

foreach ($campaigns as $title => $campaign) {
    if (count($batch) == 20) {
        $batches[] = $batch;
        $batch = array();
    }

    $titles[] = $title;  #TRACKING array;
    $body = http_build_query($campaign);
    $body = urldecode($body);

    $batch[] = array(
        'method' => 'POST',
        'relative_url' => "/act_{$act}/adcampaigns",
        'body' => $body
    );
}

Обработка партий:

if ($batch) {
    $batches[] = $batch;
    $counter = 0;

    foreach ($batches as $batch) {
        $params = array(
          'access_token' => $access_token,
          'batch' => json_encode($batch)
        );

        $responses = $facebook->api('/', 'POST', $params);

        foreach ($responses as $response) {
            $response = json_decode($response['body'], 1);
            $campaign_id = $response['id'];
            $title = $titles[$counter];  #RETRIEVING THE INDEX FROM THE TRACKING ARRAY
            $campaigns[$title]['campaign_id'] = $campaign_id;
            $counter++; #INCREMENTING THE COUNTER
        }
    }
}
...