PHP

2015-02-18 2 views
8

के साथ ऐप्पल पुश अधिसूचना सेवा के लिए डिवाइस टोकन को प्रोसेस करने के लिए विधि इस साइट पर PHP में ऐप्पल पुश अधिसूचना सेवा से अतुल्यकालिक रूप से लौटाई गई त्रुटियों को संभालने के तरीके के बारे में बहुत सारी जानकारी है। मैं PHP में एक विधि के साथ आया जो बहुत अच्छी तरह से काम करता प्रतीत होता है, लेकिन मुझे कुछ प्रतिक्रिया चाहिए।PHP

  1. fflush() सही का उपयोग है? मैंने इसे कुछ उदाहरणों में देखा है लेकिन सभी नहीं।
  2. मैं इसे जानबूझकर खराब डिवाइस टोकन के लिए त्रुटि देने के लिए नहीं मिल सकता। क्यूं कर?
  3. क्या यह समाधान हजारों उपकरणों के लिए स्केलेबल है (मान लें कि PHP अधिकतम मेमोरी पर्याप्त रूप से बढ़ी है)?
  4. अन्य मुद्दे?

नोट्स:
- अधिसूचना के लिए डिवाइस टोकन शुरू में एक सरणी में संग्रहीत हैं।
- यह असीमित नहीं है लेकिन यह प्रत्येक अधिसूचना भेजने के बाद (पिछली) त्रुटियों की जांच करता है और अंतिम अधिसूचना के बाद एक और बार पूर्ण सेकंड की जांच करता है।
- यह मूल या विस्तारित प्रारूपों के विपरीत नए "आधुनिक" अधिसूचना प्रारूप का उपयोग करता है।
- यह टोकन सरणी के सूचकांक को एपीएनएस के पहचानकर्ता के रूप में भेजता है।
- यह एक चेकएपलेरररस्पॉन्स() फ़ंक्शन का उपयोग करता है जो पहले 6 बाइट्स को पढ़ता है और या तो गलत या पहचानकर्ता (अनुक्रमणिका) देता है जो विफल रहता है ताकि यह बैक अप और अगले टोकन के साथ जारी रख सके। (विफलता के बाद भेजे गए सभी टोकन अमान्य हैं।)

$ctx = stream_context_create(); 
stream_context_set_option($ctx, 'ssl', 'passphrase', $iosCertPassphrase); 
stream_context_set_option($ctx, "ssl", "local_cert", $iosCertKey); 
$fp = NULL; 
$errno = NULL; 
$errstr = NULL; 

// same payload for all 
$item2 = chr(2) . pack("n", strlen($payload)) . $payload; // payload item has id 2, a 2-byte length ("n") containing length of payload, then payload 

$errorID = -1; 

while ($errorID !== false) { 
    $fp = stream_socket_client($iosHost . ':' . $iosPort, $errno, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);   

    if ($fp === FALSE) { 
     echo('Failed to create socket'); 
     break; 
    } 

    stream_set_blocking($fp, 0); 

    for ($id = $errorID + 1 ; $id < sizeof($iosTokens); $id++) { 
     $errorID = false; 
     $item1 = chr(1) . pack('n', 32) . pack("H*", $iosTokens[$id]['device_token']); // device token item has 1-byte id 1, 2-byte length ("n") containing 32, then 32-byte device token 

     $item3 = chr(3) . pack('n', 4) . pack('N', $id); // notification identifier has 1-byte id 3, 2-byte length ("n") containing 4, then 4-byte identifier 

     $frame = $item1 . $item2 . $item3; 

     $msg = chr(2) . pack("N", strlen($frame)) . $frame; // for "modern" push notification format, msg has 1-byte id 2, 4-byte length ("N") containing the length of the frame, then frame 

     fwrite($fp, $msg); 

     $errorID = checkAppleErrorResponse($fp); 
     fflush($fp); 

     if ($errorID !== false) // if there's an error, stop now 
      break; 
    } 

    // if done with for loop and no errors, pause for a sec and check one last time 
    if ($errorID === false) { 
     $read = array($fp); 
     $null = null; 
     $changedStreams = stream_select($read, $null, $null, 0, 1000000); 

     //check if it is actually false 
     if ($changedStreams === false) 
      {  
      //close stream when done. 
      socket_close($fp); 
      fclose($fp); 
      } 
     elseif ($changedStreams > 0) 
      { 
      // set the error and redo starting after errorID index 
      $errorID = checkAppleErrorResponse($fp); 
      } 
     } 
    } 
} 
+0

ध्यान दें, अपने वास्तविक प्रश्न से संबंधित नहीं: यदि आप अपने डैश में से प्रत्येक के सामने एक अंतरिक्ष डालकर बुलेट बिंदुओं बना सकते हैं। यह थोड़ा सा दिखने वाला हो सकता है। –

+0

जब मैंने कोशिश की, तो कोड के पहले दर्जन लाइनों को कोड के रूप में पहचाना नहीं जाएगा, इसलिए मैंने डैश में छोड़ा ... – ScottyB

+0

... हू। अजीब है कि। शायद क्योंकि मार्कडाउन सोचता है कि आप बुलेट पॉइंट्स के हिस्से के रूप में कोड जोड़ना चाहते हैं। वैसे भी यह वास्तव में एक बड़ा सौदा नहीं है। बस सोचा कि मैं इसे इंगित करूंगा। –

उत्तर

0

उम्मीद से संबंधित। मैंने इसका इस्तेमाल किया यह मूल लेकिन ठोस सोना है। थोड़ा छिड़काव या सुरक्षा और कुछ और गहन त्रुटि प्रबंधन के साथ, यह बहुत पहले नहीं था कि मैं इसे एक ऐसे सिस्टम में उन्नत कर दूं जो मुझे आवश्यक सब कुछ संभाल सके।

http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app

+0

यह लिंक आईओएस ऐप के लिए एक PHP वेब सेवा लिखने का उदाहरण है, आईओएस पुश नोटिफिकेशन कैसे करें। आईओएस पुश नोटिफिकेशन के लिए उस साइट पर एक और ट्यूटोरियल है, लेकिन यह थोड़ा पुराना है और बहुत स्केलेबल नहीं है। – ScottyB

संबंधित मुद्दे