سؤال

أحاول تحديد جميع أصدقاء مشتركون' اتصالات مع PHP/FQL.باستخدام UID (540 الأصدقاء) ، مما يعني >12,000 اتصالات ، >6500 هي فريدة من نوعها.لذلك هذا الكود يجب أن عودة جميع الاتصالات ولكن Facebook على ما يبدو 4999/5000 الصف حد FQL الاستعلامات.

// select mutual unique friends
 $unique_connections = $facebook->api_client->fql_query("

  SELECT uid1, uid2 FROM friend 
   WHERE uid1 IN 
   (SELECT uid2 FROM friend WHERE uid1=$uid)
   AND uid2 IN 
   (SELECT uid2 FROM friend WHERE uid1=$uid)
 ");

أنا أعرف الأرقام أعلاه لأن البرمجية الأصلية كتبت الحلقات من خلال صديقي قائمة يرسل getMutualFriend الاستعلام لكل منهم.

foreach ($friends as $key) 
{
    $mutual_friends = $facebook->api_client->friends_getMutualFriends($key);
    foreach ($mutual_friends as $f_uid)
    {
        array_push($all_connections, array($key,$f_uid)); 
    }
}

بالطبع يستغرق تقريبا 3 دقائق لتشغيل هذا البرنامج النصي ، في حين FQL الاستعلام بإرجاع في 5 ثوان.بعد ساعة من البحث عن إجابة لقد جئت إلى استنتاج الطريقة الوحيدة للحصول على جميع أنحاء هذا هو استخدام مزيج من الطريقتين.حسنا هذا آخر هنا.أي أفكار حول أفضل طريقة لكتابة هذا السيناريو وفاز 4999/5000 الصف الحد ؟

هنا fql_multiquery التي ينبغي أن تفعل الشيء نفسه على النحو الوارد أعلاه.كما أنها تقتصر على 4999/5000.

$queries = '{
"user_friends":"SELECT uid2 FROM friend WHERE uid1 = '.$uid.'",
"mutual_friends":"SELECT uid1, uid2 FROM friend WHERE uid1 IN (SELECT uid2 FROM #user_friends) AND uid2 IN (SELECT uid2 FROM #user_friends)"
}';

$mq_test = $facebook->api_client->fql_multiquery(trim($queries));
print_r($mq_test);
هل كانت مفيدة؟

المحلول

لذا أنا نشر الجواب على سؤالي.كنت قادرا على التحايل على 5000 الصف حد FQL استفسارات chunking مجموعة من UIDs (باستخدام مناسب-اسمه array_chunk() وظيفة PHP) و حلقات من خلال قطع لتنفيذ مصغرة استعلامات ثم إلحاق كل شيء مرة أخرى في مجموعة واحدة.النص كاملا المتوسطات 14 ثانية على أكثر من 12 ، 000 الصفوف بحيث تحسنا كبيرا.يمكنك أن ترى التطبيق في العمل هنا: givememydata.com

أوه, Facebook ينبغي أن تعيد النظر (لا يزال غير المسجلين) FQL الصف الحد.ما هو أكثر من ذلك فرض ضرائب على السيرفرات ؟ استعلام واحد أن ينفذ في 5 ثواني أو 500 الاستفسارات التي تأخذ 180 ثانية ؟ آسف, كان للتنفيس.;-)

نصائح أخرى

$mutual_friends = $facebook->api('/me/mutualfriends/friendid');

البديل هو استخدام fql.multiquery الطريقة ، وإنشاء استعلام FQL منفصل لكل صديق (أو مجموعة من الأصدقاء لكل استعلام FQL) ، ولكن لا يزال يرسل جميع الاستعلامات في نفس الطلب.

ملاحظة مثيرة للاهتمام: عندما أحاول العثور على جميع الأشخاص الذين لديهم أصدقاء مشتركون لي أنا أستخدم الاستعلام التالي

حدد uid1 ، uid2 من صديق حيث uid1 (حدد uid2 من صديق حيث uid1 = $ uid)

كما ترون أنه يشبه إلى حد كبير استفسارك ، إلا أنني أزلت البند.

أحصل على رسالة الخطأ التالية: "لا يمكن البحث في جميع أصدقاء 208733. لا يمكن إلا البحث عن المستخدم المسجّل في المستخدم أو تسجيل الدخول إلى أصدقاء المستخدم الذين هم مستخدمون لتطبيقك".

أعتقد أن Facebook ذكي بما يكفي لمعرفة أنني أحاول أن أفعل شيئًا لا يريدني أن أفعله. إنه يكتشف بطريقة أو بأخرى حقيقة أنك تحاول العثور على أصدقاء صديقك فقط هم أيضًا أصدقائك ، بينما أحاول العثور على جميع أصدقاء صديقي.

يدعم FQL حدًا ، تمامًا مثل SQL العادي. يمكنك تجربة ذلك.http://developers.facebook.com/docs/guides/performance

خلاف ذلك ، أقترح الحصول على معرفات الصديق لكل مستخدم ، وتخزين تلك الموجودة في جدول SQL ، ثم تنفيذ انضمامك الخاص للحصول على التقاطع. قد تكون قادرًا على الحصول على قوائم الأصدقاء مرة واحدة ثم اشترك في تحديثات الوقت الحقيقي للحفاظ على قوائمك محدثة.http://developers.facebook.com/docs/api/RealTime

واحدة من الخدعة التي يبدو أنني تمكنت من استخدامها هي الحد من عدم الاستفسارات بناءً على أحد الأعمدة القابلة للفهرسة من الجداول الخاصة بك (باستخدام strpos (column_name ، الحرف / الرقم)).

السابق:

$fql = "SELECT pid,src_big,owner FROM photo WHERE album_object_id IN 
      (SELECT object_id FROM privacy WHERE 
             ( object_id IN ( SELECT object_id FROM album WHERE owner IN (SELECT uid2 FROM friend WHERE 
                   ( uid1 = " . $this->nextUser->fbid . " AND **strpos(uid2,2) = 1**  )))                                   
           AND ( value = 'FRIENDS_OF_FRIENDS' OR value = 'EVERYONE'  ) )) ;

وبهذه الطريقة يمكنك تقسيمها في 10 قهات فرعية ، أو لحقل ألفن رقمي في 33.

كنت أفعل شيئًا مشابهًا- لكن الحصول على منشورات صفحة FB- وركضت في التخزين المؤقت المضحك على خوادم FB عندما قمت بضربها بمجموعات متعددة- يعد FQL تجويف وسيلة للتغلب على هذا ، راجع للشغل. ونعم ، ركض في الحد الأقصى 5K وضغط فقط تحت 5 آلاف واضطررت إلى إنشاء تراكم ، والذي كان ألمًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top