什么时候运行像 JavaScript 这样的客户端语言,什么时候运行像 PHP 这样的服务器端语言?我怎样才能混合两者?
我想在单击我网站上的按钮时运行 PHP 函数,或者从 PHP 运行 JavaScript 函数;那可能吗?
什么时候运行像 JavaScript 这样的客户端语言,什么时候运行像 PHP 这样的服务器端语言?我怎样才能混合两者?
我想在单击我网站上的按钮时运行 PHP 函数,或者从 PHP 运行 JavaScript 函数;那可能吗?
简短的回答是否定的。您不能从 JavaScript [AJAX 除外]运行 PHP 函数,也不能从 PHP 运行 JavaScript 函数。两个运行时间是分开的。
要了解 JavaScript 和 PHP 如何协作,您应该首先了解支持 Web 的 HTTP 协议的基础知识。
上图展示了 HTTP 协议的基础知识。用户(您)要求客户端(您的浏览器)为您获取页面。然后浏览器将向服务器(在本例中为 Google)询问该页面。服务器将回复一个 HTML 页面,客户端解析该页面,并要求正确加载页面所需的图像、字体和任何其他资源。客户端然后将完成的页面呈现给用户。
JavaScript在客户端(即浏览器)中运行。所以 JavaScript在来自服务器的响应到达后运行。让我们将其添加到我们的图表中。
JavaScript 脚本一加载就开始运行,如果它们有等待用户事件(如点击、输入或移动)的事件侦听器,它们将继续运行。
PHP运行在 Server 上,Web 服务器(负责提供 Web 内容的程序)将根据其配置运行 PHP。PHP 将处理来自 Web 服务器的输入,并返回输出。该输出返回给客户端。
更新图:
如您所见,PHP 执行不会持续。它被执行,然后在发送响应后结束。
如您所见,PHP 执行和 JavaScript 执行之间没有重叠,因此实际上不可能使其中一个的函数根据另一个的输入工作。
AJAX 只是引起来自 JavaScript 的另一个 HTTP 请求。您可以将其称为从 JavaScript 使用 PHP 函数的一种方式,但实际上并非如此。
如您所见,使用 AJAX,JavaScript 将向服务器发送请求,服务器将调用 PHP,PHP 将再次运行,就像在正常请求中一样(PHP 不一定知道这甚至是 AJAX 请求!)并且服务器将响应返回给 JavaScript,JavaScript 使用它来做事。
在这种情况下,PHP 运行时间和 JavaScript 运行时间之间存在重叠,因为 JavaScript 调用了一个请求。
欢迎来到 McBurger,一家别致的(没错)汉堡店。干涸的油脂的气味侵入你的鼻孔,让你的肠子咕噜咕噜地混合着厌恶和喜悦。你耐心地在一个应该是人类孩子的母亲身后排队。最后,你面对面地见到了十几岁的收银员,不无遗憾。你点了一个汉堡(惊喜)和一些薯条。您付款并等待您的订单。
过了一段时间,你拿到了汉堡,却发现他们忘记了你的薯条!你再次走到收银台,并要求他们。你再次等待薯条准备好。一旦它们出现,你就狼吞虎咽地离开。
烦躁的收银员是服务器,可能正在运行 php。
您是客户端,也许是能够理解 html/css/js 的网络浏览器。
要获得服务,您可以走到柜台说“我想要一个汉堡”。McBurger 然后准备并给你一个汉堡。
为了获得服务,网络浏览器接近服务器并说“我想要这个页面”。然后您的服务器准备并为您提供一个页面。
最重要的方面是没有客户和 McBurger 的混合。你不会自己准备薯条,McBurger 也不会喝你的奶昔。同样,网络浏览器不会运行 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
按 Enter 两次,欢呼吧,我们得到了一些输出!
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。example.phpHi mom!Hi mom!无耻的自我宣传:如果你想知道如何从javascript创建http请求,你可以参考我关于此事的要点(警告:包含脏话的痕迹)。
另一个答案很好,但我会尝试一种更简单的方法..
您的浏览器从服务器接收 HTML 和 JavaScript 页面。PHP 正在服务器上工作以组装发送到浏览器的最终页面。它可以检查一些数据库,进行一些计算,并可能与 API 连接,但最后它会获取所有信息并在充满代码的页面上“打印”,然后将其发送到您的浏览器。
浏览器获取页面,如果页面上有任何 Javascript,或者如果有其他 .js 文件的 SCRIPT 标签,它会读取所有这些,然后执行 Javascript。
因此,您的页面是由 PHP “构建”的,它可以将 Javascript 包含到浏览器执行的某种方式中,但这两个过程通常是分开的。
您可以通过将特定的 JS 代码输出到页面上,让 PHP 与 Javascript 进行“对话”。
通过在页面执行时使用 AJAX 联系服务器,您可以让 Javascript 与 PHP 进行“对话”。服务器可以返回答案信息,然后再次使用 Javascript 将其集成回页面。
但一般来说,这两个进程都在各自的世界中运行。
你可以用 AJAX 最好地“按钮启动 PHP 代码”。
从“内部” PHP 运行 Javascript 并没有真正完成。