2012-06-29 17 views
6

मैं "बीकन" छवि का उपयोग करके वर्षों से ईमेल ट्रैक कर रहा हूं और उन ग्राहकों के लिए जो छवियों को डाउनलोड करने की अनुमति देते हैं, यह ट्रैक करने के लिए बहुत अच्छा काम किया है कि कितने लोगों ने ईमेल खोला है।PHP के साथ ईमेल ओपन लम्बाई ट्रैकिंग

मैं "DidTheyReadIt" सेवा में आया, जो दिखाता है कि क्लाइंट वास्तव में ईमेल कितनी देर तक पढ़ता है, मैंने इसे अपनी मुफ्त सेवा के साथ परीक्षण किया और यह वास्तव में ईमेल खोलने के समय के करीब है।

मैं इस बारे में बहुत उत्सुक हूं कि वे इसे ट्रैक करने की क्षमता कैसे प्राप्त करते हैं, मुझे यकीन है कि जो भी समाधान चुना जाता है, वह सर्वर/डेटाबेस पर बहुत अधिक भार डाल देगा और कई समुदाय "रोकें, नहीं और न करें "लेकिन मैं इसकी जांच करना चाहता हूं और इसे आज़माएं, भले ही मेरे लिए सर्वर पर परीक्षण चलाने के लिए पर्याप्त है और" नरक नहीं "कहें।

मैं कुछ googling किया था और इस लेख एक बुनियादी समाधान http://www.re-cycledair.com/tracking-email-open-time-with-php

मैं बीकन छवि पृष्ठ के भीतर नींद() का उपयोग कर एक परीक्षण किया जाता है जो पाया:

<?php 

set_time_limit(300); //1000 seconds 
ignore_user_abort(false); 

$hostname_api = "*"; 
$database_api = "*"; 
$username_api = "*"; 
$password_api = "*"; 

$api = mysql_pconnect($hostname_api, $username_api, $password_api) or  trigger_error(mysql_error(),E_USER_ERROR); 
mysql_select_db($database_api, $api); 

$fileName = "logo.png"; 

$InsertSQL = "INSERT INTO tracker (FileName,Time_Start,Time_End) VALUES ('$fileName',Now(),Now()+1)"; 
mysql_select_db($database_api, $api); 
$Result1 = mysql_query($InsertSQL, $api) or die(mysql_error()); 
$TRID = mysql_insert_id(); 

//Open the file, and send to user. 

$fp = fopen($fileName, "r"); 
header("Content-type: image/png"); 
header('Content-Length: ' . filesize($fileName)); 
readfile($fileName); 

set_time_limit(60); 
$start = time(); 

for ($i = 0; $i < 59; ++$i) { 

// Update Read Time 

$UpdateSQL = "UPDATE tracker SET Time_End = Now() WHERE TRID = '$TRID'"; 
mysql_select_db($database_api, $api); 
$Result1 = mysql_query($UpdateSQL, $api) or die(mysql_error()); 

time_sleep_until($start + $i + 1); 
} 

?> 

ऊपर कोड के साथ समस्या (डेटाबेस को हर सेकेंड अपडेट करने के अलावा) यह है कि जब स्क्रिप्ट चलती है तो यह तब भी चलती रहती है जब उपयोगकर्ता डिस्कनेक्ट हो (या इस मामले में किसी अन्य ईमेल पर जाता है)।

मैंने "ignore_user_abort (false);" जोड़ा, हालांकि मेल क्लाइंट के साथ कोई कनेक्शन नहीं है और हेडर पहले ही लिखे गए हैं, मुझे नहीं लगता कि "ignore_user_abort (false);" आग कर सकते हैं

मैं पद Track mass email campaigns और नीचे से ऊपर की एक को देखा "Haragashi" कहते हैं:

"आप बस एक ट्रैकिंग हैंडलर जो बाइट से नज़र रखने वाली छवि बाइट रिटर्न निर्माण कर सकते हैं के बाद हर बाइट प्रतिक्रिया फ्लश। और समय की अवधि के लिए सोने के।

आप का सामना करते हैं एक धारा अपवाद ग्राहक ई-मेल (नष्ट या किसी अन्य ई-मेल कौन जानता है के लिए बदल) बंद कर दिया है बंद कर दिया।

