Как сделать пакетный запрос fql-запросов в графическом API?

У меня есть 4-5 запросов fql в одной функции. Каждое из них занимает 2-4 секунды, чтобы выполниться. Всего для выполнения всей этой функции требуется 14-15 секунд. Пользователь должен ждать в течение длительного времени. Поэтому я хочу сократить время обработки. (В PHP плохо поддерживается концепция многопоточности.)

Я слышал о концепции пакетного запроса в графическом API. И я много гуглил, но не понял, как использовать пакетный запрос для запросов fql в графическом API.

  • Может ли кто-нибудь дать объяснение на примере использования пакетного запроса fql-запросов?
  • На какое время сократится время обработки запросов?
  • Есть ли другой способ сократить время многих запросов fql?

person Somnath Muluk    schedule 09.03.2012    source источник


Ответы (3)


Вместо того, чтобы вызывать каждый FQL-запрос отдельно, почему бы не использовать FQL Multiquery?

http://developers.facebook.com/docs/reference/rest/fql.multiquery/

ОБНОВЛЕНИЕ В противном случае, если вы не хотите использовать многозадачность, я думаю, что вы ищете здесь. Я не смог найти больше ничего о FQL и Batch.

curl \
     -F 'access_token=…' \
     -F 'batch=[{ "method": "POST", \
    "relative_url": "method/fql.query?query=select+name+from+user+where+uid=4", \
     }]
https://graph.facebook.com
person thermz    schedule 09.03.2012
comment
Между моими этими запросами нет никакой связи. В FQL Multiquery выполнение запросов с 1-го по последний. Я пробовал FQL Multiquery, это также дает такое же время обработки. Итак, я хочу сделать пакетный запрос, который работает так же, как многопоточность на стороне facebook. - person Somnath Muluk; 09.03.2012
comment
Ок, в любом случае это невозможно, это не лучше по времени выполнения, по той простой причине, что вы делаете 1 HTTP GET вместо 4-5. Возможно, не так много, но, безусловно, лучше спросить все за один звонок, а не больше. - person thermz; 09.03.2012
comment
Я ничего не получаю! Не могли бы вы рассказать подробнее? - person Somnath Muluk; 09.03.2012
comment
если (вы используете Multiquery){ вы вызываете facebook только один раз, и это уменьшает накладные расходы HTTP } - person thermz; 09.03.2012
comment
else {вы вызываете facebook FQL API 4-5 раз, увеличивая накладные расходы HTTP} - person thermz; 09.03.2012
comment
Да, я хочу уменьшить это HTTP overhead. Я пробовал оба метода. И проверено бенчмаркингом в codeigniter. Разница едва ли 1-2 секунды. Можно ли уменьшить еще HTTP overhead? - person Somnath Muluk; 09.03.2012
comment
Ни в коем случае: накладные расходы HTTP зависят от того, сколько HTTP-запросов вы отправляете в facebook API. Я только что обновил свой ответ, чтобы приблизиться к тому, о чем вы просите. - person thermz; 09.03.2012
comment
Возможно ли это с помощью PHP-SDK? Я не могу использовать завиток. - person Somnath Muluk; 09.03.2012
comment
Я принял ваш ответ, потому что он дал некоторый намек на решение. - person Somnath Muluk; 09.03.2012
comment
Почему? Можете ли вы объяснить немного лучше? - person thermz; 01.04.2012

Обновлено:

https://graph.facebook.com/?batch=[{"method":"GET","relative_url":"me"},{"method":"GET","relative_url":"me/friends?limit=50"}]&access_token=ACCESS_TOKEN&method=post

Подробнее здесь: http://developers.facebook.com/blog/post/2011/03/17/batch-requests-in-graph-api/

person Alexander Nenkov    schedule 09.03.2012
comment
Пожалуйста, проверьте конкурирующие ответы. thermz дал мне только это решение. Я хочу пакетный запрос fql-запросов в графическом API. Функция пакетного запроса предоставляется графическим API. - person Somnath Muluk; 09.03.2012
comment
Я надеюсь, что этот лучше подходит для вашего вопроса - person Alexander Nenkov; 09.03.2012
comment
Я тоже это читал. Это дает пакетный запрос методов API. Пожалуйста, не могли бы вы дать решение для пакетного запроса fql-запросов в графическом API? Меня это интересует. - person Somnath Muluk; 09.03.2012
comment
Извините, но я не понимаю, что вы хотите. Использование multiquery как раз и есть - пакетный запрос fql-запросов. Вы получаете данные N запросов за один вызов. - person Alexander Nenkov; 09.03.2012
comment
: Между моими этими 4-5 запросами нет никакой связи. В FQL Multiquery выполнение запросов от 1-го до последнего. Я пробовал FQL Multiquery, это также дает такое же время обработки. Итак, я хочу сделать пакетный запрос, который работает так же, как многопоточность на стороне facebook. - person Somnath Muluk; 09.03.2012
comment
Это с их сайта: Таким образом, fql.multiquery уменьшает количество вызовов API, которые вам нужно сделать в Facebook. Даже если вы используете существующий метод batch.run для выполнения нескольких одновременных запросов, вам все равно придется ждать результатов данного запроса, прежде чем вы сможете использовать эти результаты в другом запросе. Кроме того, fql.multiquery может работать лучше, чем batch.run, поскольку выполняет пакетную обработку более разумно. Вы можете расположить запросы в звонке так, как считаете нужным; Facebook обрабатывает запросы параллельно, насколько это возможно. - person Alexander Nenkov; 09.03.2012

//$current_user=идентификатор Facebook

 $query1="SELECT uid, name FROM user WHERE is_app_user=1 AND uid IN (SELECT uid2 FROM friend WHERE uid1 = $current_user)";
 $query2="SELECT uid, name, work_history FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = $current_user )";
 $query3="SELECT uid, name, work, education FROM user WHERE uid = $current_user";
 $queries = array(
           array('method'=>'GET', 'relative_url'=>'method/fql.query?query='.str_replace(' ','+',$query1)),
           array('method'=>'GET', 'relative_url'=>'method/fql.query?query='.str_replace(' ','+',$query2)),
           array('method'=>'GET', 'relative_url'=>'method/fql.query?query='.str_replace(' ','+',$query3))
            );

            $objs = $facebook->api('/?batch='.json_encode($queries), 'POST');

$objs получает json-массив всего результата трех запросов.

И это здорово экономит время. Эти 3 запроса по отдельности занимают всего 9 секунд. С мультизапросом это занимает 7 секунд. А при пакетном запросе это занимает 3,6 секунды.

person Somnath Muluk    schedule 09.03.2012
comment
Хорошая находка! Я бы хотел, чтобы однажды этот бенчмарк работал на Java. - person thermz; 09.03.2012