JavaScript 何时何地运行,PHP 怎么样?我可以将两者结合起来吗?

When and where does JavaScript run, how about PHP? Can I combine the two?

提问人:Madara's Ghost 提问时间:8/2/2014 最后编辑:Ja͢ckMadara's Ghost 更新时间:8/7/2014 访问量:15130

问:

客户端语言(如 JavaScript)何时运行,服务器端语言(如 PHP)何时运行?我怎样才能将两者混合使用?

我想在点击我网站上的按钮时运行 PHP 函数,或者从 PHP 运行 JavaScript 函数;这可能吗?

Javascript PHP

评论

0赞 Benjamin Gruenbaum 8/2/2014
密切相关:stackoverflow.com/questions/13840429/...
1赞 mTorres 8/2/2014
除了到目前为止的 3 个回复之外,您可能还想检查一下这个 v8js 扩展(基本上它是 v8 js 引擎和 PHP Zend 引擎之间的桥梁)。

答:

35赞 Madara's Ghost 8/2/2014 #1

简短的回答是否定的。你不能从JavaScript运行PHP函数[AJAX除外],也不能从PHP运行JavaScript函数。两个运行时间是分开的。

如何?

要了解 JavaScript 和 PHP 如何协同工作,您应该首先了解为 Web 提供支持的 HTTP 协议的基础知识。

HTTP Sequence

上图演示了 HTTP 协议的基础知识。用户(您)要求客户端(您的浏览器)获取页面。然后,浏览器将向服务器(在本例中为 Google)询问该页面。服务器将回复一个 HTML 页面,客户端解析该页面,并要求提供正确加载页面所需的图像、字体和任何其他资源。然后,客户端将完成的页面呈现给用户。

那么 JavaScript 从何而来呢?

JavaScript 在客户端(即浏览器)中运行。因此,JavaScript 在服务器的响应到达后运行。让我们将其添加到我们的图表中。

Sequence with JavaScript

JavaScript 脚本在加载后立即开始运行,如果它们有事件侦听器等待来自用户的事件(如单击、键入或四处移动),则它们将继续运行。

PHP适合在哪里?

PHP 在 Server 上运行,Web 服务器(负责提供 Web 内容的程序)将根据其配置运行 PHP。PHP 将处理来自 Web 服务器的输入,并返回输出。该输出将返回给客户端。

更新的图表:

Sequence with JavaScript and PHP

正如你所看到的,PHP执行不会持久化。它被执行,然后在发送响应后结束。


正如你所看到的,PHP执行和JavaScript执行之间没有重叠,所以实际上不可能在其中一个上使一个函数基于另一个的输入工作。

但。。但。。我听说过 AJAX!

AJAX 只是导致另一个来自 JavaScript 的 HTTP 请求。你可以称它为一种从 JavaScript 中使用 PHP 函数的方法,但实际上并不完全如此。

AJAX Sequence

正如你所看到的,在AJAX中,JavaScript将向服务器发送一个请求,服务器将调用PHP,PHP将再次运行,就像在普通请求中一样(PHP不一定知道这是一个AJAX请求!),服务器将响应返回给JavaScript,JavaScript使用它来做一些事情。

在这种情况下,PHP 的运行时间和 JavaScript 的运行时间之间存在重叠,因为 JavaScript 调用了请求。

另请参阅:

评论

1赞 mTorres 8/2/2014
我只想提出一个边缘案例:在将 Behat 与某些浏览器客户端(例如 selenium)一起使用时,您实际上可以运行 JS 并将结果传递给您的 PHP 脚本(它们都在不同的环境中运行,但您可以从 PHP 中授粉 JS 并将结果获取到 PHP 脚本上)。这在功能测试的上下文中很有用,因为您需要检查 HTML 页面上的一些条件(客户端,所以 JS),但您是在后端(所以 PHP)上测试的。
4赞 K.K. Smith 8/2/2014 #2

另一个答案很好,但我只会尝试一种更简单的方法。

您的浏览器从服务器接收 HTML 和 JavaScript 页面。PHP 正在服务器上工作,以组装发送到浏览器的最终页面。它可以检查一些数据库,进行一些计算,也许还可以与API连接,但是在所有这些结束时,它会获取所有信息并将其“打印”在充满代码的页面上,然后将其发送到您的浏览器。

浏览器获取页面,如果页面上有任何 Javascript,或者如果有 SCRIPT 标记拉入其他 .js 文件,它会读取所有这些内容,然后执行 Javascript。

所以你的页面是由PHP“构建”的,它可以以某种方式将Javascript包含在其中,这将由浏览器执行,但这两个过程通常是分开的。

你可以通过在页面上输出特定的JS代码来让PHP与Javascript“对话”。

您可以通过在页面执行时使用 AJAX 联系服务器来让 Javascript 与 PHP “对话”。服务器可以返回答案信息,然后再次使用 Javascript 将其集成到页面中。

但总的来说,这两个进程在各自的世界中运行。