अपवाद के समय आप जानते हैं कि ग्राहक कितने समय तक ई-मेल पढ़ता है। "

क्या कोई जानता है कि मैं इस तरह "केवल एक ट्रैकिंग हैंडलर कैसे बना सकता हूं" या एक समाधान के बारे में जानता हूं जिसे मैं अपने कोड में कार्यान्वित कर सकता हूं जो उपयोगकर्ता डिस्कनेक्ट होने पर कोड को रोकने के लिए मजबूर करेगा?

उत्तर

1

मुझे लगता है कि समस्या यह है कि आप नहीं कर रहे हैं एक हैडर इतनी बार हर अनुप्रेषित है। इसका कारण यह आवश्यक है क्योंकि एक बार जब स्क्रिप्ट PHP + अपाचे में निष्पादित हो जाती है, तो यह मूल रूप से समाप्त होने तक ग्राहक को अवहेलना करता है। यदि आप प्रत्येक एक्स सेकंड को रीडायरेक्ट करने के लिए मजबूर करते हैं, तो क्लाइंट अभी भी कनेक्ट होने पर सर्वर फिर से मूल्यांकन करता है। यदि ग्राहक कनेक्ट नहीं है, तो यह रीडायरेक्ट को मजबूर नहीं कर सकता है, और इसलिए समय को ट्रैक करना बंद कर देता है।

जब मैं इस चीज के साथ चारों ओर खेला, मेरे कोड देखा की तरह:

header("Content-type: image/gif"); 
while(!feof($fp)) { 
    sleep(2); 
    if(isset($_GET['clientID'])) { 
     $redirect = $_SERVER['REQUEST_URI']; 
    } else { 
     $redirect = $_SERVER['REQUEST_URI'] . "&clientID=" . $clientID; 
    } 
    header("Location: $redirect"); 
    exit; 
} 

तो ग्राहक आईडी स्थापित किया गया था, तो कोड के इस ब्लॉक ऊपर मैं इस प्रयास डेटाबेस में बीकन पढ़ने पर लॉग इन करेगा।हर बार जब सर्वर ने रीडायरेक्ट को मजबूर किया तो ईमेल कॉलम पर समय 2 सेकंड तक बढ़ाना आसान था।

+0

ग्राहक रीडायरेक्ट का पालन नहीं करते हैं, इसलिए यह व्यावहारिक रूप से समझ में आने वाली किसी चीज से सैद्धांतिक उत्तर है। यह भी ओपी उद्धृत नहीं है। – hakre

0

आप कुछ इस तरह कुछ कर नहीं चाहेंगे:

<?php 
// Time the request 
$time = time(); 

// Ignore user aborts and allow the script 
// to run forever 
ignore_user_abort(true); 
set_time_limit(0); 

// Run a pointless loop that sometime 
// hopefully will make us click away from 
// page or click the "Stop" button. 
while(1) 
{ 
    // Did the connection fail? 
    if(connection_status() != CONNECTION_NORMAL) 
    { 
     break; 
    } 

    // Sleep for 1 seconds 
    sleep(1); 
} 

// Connention is now terminated, so insert the amount of seconds since start 
$duration = time() - $time; 
+0

उपरोक्त कोड पोस्ट करने के लिए धन्यवाद। मैंने कोशिश की और जब मैं ब्राउज़र पर स्टॉप पर क्लिक करता हूं तो जब मैं इसे $ अवधि = $ time() - $ time के बाद डालता हूं तो सम्मिलित नहीं होता है; मैंने नींद के बाद डीबी डालने की कोशिश की (1); और यह हर सेकेंड को अपडेट करेगा लेकिन अगर मैं पेज को रोकता हूं तो स्क्रिप्ट चलती रहती है। – jdublu

+0

उपयोगकर्ता को अनदेखा करें गलत पर सेट किया गया है जो समझ में आता है कि यह टाइमआउट तक नहीं रुक जाएगा जो सेट भी नहीं है। –

+1

हर बार एक बाइट भी भेजता है, अन्यथा PHP बंद नहीं होगा अगर कनेक्शन बंद हो गया है। कुछ यातायात बनाएँ। – hakre

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