2012-06-15 4 views
0

Я пишу веб-приложение, которое позволяет пользователям искать данные из своего профиля Facebook, а также их друзей (которые также разрешили приложение). Первоначально я перебирал друзей и делал отдельные вызовы API для получения данных друзей, но это было слишком медленным. Поэтому я переключился на создание массива запросов API и отправку одного из них batch request.Запрос пакета API Facebook API очень медленный

Предполагается, что пакетный запрос является решением моей проблемы, но он STILL мучительно медленный. Загрузка моей страницы составляет около 15 секунд, и я не могу понять, почему. В документации утверждается, что каждый запрос в пакете обрабатывается параллельно, но, похоже, это не так. Имеет ли значение, что каждый из моих пакетных запросов принимает уникальный токен доступа? В документации не означает, что это проблема, но в документации не говорит много вещей ...

Вот пример одного из моих пакетных запросов:

[ 
{"method":"GET", 
"relative_url":"\/#####\/friends?fields=name,first_name,last_name,id,work,education&access_token=#####"}, 
{"method":"GET", 
"relative_url":"\/#####\/friends?fields=name,first_name,last_name,id,work,education&access_token=#####"}, 
{"method":"GET", 
"relative_url":"\/#####\/friends?fields=name,first_name,last_name,id,work,education&access_token=#####"} 
] 

Просто чтобы дать вы в каком-то контексте, приложение делает один запрос API для получения друзей пользователя. Затем он просматривает эти результаты и строит пакетный запрос для каждого друга (который разрешил приложение) и отправляет второй запрос на пакет API с помощью PHP SDK ($ json_batch - пакетный запрос, подобный показанному выше):

$rawdata = $facebook->api('?batch='.$json_batch, 'POST'); 

(пример выше). Кумулятивные результаты проверяются на совпадения с поисковым запросом пользователя и возвращаются обратно пользователю. Любые идеи, почему это должно занять 20 секунд?

UPDATE: Я добавил код для отслеживания времени в разное время во время выполнения сценария ... Весь класс работает в 11-13 секунд. Первый вызов FB api (на график) занимает 0,6 секунды. Второй пакетный вызов - 10-11 секунд! Но почему?

ответ

0

Я не уверен, почему пакетные запросы занимают так много времени, но для ответа на токен доступа по запросу нет необходимости делать это, если вы не ставите разные токены, если вы используете один и тот же токен, тогда вы можете просто (как в документации):

curl \ 
    -F 'access_token=…' \ 
    -F 'batch=[ \ 
      {"method": "GET", "relative_url": "me"}, \ 
      {"method": "GET", "relative_url": "me/friends?limit=50"} \ 
     ]'\ 
    https://graph.facebook.com 

однако вы можете получить ту же самую точную информацию с помощью single FQL query:

SELECT uid, username, name, first_name, middle_name, last_name, work, education 
FROM user 
WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me()) 

Это также устраняет необходимость запроса сепарабельнозначных для друзей вошедшего пользователя первым , но если у вас есть список фри nd ids вы можете поместить их в предложение IN вместо внутреннего запроса.
Возможно, это решение fql вернется быстрее.

+0

Спасибо Nitzan. Я был обеспокоен тем, что ответ может оказаться FQL ... Я до сих пор избегал этого, но, возможно, пришло время «укусить пулю» и переписать вызов API как FQL. Я попробую сделать несколько тестов и отчитаться. – emersonthis

+0

Почему вы избегаете fql? –

+0

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

Смежные вопросы