【问题标题】:Why can't server side and client side scripts interact?为什么服务器端和客户端脚本不能交互?
【发布时间】:2013-10-31 22:28:17
【问题描述】:

我是客户端和服务器端脚本的新手,我想知道它们为什么不能交互?

Code Conquest 声明 here 的主要区别在于:

...被称为客户端语言是因为它在您加载网页后在您的计算机上运行脚本。

服务器端或后端语言在加载 HTML 之前运行其脚本,而不是之后。

即使服务器端脚本(例如PHP)已经执行,为什么页面加载后不能更改(使用JavaScript)?

我想从 JS 调用 PHP。例如,有没有可能的方法来做到这一点?

setInterval(<?php someFunction() ?>,10000);

对不起,如果我误解了某些内容,请指出来。

【问题讨论】:

  • 看看 JSON RPC json-rpc.org
  • 这是您的浏览器加载网站时发生的情况。向服务器请求 HTML 文件 => PHP 运行并生成一个 HTML 文件 => PHP 退出 => 浏览器接收该文件并呈现它并运行任何 JavaScript。当您的浏览器获取该页面时,PHP 完成,并且与服务器的连接关闭。你需要研究 AJAX 来做你想做的事。

标签: javascript php client-side server-side


【解决方案1】:

他们可以互动,但不像你想象的那样。

将客户端 JavaScript 视为浏览器,将服务器端代码视为服务器。

然后他们之间通过发送消息进行通信,最常用的交换消息的方法是JSON。

综上所述,客户端代码可以通过GETPOST请求发送消息,或者使用AJAX与服务器通信。

服务器可以响应这些消息,它也可以(这是在 HTML 5 标准中添加的)使用 WebSockets 向客户端发送事件。

【讨论】:

    【解决方案2】:

    它们无法交互(有点 - 下文会更详细地解释),因为它们在两个不同的地方运行。服务器端脚本 - 例如 PHP,将在服务器上运行并在数据发送到用户 PC 之前完成运行。

    客户端脚本(例如,Javascript)在用户完成加载页面数据时开始运行。

    因此,简而言之,PHP 甚至在 JS 开始执行之前就完成了执行——因此它们无法真正进行交互。

    您如何让它们交互是通过一些技巧和 JS 内部的调用来从服务器请求额外的数据 - 所以此时它们仍将单独运行,但您可以通过在页面中进行的额外调用让它们交谈。

    使用这种方法,即使它们完全相互独立地执行,它们也能够通过数据(例如 JSON 对象)交换信息,并给人一种它们正在一起工作的印象,尽管它们完全是在做这件事不同的地方。

    非技术类比

    为了使用一个完全非 IT 的类比,希望它更清楚,假设服务器端脚本是一个军队基地。客户端脚本是部署到另一个国家的单位。他们都在那里完成一项特定的任务,但他们完全独立于彼此工作。现在,JSON 就像他们之间的电话。部署的单位可以呼叫基地,请求进一步的指示,然后执行它们,但就基地而言,他们不知道发生了什么,直到部署的单位再次回家 - 所以他们可以排序一起工作,但在不知道对方真正在做什么的情况下单独进行。

    【讨论】:

      【解决方案3】:

      最简单的方法是使用 AJAX,它是一种动态生成/查找内容的轻量级方式。

      var ajax_call = function() {
          $.ajax({ url: 'script.php?argument=value' }); // gets the php code you need.
      };
      
      var interval = 1000 * 60 * X; // X = amount of minutes it will take till it executes.
      
      setInterval(ajax_call, interval); // sets the ajax_call function in motion
      

      让我知道这是否有效。

      【讨论】:

        【解决方案4】:

        简单示例:

        var request = new XMLHttpRequest();
        request.open('GET', 'http://example.com/yourfile.php?func=someFunc', false);
        request.send();
        
        setInterval(request.responseText, 10000);
        

        或者赋值给var:

        yourvar = request.responseText;
        setInterval(yourvar, 10000);
        

        然后在yourfile.php中:

        $func = $_GET['func'];
        //use $func to call func or do other stuff
        

        【讨论】:

        • 我想我可以使用 AJAX。
        • 你为什么要setInterval(request.responseText, 10000);?很确定 responseText 不是函数。
        【解决方案5】:

        客户端在计算机浏览器上运行。 服务器端在服务器上运行,生成代码发送给客户端。

        Ajax 或 jQuery 可以直接从服务器获取和发送数据。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-28
          • 2017-12-06
          • 2015-12-25
          • 2014-10-06
          • 2013-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多