用PHP实现电子邮件开放长度跟踪

用PHP实现电子邮件开放长度跟踪,php,Php,多年来,我一直使用“信标”图像跟踪电子邮件,对于那些允许下载图像的客户来说,跟踪有多少人打开了电子邮件非常有效 我遇到了“DidTheyReadIt”服务,它显示了客户实际阅读电子邮件的时间,我用他们的免费服务进行了测试,它实际上与我打开电子邮件的时间非常接近 我很好奇他们是如何实现跟踪的能力的,我确信无论选择什么解决方案,它都会给服务器/数据库带来很大的负载,社区中的许多人都会回答“停止、不和不”,但我确实想调查这一点并尝试一下,即使我只需要在服务器上运行一个测试并说“他妈的不” 我在谷歌上搜

多年来,我一直使用“信标”图像跟踪电子邮件,对于那些允许下载图像的客户来说,跟踪有多少人打开了电子邮件非常有效

我遇到了“DidTheyReadIt”服务,它显示了客户实际阅读电子邮件的时间,我用他们的免费服务进行了测试,它实际上与我打开电子邮件的时间非常接近

我很好奇他们是如何实现跟踪的能力的,我确信无论选择什么解决方案,它都会给服务器/数据库带来很大的负载,社区中的许多人都会回答“停止、不和不”,但我确实想调查这一点并尝试一下,即使我只需要在服务器上运行一个测试并说“他妈的不”

我在谷歌上搜索了一下,发现这篇文章有一个基本的解决方案

我在beacon图像页面中使用sleep()进行了测试:

<?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);
}

?>

您不想做更像这样的事情吗:

<?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;

我认为问题在于您没有经常执行头重定向。之所以有必要这样做,是因为一旦脚本在PHP+Apache中开始执行,它基本上会忽略客户端直到完成。如果您每X秒强制一次重定向,它会使服务器重新评估客户端是否仍然连接。如果nt未连接,无法强制重定向,因此停止跟踪时间

当我玩这些东西时,我的代码看起来像:

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;
}

如果设置了客户端id,则在这段代码上方,我将记录此读取数据库中信标的尝试。每次服务器强制重定向时,只需将电子邮件列上的时间增加2秒即可。

感谢您发布上述代码。我尝试过,当我在浏览器上单击“停止”时,插入不会占用时间当我把它放在$duration=$time()-$time之后时,我尝试将db插入放在睡眠之后(1);它将每秒更新一次,但如果我停止页面,脚本将继续运行。“忽略用户中止”设置为false,这很有意义,它在超时之前不会停止,超时也没有设置。同时每次发送一个字节,否则PHP不会注意到连接是否关闭。创建一些流量。@hakre您能给我一些关于如何发送字节e的详细信息吗每次?,我都用重定向测试了上面的解决方案,在20次重定向或20秒后,firefox和chrome bomb都会关闭连接,因为重定向的数量超过了。我认为在php脚本中运行循环,然后一次发送几个字节的图像可能是跟踪电子邮件打开的最佳解决方案r大量的谷歌搜索我找不到如何做到这一点。@jdublu:嗯,我发现你所做的在道德上是有问题的,所以我不想在这里进一步。请尊重隐私。客户不太关注重定向,所以这是一个理论上的答案,而不是实际意义上的答案。这也不是OP所引用的。