Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.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 检测服务器端的视网膜(HD)显示_Php_Retina Display - Fatal编程技术网

Php 检测服务器端的视网膜(HD)显示

Php 检测服务器端的视网膜(HD)显示,php,retina-display,Php,Retina Display,我发现了许多关于视网膜显示的问题,但没有一个答案是在服务器端 我希望根据屏幕提供不同的图像,例如(PHP): 你能想出一个解决办法吗 我只能想象一个JavaScript测试,设置一个Cookie。但是,这需要初始交换来设置它。谁有更好的解决方案 Cookie设置代码: (function(){ if( document.cookie.indexOf('device_pixel_ratio') == -1 && 'devicePixelRatio' in windo

我发现了许多关于视网膜显示的问题,但没有一个答案是在服务器端

我希望根据屏幕提供不同的图像,例如(PHP):

你能想出一个解决办法吗

我只能想象一个JavaScript测试,设置一个Cookie。但是,这需要初始交换来设置它。谁有更好的解决方案

Cookie设置代码:

(function(){
  if( document.cookie.indexOf('device_pixel_ratio') == -1
      && 'devicePixelRatio' in window
      && window.devicePixelRatio == 2 ){

    document.cookie = 'device_pixel_ratio=' + window.devicePixelRatio + ';';
    window.location.reload();
  }
})();

我不确定具体是如何实现的,但是纯PHP解决这个问题的方法是使用
get\u browser
返回浏览器版本和一些功能。这可能会告诉你一些信息,可能导致它是否在视网膜上运行

此外,您可以查看
$\u服务器['HTTP\u用户\u代理]
,它将告诉您有关设备的信息。然后你需要一个有视网膜的设备列表,并进行比较以得到答案


在JS中进行视网膜检测可能更简单、更简单。

好吧,因为目前似乎没有更好的方法,下面是我结合JS、PHP和cookie的解决方案

我希望将来会有更好的答案

<?php
    if( isset($_COOKIE["device_pixel_ratio"]) ){
        $is_retina = ( $_COOKIE["device_pixel_ratio"] >= 2 );

        if( $is_retina)
            $thumbnail = get_image( $item_photo, 'thumbnail_retina' ) ;
        else
            $thumbnail = get_image( $item_photo, 'thumbnail' ) ;

    }else{
?>
<script language="javascript">
(function(){
  if( document.cookie.indexOf('device_pixel_ratio') == -1
      && 'devicePixelRatio' in window
      && window.devicePixelRatio == 2 ){

    var date = new Date();
    date.setTime( date.getTime() + 3600000 );

    document.cookie = 'device_pixel_ratio=' + window.devicePixelRatio + ';' +  ' expires=' + date.toUTCString() +'; path=/';
    //if cookies are not blocked, reload the page
    if(document.cookie.indexOf('device_pixel_ratio') != -1) {
        window.location.reload();
    }
  }
})();
</script>
<?php } ?>
然后,我可以使用以下全局变量:


global$is\u retina
$GLOBALS['is_retina']

因为您没有指定您需要的确切用例,而且我也没有看到服务器的用例,因为我知道客户端需要图像的分辨率(我认为客户端应该决定),所以我的建议如下:

使用类似于或使用srcset属性


这样,您还可以利用浏览器缓存图像。如果有一个url用于两个不同的图像大小,则无法执行此操作。即使是自动创建/更新的图像缓存,也可以使用上次修改的或etag头

我认为HTTP请求包含的信息不足以评估用户的屏幕分辨率或DPI。我刚刚检查过。使用你的解决方案-无法想象有比这更好的解决方案。由于这个示例,我更改了示例函数。retina.js和srcset之间有什么偏好吗?2013年,srcset是预期的或非常新的。你甚至不能在新的视网膜电脑上使用它。现在在2017年,它是一个更好的选择。我更喜欢srcset,因为它可以在没有javascript的情况下工作。此外,您还可以控制哪个img标签可用于视网膜图像,哪个图像不可用。但是,如果您为所有图像提供一个视网膜图像,并且希望完全兼容,那么像retina.js这样的javascript解决方案将更好地为您服务。另请参阅类似地使用javascript或CSS(客户端内容)的其他方法,作为关注者的注意事项,包括示例。
<?php
    if( isset($_COOKIE["device_pixel_ratio"]) ){
        $is_retina = ( $_COOKIE["device_pixel_ratio"] >= 2 );

        if( $is_retina)
            $thumbnail = get_image( $item_photo, 'thumbnail_retina' ) ;
        else
            $thumbnail = get_image( $item_photo, 'thumbnail' ) ;

    }else{
?>
<script language="javascript">
(function(){
  if( document.cookie.indexOf('device_pixel_ratio') == -1
      && 'devicePixelRatio' in window
      && window.devicePixelRatio == 2 ){

    var date = new Date();
    date.setTime( date.getTime() + 3600000 );

    document.cookie = 'device_pixel_ratio=' + window.devicePixelRatio + ';' +  ' expires=' + date.toUTCString() +'; path=/';
    //if cookies are not blocked, reload the page
    if(document.cookie.indexOf('device_pixel_ratio') != -1) {
        window.location.reload();
    }
  }
})();
</script>
<?php } ?>
add_action( 'init', 'CJG_retina' );

function CJG_retina(){

    global $is_retina;  
    $is_retina = isset( $_COOKIE["device_pixel_ratio"] ) AND $_COOKIE["device_pixel_ratio"] >= 2;
}