मैंने सी 2 डीएम लागू किया है और यह ठीक काम करता है कि डिवाइस संदेश और सबकुछ प्राप्त करता है। हालांकि एक समस्या है जिसके लिए मुझे कोई समाधान नहीं मिल रहा है।एंड्रॉइड, 1000 डिवाइसों को तेजी से संदेश
जब कोई निश्चित घटना होती है तो मैं एक ही संदेश को कुछ हज़ार उपकरणों तक जल्दी से धक्का देना चाहता हूं, अधिमानतः एक मिनट के भीतर। मुझे पता है कि इस बात की कोई निश्चितता नहीं है कि संदेश कभी भी वितरित किया जाएगा और Google विभिन्न परिस्थितियों के कारण संदेश में देरी कर सकता है।
आईओएस के लिए मेरा कार्यान्वयन पाठ्यक्रम भेजने के अलावा ही है। इसमें 15000 संदेशों के लिए लगभग 5 सेकंड लगते हैं। एंड्रॉइड के लिए 5000 संदेशों के लिए इसमें एक घंटे लगते हैं जो लंबे समय तक चल रहा है।
क्या कोई इसे गति देने का तरीका जानता है? या क्या Google स्पैम को रोकने के लिए इस तरह के बड़े पैमाने पर धक्का रोकता है?
कोड का C2DM भाग नीचे है। यह PHP में है लेकिन मुझे अन्य प्रोग्रामिंग भाषाओं को पढ़ने में कोई समस्या नहीं है। मैं एक बार() को कनेक्ट करने के लिए एक स्क्रिप्ट का उपयोग करता हूं और फिर सभी टोकन लूप करता हूं और प्रत्येक संदेश भेजने के लिए sendMessage() का उपयोग करता हूं। सभी संदेशों को भेजने के बाद, यह डिस्कनेक्ट()।
<?php
class C2DMclient
{
private $authKey = NULL;
private $ch = NULL;
function connect() {
$post_params = array(
'Email' => 'C2DM_USER',
'Passwd' => 'C2DM_PWD',
'accountType' => 'HOSTED_OR_GOOGLE',
'source' => 'appname',
'service' => 'ac2dm',
);
$first = true;
$data_msg = '';
foreach($post_params as $key => $value) {
if($first)
$first = false;
else
$data_msg .= '&';
$data_msg .= urlencode($key).'='.urlencode($value);
}
$x = curl_init('C2DM_CLIENTLOGIN');
curl_setopt($x, CURLOPT_HEADER, true);
curl_setopt($x, CURLOPT_POST, true);
curl_setopt($x, CURLOPT_POSTFIELDS, $data_msg);
curl_setopt($x, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($x);
curl_close($x);
$pos = strpos($response, 'Auth=');
$this->authKey = trim(substr($response, 5 + $pos));
$this->ch = curl_init();
curl_setopt($this->ch, CURLOPT_URL, 'C2DM_SERVER');
}
function disconnect() {
curl_close($this->ch);
$this->authKey = NULL;
}
function sendMessage($deviceToken, $message) {
$data = array(
'registration_id' => $deviceToken,
'collapse_key' => 'ck_type',
'data.type' => 'TYPE',
'data.message' => $message,
'data.title' => 'Title'
);
$headers = array('Authorization: GoogleLogin auth='.$this->authKey);
if($headers)
curl_setopt($this->ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($this->ch, CURLOPT_POST, true);
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $data);
$messagedata = curl_exec($this->ch);
return TRUE;
}
}
?>
संपादित करें: नए समाधान curl_multi_exec पर आधारित है।
डेटाबेस क्वेरी परिणामों के माध्यम से लूपिंग करते समय कर्ल हैंडल एकत्र किए जाते हैं। कुछ सौ कर्ल हैंडल एकत्र किए जाने के बाद, उन सभी संदेशों को भेजने के लिए संदेश ($ chs) भेजे जाते हैं। फिलहाल मैं भेजने से पहले 700 संदेश एकत्र करता हूं और लगता है कि 5000 संदेश भेजने के लिए ~ 10s अच्छी डिलीवरी दर और पर्याप्त तेज़ है। एक उच्च संख्या वितरण दर को प्रभावित करने लगती है।
<?php
class C2DMclient
{
private $authKey = NULL;
private $ch = NULL;
function connect() {
$post_params = array(
'Email' => 'C2DM_USER',
'Passwd' => 'C2DM_PWD',
'accountType' => 'HOSTED_OR_GOOGLE',
'source' => 'appname',
'service' => 'ac2dm',
);
$first = true;
$data_msg = '';
foreach($post_params as $key => $value) {
if($first)
$first = false;
else
$data_msg .= '&';
$data_msg .= urlencode($key).'='.urlencode($value);
}
$x = curl_init('C2DM_CLIENTLOGIN');
curl_setopt($x, CURLOPT_HEADER, true);
curl_setopt($x, CURLOPT_POST, true);
curl_setopt($x, CURLOPT_POSTFIELDS, $data_msg);
curl_setopt($x, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($x);
curl_close($x);
$pos = strpos($response, 'Auth=');
$this->authKey = trim(substr($response, 5 + $pos));
}
function getMessageCurlHandle($deviceToken, $message) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'C2DM_SERVER');
$data = array(
'registration_id' => $deviceToken,
'collapse_key' => 'ck_type',
'data.type' => 'TYPE',
'data.message' => $message,
'data.title' => 'Title'
);
$headers = array('Authorization: GoogleLogin auth='.$this->authKey);
if($headers)
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
return $ch;
}
function sendMessages($chs) {
$mh = curl_multi_init();
foreach($chs as $ch) {
curl_multi_add_handle($mh, $ch);
}
$active = null;
do {
$mrc = curl_multi_exec($mh, $active);
} while($mrc == CURLM_CALL_MULTI_PERFORM);
while($active && $mrc == CURLM_OK) {
if(curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
curl_multi_close($mh);
}
}
?>
मैं जानता हूँ कि C2DM बैच भेजने का समर्थन नहीं करता है कि और वजह मैं प्रत्येक संदेश के लिए एक पोस्ट बनाते हैं। किसी कारण से इस प्रक्रिया में वास्तव में लंबा समय लगता है। मैं curl_multi_exec पर एक नज़र डालेगा। शायद यह खुद को कर्ल है जो अधिक समय लेता है। अगर मैं कुछ दिलचस्प लगता हूं तो मैं थोड़ा और समय वापस कर दूंगा। – Daniel
curl_multi_exec समाधान प्रतीत होता था। कुछ दिनों के लिए परीक्षण करने के बाद 5000 संदेश भेजने का समय एक घंटे से सेकंड के मामले में चला गया। हालांकि अगर संदेश कभी संदेश प्राप्त होता है तो यह काफी यादृच्छिक है। कुछ रास्ते पर खोने लगते हैं। मुझे लगता है कि 2000 संदेश एक बार में हैं और मैं इष्टतम प्रदर्शन बनाम गति के लिए इसे ट्विक करने की कोशिश करूंगा। जब मुझे समय मिलता है तो मैं मूल पोस्ट अपडेट करूंगा। – Daniel