【问题标题】:Getting the screen resolution using PHP使用 PHP 获取屏幕分辨率
【发布时间】:2010-12-03 00:45:49
【问题描述】:

我需要查找访问我网站的用户屏幕的屏幕分辨率吗?

【问题讨论】:

  • 这是通过 JavaScript 而不是 PHP 完成的。 PHP 仅在服务器端执行。不过,在嗅探用户的屏幕分辨率时,请记住,并非所有用户都会全屏浏览!
  • 一种根据尺寸呈现设计的 CSS 方式:stackoverflow.com/questions/19186243/…
  • 使用 JavaScript 获取此信息并通过 AJAX 发送
  • 带有替代选项的类似问题:Can php detect client browser monitor size/resolution?
  • 这真的应该可以通过 PHP 实现(我知道它目前不能)。说它不应该因为 PHP 是服务器端而忽略了我们通过 $_REQUEST 获得的所有其他客户端信息,例如 HTTP_USER_AGENT。为什么我们不能在浏览器视图端口大小中设置另一个字段?

标签: php server client resolution detect


【解决方案1】:

你不能用纯 PHP 做到这一点。您必须使用 JavaScript 来完成。有几篇文章介绍了如何做到这一点。

基本上,您可以设置一个 cookie,或者您甚至可以做一些 Ajax 来将信息发送到 PHP 脚本。如果你使用 jQuery,你可以这样做:

jquery:

$(function() {
    $.post('some_script.php', { width: screen.width, height:screen.height }, function(json) {
        if(json.outcome == 'success') {
            // do something with the knowledge possibly?
        } else {
            alert('Unable to let PHP know what the screen resolution is!');
        }
    },'json');
});

PHP (some_script.php)

<?php
// For instance, you can do something like this:
if(isset($_POST['width']) && isset($_POST['height'])) {
    $_SESSION['screen_width'] = $_POST['width'];
    $_SESSION['screen_height'] = $_POST['height'];
    echo json_encode(array('outcome'=>'success'));
} else {
    echo json_encode(array('outcome'=>'error','error'=>"Couldn't save dimension info"));
}
?>

所有这些都是非常基本的,但它应该能让你到达某个地方。通常,屏幕分辨率并不是您真正想要的。您可能对实际浏览器视口的大小更感兴趣,因为这实际上是呈现页面的位置...