你可以用AJAX做最好的“按钮启动PHP代码”。

从“内部”PHP 运行 Javascript 并没有真正完成。

22赞 Zirak 8/2/2014 #3

欢迎来到 McBurger,一家花哨的(是的,对的)汉堡店。干涸的气味 油脂侵入鼻孔,导致肠道咕噜咕噜地混合 厌恶和喜悦。你耐心地在母亲身后排队等候应该做什么 成为人类的孩子。最后,你面对面地见到了十几岁的收银员,而不是 没有一点怜悯。你点了一个汉堡(惊喜)和一些薯条。您支付并 稍等片刻,等待您的订单。

过了一会儿,你拿到了汉堡,却发现他们忘记了你的 炸土豆条!你再次走到收银台前,向他们索要。你再等一等 让薯条准备好。一旦他们这样做了,你就会把所有东西都吃完然后离开。

这与任何事情有什么关系?

愤怒的收银员是服务器,也许运行php。

你是客户端,也许是一个能够理解html/css/js的Web浏览器。

为了获得服务,你走近柜台说“我想要一个汉堡”。麦伯格 然后准备并给你一个汉堡。

为了获得服务,网络浏览器接近服务器并说“我想要这个页面”。 然后,您的服务器会准备并为您提供一个页面。

最重要的方面是没有客户和 麦伯格。你不会自己准备薯条,麦伯格也不会喝你的 奶昔。同样,Web 浏览器不会运行 php,而服务器会 不为您运行 JavaScript。如果你想让 McBurger 给你他们著名的焦糖 冰淇淋,你必须走近柜台并要求一个。如果你想要你的网页 要在单击按钮时将某些内容保存到数据库中,必须接近服务器 并要求它这样做。

你和 McBurger 通过声音进行交流。浏览器和服务器通过 HTTP 进行通信。

让我们看一下 HTTP。

兔子,你把我带到哪里去了?

如果您在几乎任何 linux 发行版或 Mac 上运行,那么您已经安装了 netcat。如果你使用的是 Windows,对不起,你必须相信我的话,或者下载 nc 端口或某种类型的 telnet 客户端。

无论如何,打开你最喜欢的终端,让我们在端口 80(默认的 http 端口)上与某个服务器交谈:

% nc www.stackoverflow.com 80

“哎呀,没什么大不了的,我面前只有一个空洞的提示!”

别担心,在这些答案中我与之交谈的随机人,我们只是没有对服务器说什么!在McBurger,这相当于走到柜台前,目不转睛地盯着收银员。

只。

凝视。

我们必须快速开始使用我们的声带,否则他们会打电话给保安。我不能回到那个地狱般的玛莎,我只是......不能

...无论如何,我们需要告诉收银员我们想要一个汉堡。在 http 中,它发出一个 GET 请求:

% nc www.stackoverflow.com 80
GET / HTTP/1.1

按两次回车键,欢呼,我们得到了一些输出!

HTTP/1.1 400 Bad Request
Content-Type: text/html; charset=us-ascii
Date: Sat, 02 Aug 2014 10:55:16 GMT
Content-Length: 334

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid Hostname</h2>
<hr><p>HTTP Error 400. The request hostname is invalid.</p>
</BODY></HTML>

那不可能是好事。很多东西我不明白,但它说请求主机名无效。让我们再试一次,只是这次我们给它一个主机:

% nc www.stackoverflow.com 80
GET / HTTP/1.1
Host: stackoverflow.com

按两次回车键,“天哪,输出量大!是的,人,就是这样。

兔子,这有什么关系?

那么这与php和一些流程图有什么联系呢?仍然认为您可以在点击时运行 php?让我们用php写一个“hello world”,看看为什么这是不可能的。

只是为了这个场合,我安装了php并写了一些文件:

# example.php
<?php
echo 'Hi mom!';
?>

很酷,让我们做一个请求,看看发生了什么:

% nc localhost 80
GET /example.php HTTP/1.1
Host: localhost

仪式二进入钥匙和:

HTTP/1.1 200 OK
Server: nginx/1.2.1
Date: Sat, 02 Aug 2014 11:00:52 GMT
Content-Type: text/html

Hi mom!

恭喜,我们有自己的汉堡店!我们有一个服务器,我们可以响应客户!欢乐世界!

这里发生的事情是这样的对话:

  • 我:给我。/example.php
  • 服务器:好的。嘿php,运行example.php
  • php:随便。输出为Hi mom!
  • 服务器:你去客户端了,Hi mom!
  • 我:谢谢!

综上所述

  • 服务器和客户端是两个独立的存在。
  • 它们通过称为 HTTP 的东西进行通信。
  • 如果客户端想要某样东西,它必须向服务器索取。
    • 它通过执行 HTTP 请求来做到这一点。

无耻的自我推销:如果你想知道如何从 javascript 创建 http 请求,你可以参考我关于此事的要点(警告:包含脏话的痕迹)。