Mehrere Graph Aktionen mit CURL Multi-Threading ausführen

Like it?
Share it!

- Gastbeitrag von Stephan Alber -

Problemstellung und Lösung
Das Veröffentlichen von Inhalten über die neue Facebook Graph API sollte die meisten Entwickler nicht vor große Probleme stellen. Es sei denn, es soll einen Vielzahl von Operationen zur selben Zeit ausgeführt werden. Das Problem: Die Kommunikation mit der Graph API beansprucht – je nach Anbindung und Serverlast – ca. 1-2 Sekunden pro Request. Bei FBML Anwendungen erwartet Facebook jedoch eine Antwort innerhalb von rund 10 Sekunden. Hierdurch kommt es schnell zu einem Timeout und somit zu einer unerwünschten Fehlerseite.

Für die Timeouts gibt es eine einfache Abhilfe: Anstatt alle Requests in Reihe auszuführen, versuchen wir parallel mehrere Verbindungen aufzubauen. Diese Funktionalität ist im PHP cURL Library integriert. Als Basis für den folgenden Lösungsansatz  wurde die cURL Klasse von David Hopkins verwendet (Download: PHP cURL Class With Multi-Threading).

Beispiel Quellcode: Mehrere Pinnwandeinträge erstellen
Im vorliegenden Beispiel wird ein Pinnwandeintrag pro Request generiert. Es können (fast) alle weiteren unter „Publishing to Facebook“ beschriebenen Funktionen über diesen Lösungsansatz verwendet werden.

Es wird vorausgesetzt, dass ein gültiger Access Token vorhanden ist. Erst wird die Instanz der CURL Klasse erzeugt, über die Funktion „addWallpost()“ werden die einzelnen Wallposts hinzugefügt bzw. gesammelt. Erst über den Aufruf von $curl->exec(); werden die Graph API Requests ausgeführt.

    require_once ('CURL.php');
$curl = new CURL();
$access_token = getFacebookAccessToken();
foreach ( $user_ids AS $user_id ) {
addWallpost($curl, $user_id, $access_token);
}
$curl-> exec();
$curl-> clear();

In der addWallpost() Funktion werden die Optionen des Pinnwandeintrags in eine Graph URL umgewandelt sowie ein paar CURL Optionen gesetzt.

function addWallpost(&$curl, $target_id, $access_token, $template = false)
{
$wallpost_options = array();
$wallpost_options['access_token'] = $access_token;
switch ($template)
{
default:
$wallpost_options['message'] = 'Unsere Nachricht';
$wallpost_options['picture'] = 'http://www.domain.de/pfad/zum_bild.jpg';
$wallpost_options['caption'] = '{*actor*} Aktions Beschriftung';
$wallpost_options['description'] = 'Beschreibung';
$wallpost_options['link'] = 'http://www.domain.de/';
$wallpost_options['name'] = 'Name der Anwendung';
break;
} 
$opts = array();
$opts[CURLOPT_SSL_VERIFYHOST] = false;
$opts[CURLOPT_SSL_VERIFYPEER] = false;
$opts[CURLOPT_FOLLOWLOCATION] = true;
$opts[CURLOPT_RETURNTRANSFER] = true;
$opts[CURLOPT_TIMEOUT] = 7;
$opts[CURLOPT_POST] = true;
$options[CURLOPT_POSTFIELDS] =  parsePost($wallpost_options);
$curl-> addSession('https://graph.facebook.com/' .$target_id   . '/feed', $options);
}
function parsePost($wallpost_options)
{
$post_array = array();
foreach ($wallpost_options as $post_key => $value)
{
$post_array[] = urlencode($post_key) . "=" . urlencode($value);
}
return implode("&", $post_array);
}

Fazit und Ausblick

Mit der vorgestellten Methode sollte es kein Problem sein Pinnwandeinträge mit individuellem Inhalt an ca. 25 verschiedene Nutzer innerhalb einer Sekunde Rechenzeit zu erstellen.
Die Methode wurde bisher noch nicht mit der Upload Funktionalität getestet. Dieses Thema werden wir demnächst in einem weiteren Artikel beleuchten.

Über den Autor

Stephan Alber studierte Online Medien (B.Sc.) an der Hochschule Furtwangen. Unter dem Label “FranciMedia” entwickelt er für namhafte Kunden objekt-orientierte PHP Anwendungen sowie barrierefreie HTML/CSS Layouts. Von FranciMedia erstellte Anwendungen und Spiele wurden im laufenden Jahr von rund 250.000 Facebook Nutzern verwendet.


1 Kommentar;

Diskutiere mit uns!