Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP返回1x1透明GIF,这个数据是如何编码的?_Php_Image_Header_Http Headers - Fatal编程技术网

PHP返回1x1透明GIF,这个数据是如何编码的?

PHP返回1x1透明GIF,这个数据是如何编码的?,php,image,header,http-headers,Php,Image,Header,Http Headers,我见过这个 代码如下所示: header( 'Content-type: image/gif' ); # The transparent, beacon image echo chr(71).chr(73).chr(70).chr(56).chr(57).chr(97). chr(1).chr(0).chr(1).chr(0).chr(128).chr(0). chr(0).chr(0).chr(0).chr(0).chr(0).chr(0).chr(0). chr

我见过这个

代码如下所示:

header( 'Content-type: image/gif' );
# The transparent, beacon image
echo chr(71).chr(73).chr(70).chr(56).chr(57).chr(97).
     chr(1).chr(0).chr(1).chr(0).chr(128).chr(0).
     chr(0).chr(0).chr(0).chr(0).chr(0).chr(0).chr(0).
     chr(33).chr(249).chr(4).chr(1).chr(0).chr(0).
     chr(0).chr(0).chr(44).chr(0).chr(0).chr(0).chr(0).
     chr(1).chr(0).chr(1).chr(0).chr(0).chr(2).chr(2).
     chr(68).chr(1).chr(0).chr(59);
<?php
$fh = fopen('file.gif', 'r');
$i = 0;
echo 'echo ';
while(!feof($fh)) {
  $byte = fread($fh, 1);
  $num = ord($byte);
  echo 'chr(', $num, ')';
  if(!feof($fh)) {
    echo '.'; //there's more bytes, echo dot                                    
    if(++$i % 6 == 0) {
      echo "\n     "; //do not be too wide                                      
    }
  }
}
echo ";\n";
fclose($fh);
?>
这使得PHP很容易返回一个透明的GIF图像。但是,如果我想更改图像,我该如何做?如何将我创建的任何GIF转换为这种格式


谢谢。

比这更好的是,在设置cookie或添加日志条目后,您可以将调用重定向到实际图像(可以是gif/jpeg/etc),让Web服务器担心发送内容等:

header("Location: http://webserver.com/images/beacon.gif");

比这样做更好的是,在设置cookie或添加日志条目后,您可以将调用重定向到实际图像(可以是gif/jpeg/etc),让Web服务器担心发送内容等:

header("Location: http://webserver.com/images/beacon.gif");

为什么不把图像放在一个文件中,让PHP读取并返回它呢

header('Content-type: image/gif');
readfile('file.gif');
如果确实要将图像转换为PHP代码,请一次读取一个字节,然后创建如下PHP代码:

header( 'Content-type: image/gif' );
# The transparent, beacon image
echo chr(71).chr(73).chr(70).chr(56).chr(57).chr(97).
     chr(1).chr(0).chr(1).chr(0).chr(128).chr(0).
     chr(0).chr(0).chr(0).chr(0).chr(0).chr(0).chr(0).
     chr(33).chr(249).chr(4).chr(1).chr(0).chr(0).
     chr(0).chr(0).chr(44).chr(0).chr(0).chr(0).chr(0).
     chr(1).chr(0).chr(1).chr(0).chr(0).chr(2).chr(2).
     chr(68).chr(1).chr(0).chr(59);
<?php
$fh = fopen('file.gif', 'r');
$i = 0;
echo 'echo ';
while(!feof($fh)) {
  $byte = fread($fh, 1);
  $num = ord($byte);
  echo 'chr(', $num, ')';
  if(!feof($fh)) {
    echo '.'; //there's more bytes, echo dot                                    
    if(++$i % 6 == 0) {
      echo "\n     "; //do not be too wide                                      
    }
  }
}
echo ";\n";
fclose($fh);
?>

为什么不将图像保存在一个文件中,让PHP读取并返回它呢

header('Content-type: image/gif');
readfile('file.gif');
如果确实要将图像转换为PHP代码,请一次读取一个字节,然后创建如下PHP代码:

header( 'Content-type: image/gif' );
# The transparent, beacon image
echo chr(71).chr(73).chr(70).chr(56).chr(57).chr(97).
     chr(1).chr(0).chr(1).chr(0).chr(128).chr(0).
     chr(0).chr(0).chr(0).chr(0).chr(0).chr(0).chr(0).
     chr(33).chr(249).chr(4).chr(1).chr(0).chr(0).
     chr(0).chr(0).chr(44).chr(0).chr(0).chr(0).chr(0).
     chr(1).chr(0).chr(1).chr(0).chr(0).chr(2).chr(2).
     chr(68).chr(1).chr(0).chr(59);