【讨论】:

  • Kyle 你有没有找到获取浏览器查看端口尺寸的方法?
  • @KyleFarris ...我对 jquery 和 json 不太擅长.. 代码如下$(function() { $.post('header.php', { width: 800px }, function(json) { if(json.outcome == 'success') { header-800px.php // do something with the knowledge possibly? } else { header.php; } },'json'); });
  • 我不同意你对视图分辨率的看法,但是,答案很好!我猜这个信息可能用于统计和封禁。我更喜欢用户代理和 ip。屏幕分辨率也不错!
  • “some_script.php”的意义是什么?那必须是加载脚本的页面的名称吗?它可以对所有页面通用吗?
  • 一个工作的答案会更好。我该怎么办??
【解决方案2】:

直接使用 PHP 是不可能的,但是...

我编写了这个简单的代码来保存 PHP 会话中的屏幕分辨率,以便在图片库中使用。

<?php
session_start();
if(isset($_SESSION['screen_width']) AND isset($_SESSION['screen_height'])){
    echo 'User resolution: ' . $_SESSION['screen_width'] . 'x' . $_SESSION['screen_height'];
} else if(isset($_REQUEST['width']) AND isset($_REQUEST['height'])) {
    $_SESSION['screen_width'] = $_REQUEST['width'];
    $_SESSION['screen_height'] = $_REQUEST['height'];
    header('Location: ' . $_SERVER['PHP_SELF']);
} else {
    echo '<script type="text/javascript">window.location = "' . $_SERVER['PHP_SELF'] . '?width="+screen.width+"&height="+screen.height;</script>';
}
?>

新解决方案如果您需要在 Get Method 中发送另一个参数(作者 Guddu Modok)

<?php
session_start();
if(isset($_SESSION['screen_width']) AND isset($_SESSION['screen_height'])){
    echo 'User resolution: ' . $_SESSION['screen_width'] . 'x' . $_SESSION['screen_height'];
    print_r($_GET);
} else if(isset($_GET['width']) AND isset($_GET['height'])) {
    $_SESSION['screen_width'] = $_GET['width'];
    $_SESSION['screen_height'] = $_GET['height'];
$x=$_SERVER["REQUEST_URI"];    
    $parsed = parse_url($x);
$query = $parsed['query'];
parse_str($query, $params);
unset($params['width']);
unset($params['height']);
$string = http_build_query($params);
$domain=$_SERVER['PHP_SELF']."?".$string;
        header('Location: ' . $domain);
} else {
$x=$_SERVER["REQUEST_URI"];    
    $parsed = parse_url($x);
$query = $parsed['query'];
parse_str($query, $params);
unset($params['width']);
unset($params['height']);
$string = http_build_query($params);
$domain=$_SERVER['PHP_SELF']."?".$string;
    echo '<script type="text/javascript">window.location = "' . $domain . '&width="+screen.width+"&height="+screen.height;</script>';
}
?>

【讨论】:

  • 很好的解决方案 - 实施并且效果很好。我还拉了 http_user_agent (即使它并不总是填充/准确)。希望有一种方法可以获取实际的浏览器查看端口大小。 (与屏幕分辨率相反)。
  • 我喜欢这个解决方案。简单 - 重定向到 url 中具有大小的页面。对于阅读本文的任何人-您可以获得浏览器视口大小-请参阅stackoverflow.com/questions/8794338,其中说(使用 jquery)使用 .height() 和 .width() 函数。
  • 很好的解决方案,但请您为我们提供一个使用 cookie 而不是会话的解决方案吗?
  • 对用户不可见的最简单方法是什么? (例如,没有 URL 参数等)
  • 这其实很巧妙!
【解决方案3】:

PHP 是一种服务器端语言——它只在服务器上执行,并且生成的程序输出被发送到客户端。因此,没有可用的“客户端屏幕”信息。

也就是说,您可以让客户端通过 JavaScript 告诉您他们的屏幕分辨率是多少。编写一个小 scriptlet 向您发送 screen.width 和 screen.height - 可能通过 AJAX,或者更有可能使用找到它的初始“跳转页面”,然后重定向到 http://example.net/index.php?size=AxB

虽然作为用户,我更希望您设计一个能够流畅地处理任何屏幕分辨率的网站。我在不同大小的窗口中浏览,大部分都没有最大化。

【讨论】:

  • +1 以获得详细解释,而不是最大化您的浏览器窗口。我的浏览器窗口通常大约 800 像素宽;根据我的屏幕分辨率调整大小的网页是我存在的祸根!
【解决方案4】:

我发现在我的 php 中的 html 中使用 CSS 对我有用。

<?php             
    echo '<h2 media="screen and (max-width: 480px)">'; 
    echo 'My headline';
    echo '</h2>'; 

    echo '<h1 media="screen and (min-width: 481px)">'; 
    echo 'My headline';
    echo '</h1>'; 

    ?>

如果屏幕为 480 像素或更小,这将输出一个较小尺寸的标题。 因此无需使用 JS 或类似方法传递任何变量。

【讨论】:

  • 这不能回答问题
【解决方案5】:

最简单的方法

<?php 
//-- you can modified it like you want

echo $width = "<script>document.write(screen.width);</script>";
echo $height = "<script>document.write(screen.height);</script>";

?>

【讨论】:

  • 我想知道为什么 S.O 用户会否决这样一个非常好的答案。非常感谢,您的回答提供了通过 PHP 直接访问屏幕宽度和高度的方法,我什至在旧的移动设备上也对其进行了测试。谢谢
  • 愚蠢。你已经在 DOM 上了。您不会使用该代码去任何地方。除非您弄清楚如何在客户端机器上使用服务器端代码。如果你知道怎么做,那我就更正了——你太棒了! :)
  • 首先我投了赞成票,但它不起作用,它只显示(回显)javascript 宽度和高度,但您不能设置 php 变量以用于计算,例如不提交页面。在显示代码后添加它,您会看到。 echo substr($width,0,8)." alert('hello');".substr($height,-9);
【解决方案6】:

这是一个非常简单的过程。是的,您无法在 PHP 中获取宽度和高度。确实,JQuery 可以提供屏幕的宽度和高度。首先去https://github.com/carhartl/jquery-cookie 获取jquery.cookie.js。以下是使用 php 获取屏幕宽度和高度的示例:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Test</title>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
        <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
        <script src="js/jquery.cookie.js"></script>
        <script type=text/javascript>
            function setScreenHWCookie() {
                $.cookie('sw',screen.width);
                $.cookie('sh',screen.height);
                return true;
            }
            setScreenHWCookie();
        </script>
    </head>
    <body>
        <h1>Using jquery.cookie.js to store screen height and width</h1>
    <?php
         if(isset($_COOKIE['sw'])) { echo "Screen width: ".$_COOKIE['sw']."<br/>";}
         if(isset($_COOKIE['sh'])) { echo "Screen height: ".$_COOKIE['sh']."<br/>";}
    ?>
    </body>
    </html>

我有一个你可以执行的测试:http://rw-wrd.net/test.php

【讨论】:

  • 这在 Firefox 中对我没有任何作用。
【解决方案7】:

使用 JavaScript(screen.widthscreen.height IIRC,但我可能错了,有一段时间没做 JS)。 PHP 做不到。

【讨论】:

    【解决方案8】:

    完整的工作示例

    我找不到一个实际工作的 PHP 示例来“不可见”(没有 URL 参数)将客户端屏幕大小和其他属性返回到服务器端 PHP ,所以我把这个例子放在一起。

    JS 填充并提交一个隐藏表单(由 PHP 从一组 JS 属性编写脚本)POSTing 给它自己(现在在 PHP 中可用的数据)并在表格中返回数据。

    (在“多个”浏览器中测试。)

    <!DOCTYPE html>
    <html>
    <head>
        <title>*Client Info*</title>
        <style>table,tr{border:2px solid gold;border-collapse:collapse;}td{padding:5px;}</style>
    </head>
    
    <body>
    <?php
      $clientProps=array('screen.width','screen.height','window.innerWidth','window.innerHeight', 
        'window.outerWidth','window.outerHeight','screen.colorDepth','screen.pixelDepth');
    
      if(! isset($_POST['screenheight'])){
    
        echo "Loading...<form method='POST' id='data' style='display:none'>";
        foreach($clientProps as $p) {  //create hidden form
          echo "<input type='text' id='".str_replace('.','',$p)."' name='".str_replace('.','',$p)."'>";
        }
        echo "<input type='submit'></form>";
    
        echo "<script>";
        foreach($clientProps as $p) {  //populate hidden form with screen/window info
          echo "document.getElementById('" . str_replace('.','',$p) . "').value = $p;";
        }
        echo "document.forms.namedItem('data').submit();"; //submit form
        echo "</script>";
    
      }else{
    
        echo "<table>";
        foreach($clientProps as $p) {   //create output table
          echo "<tr><td>".ucwords(str_replace('.',' ',$p)).":</td><td>".$_POST[str_replace('.','',$p)]."</td></tr>";
        }
        echo "</table>";
      }
    ?>
    <script>
        window.history.replaceState(null,null); //avoid form warning if user clicks refresh
    </script>
    </body>
    </html>
    

    返回的数据是extract'd 到变量中。例如:

    • window.innerWidth$windowinnerWidth 中返回

    【讨论】:

    • 感谢完整的 PHP 代码。这只是复制粘贴,效果很好。
    • 很好的榜样。非常感谢。
    • 这是迄今为止我见过的最好的 PHP 版本。没有复杂性或 javascript 冲突但请如何准确检索 php 变量中的宽度?
    • "现在在 PHP 中可用的数据" 只有在服务器上的 php 才“可用”。为此,您的代码需要通过 ajax 调用将这些 DOM 属性提交回服务器。或者,您可以使用表单方法完成您的提交例程并以这种方式获得它,但您还没有证明这一点,事情已经很混乱了。您在这里所做的只是使用 php 打印一些文本字符串,然后将其放到 DOM 上。
    【解决方案9】:

    你可以试试RESS(响应式设计+服务器端组件),看这个教程:

    http://www.lukew.com/ff/entry.asp?1392

    【讨论】:

    • 我已经更新了:响应式设计 + 服务器端组件 :)
    【解决方案10】:

    您可以在前端使用JS在cookie中设置窗口宽度,您可以在PHP中获取它:

    <script type="text/javascript">
       document.cookie = 'window_width='+window.innerWidth+'; expires=Fri, 3 Aug 2901 20:47:11 UTC; path=/';
    </script>
    
    <?PHP
        $_COOKIE['window_width'];
    ?>
    

    【讨论】:

    • 未定义索引:window_width
    • 这是因为 php 先运行后 javascript。
    【解决方案11】:

    你可以像下面这样检查:

    if(strstr(strtolower($_SERVER['HTTP_USER_AGENT']), 'mobile') || strstr(strtolower($_SERVER['HTTP_USER_AGENT']), 'android')) {
       echo "mobile web browser!";
    } else {
    echo "web browser!";
    }
    

    【讨论】:

    • 虽然这不会以屏幕分辨率响应,但它会检测最终用户是否使用移动设备,这符合我的目的。我只想根据我的网站访问者选择的设备为他们提供一组不同的菜单选择,这对我来说非常有效。谢谢。
    • 对我也很有效。只是想更改显示的产品数量(3 个桌面产品,2 个移动产品)
    【解决方案12】:

    我认为您不能仅使用 PHP 检测屏幕大小,但您可以检测用户代理..

    <?php
        if ( stristr($ua, "Mobile" )) {
            $DEVICE_TYPE="MOBILE";
        }
    
        if (isset($DEVICE_TYPE) and $DEVICE_TYPE=="MOBILE") {
            echo '<link rel="stylesheet" href="/css/mobile.css" />'
        }
    ?>
    

    这里是更详细脚本的链接:PHP Mobile Detect

    【讨论】:

      【解决方案13】:

      这里是 Javascript 代码:(index.php)

      <script>
          var xhttp = new XMLHttpRequest();  
          xhttp.open("POST", "/sqldb.php", true);
          xhttp.send("screensize=",screen.width,screen.height);
      </script>
      

      这是 PHP 代码:(sqldb.php)

      $data = $_POST['screensize'];
      $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
      $statement = $pdo->prepare("UPDATE users SET screen= :screen WHERE id = $userid");
      $statement->execute(array('screen' => $data));
      

      我希望你知道如何从 Session 中获取 $userid, 为此,您需要一个带有名为 users 的表的数据库,以及一个名为 screen 的用户表;=) 问候KSP

      【讨论】:

        【解决方案14】:

        唯一的方法是使用 javascript,然后将 javascript 发布到您的 php 中(如果您真的需要 res 服务器端)。但是,如果他们关闭 javascript,这将完全失败。

        【讨论】:

          【解决方案15】:

          JS:

          $.ajax({
              url: "ajax.php",
              type: "POST",
              data: "width=" + $("body").width(),
              success: function(msg) {
          
                  return true;
              }
          });
          

          ajax.php

          if(!empty($_POST['width']))
              $width = (int)$_POST['width'];
          

          【讨论】:

            【解决方案16】:

            这可以使用 cookie 轻松完成。此方法允许页面根据屏幕高度和宽度(或浏览器视口高度和宽度值)检查存储的 cookie 值,如果它们不同,它将重置 cookie 并重新加载页面。代码需要允许用户偏好。如果关闭了持久性 cookie,请使用会话 cookie。如果这不起作用,您必须使用默认设置。

            1. Javascript:检查是否设置了高度和宽度 cookie
            2. Javascript:如果已设置,请检查 screen.height 和 screen.width(或任何您想要的)是否与 cookie 的当前值匹配
            3. Javascript:如果 cookie 未设置或与当前值不匹配,则: 一种。 Javascript:为当前 screen.height 和 screen.width 的值创建名为(例如)“shw”的持久性或会话 cookie。
              湾。 Javascript:使用 window.location.reload() 重定向到 SELF。重新加载时,它将跳过第 3 步。
            4. PHP:$_COOKIE['shw'] 包含值。
            5. 继续使用 PHP

            例如,我正在使用网络上的一些常见 cookie 功能。确保 setCookie 返回正确的值。 我把这段代码紧跟在 head 标签之后。显然该函数应该在源文件中。

            <head>
            <script src="/include/cookielib.js"></script>
            <script type=text/javascript>
            function setScreenHWCookie() {
                // Function to set persistant (default) or session cookie with screen ht & width
                // Returns true if cookie matches screen ht & width or if valid cookie created
                // Returns false if cannot create a cookies.
                var ok  = getCookie( "shw");
                var shw_value = screen.height+"px:"+screen.width+"px";
                if ( ! ok || ok != shw_value ) {
                    var expires = 7 // days
                    var ok = setCookie( "shw", shw_value, expires)
                    if ( ok == "" ) {
                        // not possible to set persistent cookie
                        expires = 0
                        ok = setCookie( "shw", shw_value, expires)
                        if ( ok == "" ) return false // not possible to set session cookie
                    }
                    window.location.reload();
                }
                return true;
            }
            setScreenHWCookie();
            </script>
            ....
            <?php
            if( isset($_COOKIE["shw"])) {
                $hw_values = $_COOKIE["shw"];
            }
            

            【讨论】:

              【解决方案17】:

              PHP 只能在服务器端工作,不能在用户主机上工作。使用 JavaScript 或 jQuery 获取此信息并通过 AJAX 或 URL (?x=1024&y=640) 发送。

              【讨论】:

              • 那就是 ?x=1024&y=640
              • 我认为你需要使用 &y 而不是 ?y
              【解决方案18】:

              快速回答是否定的,那么您可能会问为什么我不能用 php 做到这一点。好的,这是一个更长的答案。 PHP 是一种服务器端脚本语言,因此与特定客户端的类型无关。然后您可能会问“为什么我可以从 php 获取浏览器代理?”,那是因为该信息是在向服务器请求时与初始 HTTP 标头一起发送的。因此,如果您想要不与 HTTP 标头一起发送的客户端信息,您必须使用像 javascript 这样的客户端脚本语言。

              【讨论】:

                【解决方案19】:

                用于获取宽屏或高屏
                1- 创建一个 PHP 文件 (getwidthscreen.php) 并在其中写入以下命令
                PHP (getwidthscreen.php)

                <div id="widthscreenid"></div>
                <script>
                document.getElementById("widthscreenid").innerHTML=screen.width;
                </script>
                

                2- 通过以下命令通过 cURL 会话获取屏幕宽度
                PHP (main.php)

                $ch = curl_init( 'http://hostname/getwidthscreen.php' );
                curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
                $result = curl_exec( $ch );
                print_r($result);
                curl_close( $ch );
                

                【讨论】:

                  【解决方案20】:

                  在 PHP 中没有标准的方法来获取这些信息。但是,如果您使用的是第 3 方解决方案,则有可能。 PHP的51Degrees设备检测器具有您需要的属性:

                  为您提供用户屏幕的宽度和高度(以像素为单位)。为了使用这些属性,您需要从sourceforge 下载检测器。然后,您需要在需要检测屏幕高度和宽度的文件中包含以下 2 行:

                  <?php
                  require_once 'path/to/core/51Degrees.php';
                  require_once 'path/to/core/51Degrees_usage.php';
                  ?>
                  

                  其中 path/to/core 是您从 sourceforge 下载的“Core”目录的路径。最后,使用属性:

                  <?php
                  echo $_51d['ScreenPixelsHeight']; //Output screen height.
                  echo $_51d['ScreenPixelsWidth']; //Output screen width.
                  ?>
                  

                  请记住,当无法识别设备时,这些变量有时可能包含“未知”值。

                  【讨论】:

                    【解决方案21】:

                    解决方案:进行可扩展的网页设计...(我们应该说正确的网页设计)格式应该在客户端完成,我确实希望信息能够传递到服务器,但信息仍然有用(每个对象有多少个对象)行类型的交易)但网页设计仍然应该是流畅的,因此每个行元素不应该放入表格中,除非它是一个实际的表格(并且数据将缩放到它的单个单元格)如果你使用一个 div 你可以将每个元素堆叠在旁边彼此,您的窗口应该在适当的位置“打破”该行。 (只需要适当的 css)

                    【讨论】:

                      【解决方案22】:
                      <script type="text/javascript">
                      
                      if(screen.width <= 699){
                          <?php $screen = 'mobile';?>
                      }else{
                          <?php $screen = 'default';?>
                      }
                      
                      </script>
                      
                      <?php echo $screen; ?> 
                      

                      【讨论】:

                      • 您不能在 JavaScript 中设置 php 变量。
                      • 解释这个天才:首先php在服务器端执行,即。在到达浏览器之前,而 javascript 在到达浏览器之后执行。
                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-12-10
                      • 2012-02-15
                      • 1970-01-01
                      • 2013-03-12
                      相关资源
                      最近更新 更多