2010-12-10 4 views
0

J'ai créé une classe d'assistance pour l'API PHP de Facebook afin d'éviter de réutiliser beaucoup de code. L'assistant fonctionne mais le seul problème est que c'est très lent ... et j'ai aussi compris pourquoi! quand j'initialise la classe, le constructeur est appelé deux fois! J'ai vérifié dans mon code et les autres éléments qui utilisent cette classe ne l'appellent qu'une fois (c'est quelque chose à l'intérieur de la classe elle-même) Pourriez-vous s'il vous plaît m'aider à comprendre ce que les problèmes pourraient être? Merci!Création d'un assistant pour mon application

class FbHelper 
{ 
    private $_fb; 
    private $_user; 

    function __construct() 
    { 
     // Initalize Facebook API with keys 

     $this->_fb = new Facebook(array(
      'appId' => 'xxxxxxxxxxx', 
      'secret' => 'xxxxxxxxxxxxxxxxxxxxxx', 
      'cookie' => true, 
     )); 

     // set the _user variable 
     // 
     $this->doLog("Called Constructor"); 
     // 
     $this->_user = $this->UserSessionAuthorized(); 

     return $this; 
    } 

    function doLog($text) 
    { 
     // open log file <----- THIS GETS CALLED TWICE EVERY TIME I INITIALIZE THE CLASS!! 
     $filename = "form_ipn.log"; 
     $fh = fopen($filename, "a") or die("Could not open log file."); 
     fwrite($fh, date("d-m-Y, H:i")." - $text\n") or die("Could not write file!"); 
     fclose($fh); 
    } 


    function getUser() { return $this->_user; } 

    function getLoginUrl() { return $this->_fb->getLoginUrl(); } 
    function getLogoutUrl() { return $this->_fb->getLogoutUrl(); } 

    function UserSessionAuthorized() 
    { 
     // Checks if user is authorized, if is sends back user object 

     $user = null; 

     $session = $this->_fb->getSession(); 
     if (!$session) return false; 
     try { 
      $uid = $this->_fb->getUser(); 
      $user = $this->_fb->api('/me'); 
      if ($user) return $user; 
      else return false; 
      } 
     catch (FacebookApiException $e) { return false; } 
    } 

    private function _rebuildSelectedFriends($selected_friends) 
    { 
     // Creates a new array with less data, more useful and less malicious 

     $new = array(); 
     foreach ($selected_friends as $friend) 
     { 
      $f = array('id' => $friend['id'], 'name' => $friend['name']); 
      $new[] = $f; 
     } 

     return $new; 
    } 

    function GetThreeRandomFriends() 
    { 
     $friends = $this->_fb->api('/me/friends'); 
     $n = rand(1, count($friends['data']) - 3); 

     $selected_friends = array_slice($friends['data'], $n, 3); 
     return $this->_rebuildSelectedFriends($selected_friends); 
    } 

    function UserExists($user_id) 
    { 
     try { $this->_fb->api('/' . $user_id . '/'); return true; } 
     catch (Exception $e) { return false; } 
    } 

} 

Répondre

1

Vous devez appellerez la classe FbHelper deux fois votre fonction doLog est dans le constructeur, par conséquent, la répétition est quelque part plus haut dans votre application et non dans cette classe elle-même.

+0

Oui .. Je pense à ça aussi. Y at-il un moyen que je peux tracer qui appelle FbHelper ?? Merci – PirosB3

+0

vous pouvez utiliser debug_print_backtrace() pour cela. – StasM

+0

Merci pour vos réponses! J'ai trouvé le problème .. utilisait Codeigniter et chargé la classe deux fois! Merci pour toute l'aide! – PirosB3

Questions connexes