<?php
$fh = fopen('file.gif', 'r');
$i = 0;
echo 'echo ';
while(!feof($fh)) {
  $byte = fread($fh, 1);
  $num = ord($byte);
  echo 'chr(', $num, ')';
  if(!feof($fh)) {
    echo '.'; //there's more bytes, echo dot                                    
    if(++$i % 6 == 0) {
      echo "\n     "; //do not be too wide                                      
    }
  }
}
echo ";\n";
fclose($fh);
?>


在任何十六进制查看器中打开gif并将其字节复制到字节在任何十六进制查看器中打开gif并将其字节复制到字节。如果像素用于分页计数,请添加更多缓存控制头。同意——尽管他的问题似乎不是关于如何返回图像,而是关于如何返回图像。这会发出额外的完整HTTP请求以获取文件,这将占用网络和web服务器资源。如果由于浏览器对同步TCP连接的限制,有很多其他资源(如JS和样式表)无法获取,那就更糟糕了。在这种情况下,这些资源将不得不在网络上等待额外的往返时间。但是,它会将实际像素内容的缓存卸载到Web服务器上!因此,如果您在实际的像素调用中设置了正确的头,这样就不会缓存,那么您可以允许映像调用本身允许缓存字节——在这种情况下,实际上只会执行一个HTTP头。如果您在映像文件上设置expire头,那么这个解决方案可能是最好的(因此它将在将来过期)。另一种方法是使用我的解决方案,如果修改了,还可以读取web浏览器发送的标题(在这种情况下,我们的两个解决方案将产生相同的结果,并具有相似的性能)。如果像素用于页面计数,则需要堆更多的缓存控制头。同意——尽管他的问题似乎不是关于如何返回图像,而是关于如何返回图像。这会发出额外的完整HTTP请求以获取文件,这会占用网络和web服务器资源。如果由于浏览器对同步TCP连接的限制,有很多其他资源(如JS和样式表)无法获取,那就更糟糕了。在这种情况下,这些资源将不得不在网络上等待额外的往返时间。但是,它会将实际像素内容的缓存卸载到Web服务器上!因此,如果您在实际的像素调用中设置了正确的头,这样就不会缓存,那么您可以允许映像调用本身允许缓存字节——在这种情况下,实际上只会执行一个HTTP头。如果您在映像文件上设置expire头,那么这个解决方案可能是最好的(因此它将在将来过期)。另一种方法是使用我的解决方案,如果修改了,也可以读取web浏览器发送的标题(在这种情况下,我们的两个解决方案将产生相同的结果,并具有相似的性能)。如果您要走这条路,那么在每次请求时读取文件肯定不是最佳选择(想想所涉及的磁盘访问!)。我建议在第一次请求时读取此图像,并将其缓存在内存中以供后续请求使用,这样您就不必每次都访问磁盘。4、文件将由操作系统内核缓存在RAM中。没有必要重新设计缓存。实际上,使用readfile运行我的第一个解决方案可能比创建一个包含大量chr()调用(上下文切换!)的文件要快。虽然这是事实,但您高估了操作系统文件缓存。事实是fopen()将仍然执行,内核将准备文件的所有内部结构,以便仍然可以访问磁盘。只有在fread点,操作系统缓存才会启动并从内存返回数据。fclose再次需要磁盘访问(上次访问的时间戳!)您可能是正确的,但我不明白为什么这与您的解决方案有任何不同。此外,所有sane系统管理员都会禁用atime。如果您打算这样做,那么每次请求时读取文件肯定不是最佳选择(想想涉及的磁盘访问!)。我建议在第一次请求时读取此图像,并将其缓存在内存中以供后续请求使用,这样您就不必每次都访问磁盘。4、文件将由操作系统内核缓存在RAM中。没有必要重新设计缓存。实际上,使用readfile运行我的第一个解决方案可能比创建一个包含大量chr()调用(上下文切换!)的文件要快。虽然这是事实,但您高估了操作系统文件缓存。事实是fopen()将仍然执行,内核将准备文件的所有内部结构,以便仍然可以访问磁盘。只有在fread点,操作系统缓存才会启动并从内存返回数据。fclose再次需要磁盘访问(上次访问的时间戳!)您可能是正确的,但我不明白为什么这与您的解决方案有任何不同。此外,所有sane系统管理员都禁用atime。