JavaScript何时何地运行,PHP如何?我能把两者结合起来吗?

Mad*_*iha 12 javascript php

何时运行像JavaScript这样的客户端语言,何时运行像PHP这样的服务器端语言?我怎么能混合两者?

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

Mad*_*iha 30

简短的回答是否定的.您无法从JavaScript运行PHP函数[AJAX除外],也无法从PHP运行JavaScript函数.两次运行时间是分开的.

怎么样?

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

HTTP序列

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

那么JavaScript进来了哪里?

JavaScript 在客户端(即浏览器)中运行.所以JavaScript 在服务器响应到来后运行.让我们将它添加到我们的图表中.

使用JavaScript进行排序

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

PHP适合哪里?

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

更新图表:

使用JavaScript和PHP进行排序

如您所见,PHP执行不会持久存在.它被执行,然后在发送响应后结束.


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

但是......但是......我听说过AJAX!

AJAX只是从JavaScript引起另一个HTTP请求.您可以将其称为一种使用JavaScript中的PHP函数的方法,但事实并非如此.

AJAX序列

正如您所看到的,使用AJAX,JavaScript将向服务器发送请求,该服务器将调用PHP,PHP将再次运行,就像在正常请求中一样(PHP不一定知道这甚至是一个AJAX请求!)和服务器将响应返回给JavaScript,后者使用它来执行操作.

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

另见:


Zir*_*rak 18

欢迎来到McBurger,一个花哨的(是的)汉堡联合.干涸的油脂的气味侵入你的鼻孔,使你的肠子充满厌恶和喜悦的咕噜声.你耐心地排队等待一个应该是人类孩子的母亲.最后,你面对面地遇到了十几岁的收银员,并非没有一点遗憾.你点了一个汉堡(惊喜)和一些薯条.您支付并等待您的订单.

过了一段时间,你得到你的汉堡,却发现他们忘记了你的薯条!你再次走到收银台,并要求他们.你再次等待薯条准备好了.一旦它们出现,你就把一切都搞砸了.

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

愤怒的收银员是服务器,也许运行PHP.

您是客户端,也许是能够理解html/css/js的Web浏览器.

为了得到服务,你走近柜台并说"我想要一个汉堡".然后McBurger准备并给你一个汉堡.

为了获得服务,Web浏览器接近服务器并说"我想要这个页面".然后,您的服务器会准备并为您提供一个页面.

最重要的方面是没有客户和McBurger的混合.你不会准备自己的薯条,麦克伯格不会喝你的奶昔.同样的方式,Web浏览器不会运行php,服务器也不会为你运行javascript.如果你想让McBurger给你着名的焦糖冰淇淋,你必须走近柜台并要求一个.如果您希望您的网页在单击按钮时向数据库保存某些内容,则必须接近服务器并要求它执行此操作.

你和McBurger通过声音沟通.浏览器和服务器通过HTTP进行通信.

我们来看看HTTP.

兔子,你带我去哪儿了?

如果你在几乎任何Linux发行版或Mac上运行,你都安装了netcat.如果你在Windows上,抱歉,你将不得不接受下一节的话,或者下载某种类型的nc端口或telnet客户端.

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

% nc www.stackoverflow.com 80
Run Code Online (Sandbox Code Playgroud)

"Welp,没有做太多任何事情,在我面前只有一个空洞的提示!"

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

只是.

凝视.

我们必须快速开始使用我们的声带,否则它们会调用安全性.我不能回到那个地狱的玛莎,我只是...... 不能.

...任何人,我们需要告诉收银员我们想要一个汉堡.在http中,这是发出GET请求:

% nc www.stackoverflow.com 80
GET / HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

点击进入两次,欢呼,我们得到一些输出!

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>
Run Code Online (Sandbox Code Playgroud)

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

% nc www.stackoverflow.com 80
GET / HTTP/1.1
Host: stackoverflow.com
Run Code Online (Sandbox Code Playgroud)

点击进入两次,"神圣的bajesus,这是很多输出!" 是的人,就是这样.

兔子,这有什么关系?

那么这如何与php和一些流程图相关联?仍然认为你可以点击运行PHP?让我们在php中写一个"hello world",看看为什么它不可能.

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

# example.php
<?php
echo 'Hi mom!';
?>
Run Code Online (Sandbox Code Playgroud)

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

% nc localhost 80
GET /example.php HTTP/1.1
Host: localhost
Run Code Online (Sandbox Code Playgroud)

仪式二输入键和:

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!
Run Code Online (Sandbox Code Playgroud)

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

这里发生的是这次谈话:

  • 我:给我/example.php.
  • 服务器:好的.嘿php,跑example.php
  • php:无论如何.输出是Hi mom!
  • 服务器:你去客户端, Hi mom!
  • 我:谢谢!

结论

  • 服务器和客户端是两个独立的存在.
  • 他们通过HTTP进行通信.
  • 如果客户想要什么,它必须向服务器询问它.
    • 它通过执行HTTP请求来完成.

无耻的自我推销:如果你想知道如何从javascript创建http请求,你可以参考我的要点(警告:包含咒骂词的痕迹).