2012-04-02 7 views
1

Ich baue einen iPhone-Push-Server und versuche, den Push zur Arbeit zu bringen. Ich habe eine message.php Datei, die neue Nachricht in die Datenbank einfügt und die Nachricht dann zu einer push_queue Tabelle in der Datenbank hinzufügt.Eine andere PHP-Datei aufrufen

Um den Push zu senden, muss ich manuell zum Browser gehen und die Push-Datei (../push/push.php) aufrufen, die den Push aussendet.

Kann ich die Datei push.php aus der Datei message.php automatisch aufrufen?

Ich versuchte require_one, include, exec und file_get_contents ohne Erfolg.

Es funktioniert, wenn ich benutze:

header('Location: ../push/push.php'); 

jedoch die push.php Datei dauert ein paar Sekunden ausführen und beenden, so gibt es eine Verzögerung für den Benutzer beim Versuch, eine Nachricht zu senden.

Ich denke, ich könnte einen Cron-Job verwenden, um die push.php-Datei aufzurufen, aber ich würde es lieber nicht.

Hier ist die Kernfunktion in push.php (basierend auf http://www.raywenderlich.com/3525/apple-push-notification-services-tutorial-part-2):

function start() 
{ 
    //writeToLog('Connecting to ' . $this->server); 

    if (!$this->connectToAPNS()) 
     exit; 


    while (true) 
    { 
     // Do at most 20 messages at a time. Note: we send each message in 
     // a separate packet to APNS. It would be more efficient if we 
     // combined several messages into one packet, but this script isn't 
     // smart enough to do that. ;-) 

     $stmt = $this->pdo->prepare('SELECT * FROM push_queue WHERE time_sent IS NULL LIMIT 20'); 
     $stmt->execute(); 
     $messages = $stmt->fetchAll(PDO::FETCH_OBJ); 

     $deletedIds = array(); 

     foreach ($messages as $message) 
     { 
      if ($this->sendNotification($message->message_id, $message->device_token, $message->payload)) 
      { 
       //$stmt = $this->pdo->prepare('UPDATE push_queue SET time_sent = NOW() WHERE message_id = ?'); 
       //$stmt->execute(array($message->message_id)); 

       $deletedIds[] = $message->message_id; 

       //$stmt = $this->pdo->prepare('DELETE FROM push_queue WHERE message_id = ?'); 
       //$stmt->execute(array($message->message_id)); 

      } 
      else // failed to deliver 
      { 
       $this->reconnectToAPNS(); 
      } 
     } 

     //Delete the chunk of messages. 
     $this->pdo->query('DELETE FROM push_queue WHERE message_id IN ('.implode(',', $deletedIds).')'); 

     unset($messages);   
    } 
} 
+0

Wie funktioniert Ihr Push? Ist es Comet oder ruft Ihre iPhone App den Server alle x Sekunden an, um nach neuen Nachrichten zu fragen? –

+0

Danke für die Antwort .. Die App ruft den Server alle x Sekunden abzufragen. – BlackMouse

+1

Ok, also was push.php? Ein Codebeispiel wird besser sein. –

Antwort

0

eine Funktion oder Klasse erstellen, die alles tut, dass Ihr push.php tut und es nennen, wenn eine neue Nachricht empfangen wird oder wenn die iPhone App nach neuen Nachrichten fragt. In diesem Fall müssen Sie kein anderes PHP in message.php aufrufen.

Dies ist ein Konzept von MVC, d. H. Sie haben Ihre Geschäftslogik von Ihren Controllern getrennt. In diesem Fall ist Push eine Businesslogik und Message.php und Push.php sind Ihre Controller.

Verwandte Themen