为什么这个PHP跟踪像素无法正常工作?

时间:2011-07-01 18:05:25

标签: php gif

我正在使用PHP设置一个简单的像素跟踪脚本,以下技术上有效,但是当我在Safari中查看检查器时,我得到以下警告(1by1.gif是42B gif):

  

esource解释为文档但是   使用MIME类型image / gif进行传输。

header("Content-type: image/gif");
header("Content-Length: 42");
echo file_get_contents("/path/to/1by1.gif");
// do tracking stuff below here

我查看了其他跟踪像素,它们都在检查器中显示,就好像它们是实际图像一样,即使扩展名为.php也是如此。任何想法如何解决这个警告?

修改

我尝试了以下操作,并收到同样的警告:

header("Content-type: image/gif");
$img = imagecreatefromstring(file_get_contents("/path/to/1by1.gif"));
imagegif($img);

4 个答案:

答案 0 :(得分:1)

您可以在HTML源代码中编写1x1.gif(或其他一些名称),然后让Apache实际提供PHP脚本。您可以使用.htaccess执行此操作,其中包含以下内容:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^1x1\.gif$ tracking_script.php [NC,L]

这样,Safari就会看到gif扩展名,不会抱怨。

答案 1 :(得分:0)

我很困惑。函数file_get_contents()用于从文本文件中获取内容。你打算在这里打算什么?该函数将内容返回为字符串或false。你的echo语句实际上传递的结果是正确解释为文档而不是gif。

更新:我花了一些时间来重现这个并看到警告。回显file_get_contents()确实在浏览器中显示了gif,简单的include()也显示了警告。这个警告会给你带来麻烦吗?或者这只是为了一场选美比赛?我只能推测Safari的Inspector有点挑剔。 Chrome中的相同工具不会显示警告。

答案 2 :(得分:0)

这很有趣。如果我删除内容长度并只使用以下内容,它似乎完美地工作。任何人都知道为什么会这样吗?

header("Content-type: image/gif");
echo file_get_contents("/path/to/1by1.gif");
// do tracking stuff below here

答案 3 :(得分:0)

$img = imagecreatefromstring(file_get_contents("/path/to/1by1.gif"));
imagegif($img);

此代码

  1. 读入GIF图片
  2. 将图像字节传递给GD
  3. 要求GD 撰写新图片
  4. 这里可能出现很多问题。例如,将图像写回可能不会产生相同的精确字节流,可能更多,也许更少。这可能会使您的Content-Length标头无效,并且当您对此类内容撒谎时,浏览器不会喜欢它。或者也许在其中一行中有一个通知或警告,它将作为GIF数据之前的内容发出。这肯定看起来像<文档“而不是Webkit的图像数据。

    通过file_get_contents / include / echo投放文件消除了通过GD过滤的步骤。如果代码在没有该步骤的情况下正常工作,那么错误就在那里。