如何在PHP中跨域使用像素追踪

6
我理解像素追踪的基础知识,我能够插入一个与我的追踪域名相关联的像素图片到其他网站上。
然而,我如何增加在我的追踪域名上实际像素计数?是否有某种日志记录每次像素图片被提供的情况?我能否执行类似以下操作:
<img src="http://www.foo.com/serveImage/getImage.php?id=5123" />

那么我们是否可以创建一个 getImage 页面,提供图像,并根据传入的 ID 进行递增?或者有更好的方法来实现这一点吗?

预先感谢您的帮助。

4个回答

13

如果你只想输出一个 GIF 动画,这是一种快速简单的方法。只需确保你的脚本在之前或之后没有输出其他内容即可:

header("Content-type: image/gif");
header("Content-length: 43");
$fp = fopen("php://output","wb");
fwrite($fp,"GIF89a\x01\x00\x01\x00\x80\x00\x00\xFF\xFF",15);
fwrite($fp,"\xFF\x00\x00\x00\x21\xF9\x04\x01\x00\x00\x00\x00",12);
fwrite($fp,"\x2C\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02",12);
fwrite($fp,"\x44\x01\x00\x3B",4);
fclose($fp);

这将直接将图像输出到缓冲区,而无需先加载文件。这样更快速。 - Andy N

3
这是我的跟踪代码:

此为跟踪代码:

<?php

$id = $_GET['site_id'];

// do track

$imageFile = 'images/pixel.jpg';
$im = imagecreatefromjpeg($imageFile);
header('Content-type: image/jpeg');
imagejpeg($im);


?>

5
如果你想减少资源使用,请勿使用GD来读取图像文件,然后再将其呈现出来。只需发送内容标头,然后使用 readfile() 函数即可。 - gnud
@gnud 你是正确的... 现在更明智的做法是使用301 HTTP头将重定向到图像... - Gabriel Sosa

3

是的,你的想法是正确的。

你需要给每个网站或页面分配一个唯一的ID,然后在图像src中传递该ID。因此,在你的例子中,ID为5123。

在你的getImage.php脚本中,使用这个ID来增加数据库(或者你如何记录数据),并返回任何你想要的图像。如果你想要返回的图像显示点击次数,你可以使用GD扩展动态地创建一张图片——请参考PHP手册获取更多信息。


1

有点离题的答案,但是评论太长了:

根据你的实现方式,你不一定需要增加任何东西。如果你的目标是让它超级快,只依赖服务器请求日志就足够了。每个请求 "getImage.php?q=5123" 的记录已经存在,你只需要从查询字符串中提取相关信息即可。

稍后你可以通过 cron 等工具将日志解析成一个漂亮的可查询数据库,这样不会影响跟踪错误的服务。一次性完成所有操作更加优雅,但如果你处理大量请求,那么日志已经存在了。

额外收获:服务器日志还包含引荐者和时间戳,因此您可以更轻松地查看是否有人直接攻击 getImage.php 或从其他地方链接到它以操纵数字,如果这些数字很重要的话。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接