为什么PHP脚本不能在Web浏览器中工作?

我们都在StackOverflow上看到了许多基于PHP像Javascript这样的想法的问题。 这个人明显不明白,PHP是一个预处理程序 ,只在页面发送前才工作。

一个明确的例子是在下面的代码中,当用户按下button时runCommand()不会运行。

 <a href="<?php runCommand(); ?>">Click Me!</a> 

就像在Javascript中那样

 <a href="javascript:runCommand();">Click Me!</a> 

我看到很多像这样的问题,都是来自新人,他们根本没有意识到PHP的工作原理。

我的问题是: 解释PHP如何工作的一个很好的资源在哪里?

我希望能够将人们redirect到可以让他们走上正确轨道的页面,并且知道预处理器是什么意思。

(这也可以让我懒惰,不必每次写出解释,但不要告诉任何人!)

如果你不知道描述这个地方的地方,可以随意提供你自己的解释。

Carl Smotricz指出,有一部分PHP可以在浏览器之外使用。 但是我主要是在用户请求网页的Apache环境中讨论,并且期望通过HTML来获取某些东西。

维基百科总是一个很好的信息资源。 我build议:

服务器端脚本

VS

客户端脚本


而维基百科也有图片 :

在这里输入图像描述

这可能是你不了解PHP的工作原理。 PHP是一个完整的语言解释器,完全可以在Web服务器之外不使用浏览器的情况下运行PHP脚本:在命令行或IDE或其他GUI环境中。

您所说的PHP预处理器只是一个Apache模块的function,它调用PHP解释器来实现这个特定的有限目的。

PHP代码在服务器端解释,只有您的PHP代码的输出将被发送到客户端。

因此,如果请求一个PHP文件,Web服务器将PHP代码发送给PHP解释器,等待输出,然后将输出发送回客户端。

简而言之,PHP属于服务器,它通常会输出HTML,但不是在这里(或者至less不是这样)。 用户浏览器“看到”只有 php做了它的事情之后仍然是。

Javascript属于客户端(aka浏览器):它通常处理通过parsingHTML(可能)通过执行PHP产生的DOM创build的DOM。 Javascript可以在不同的浏览器中有不同的performance(每个编写JS脚本的人都知道跨浏览器的问题,你还记得IE6吗?)Javascript不能自己处理数据库, 它必须依赖一个严重的语言(php,也许?)(除了谈论node.js)

顺便说一句,AJAX可以是一个很好的参考,了解什么是PHP和JS做什么。

一个重要的区别是浏览器中的JavaScript是事件驱动的。 这就是为什么点击处理程序不会在页面加载时立即执行的原因。 如果不是dom编程的事件驱动风格,那么javascript不能等待响应那个点击。

我真的不认为这是“预处理器”这个词的意思。 客户端/服务器端的区别更重要。 例如,你是否听说过任何其他服务器端语言在执行与PHP相同的任务时被称为预处理器?

php在典型的服务器端场景中响应http请求。 浏览器读取这个响应,并负责渲染它并运行客户端响应中embedded的任何附加的dynamic脚本。 这基本上是这种情况下的分工。

PHP是服务器端的脚本语言,这意味着所有的PHP代码在页面发送到客户端之前执行。 因为这个原因,你永远不会看到

 <?php ... ?> 

在页面源。

在高抽象层次上…您可以将Web服务器(硬件)视为四个不同部分的组成部分。 Webserver(软件,例如Apache),文件系统,数据库和PHP插件。

所以,例如,当你发送页面请求(对于某些页面… / example.php)到Web服务器,Apache将尝试在文件系统中find该页面,如果该页面存在,他将调用php插件来执行所有

 <?php ... ?> 

代码(当然包括db查询)。 之后,页面被发回到客户端,您可以通过JavaScript处理页面,通过CSSdevise…

更多关于: https : //www.youtube.com/watch?v=PemsuAfc7Jw

PHP脚本不能在Web浏览器中工作的原因只是因为Web浏览器不支持PHP (至less我不知道)。 这个事实并不像人们想象的那样微不足道。

这可能听起来令人不安,所以看一下HTML5和HTML4.01的W3C网站上的HTML规范(因为它有更详细的例子)。 你能find什么? 这些脚本可以用JavaScript以外的语言编写!

以下是HTML 4.01文档(标题为“ 指定脚本语言”一节)的示例。


(……)

这是一个更有趣的窗口处理程序:

 <SCRIPT type="text/javascript"> function my_onload() { . . . } var win = window.open("some/other/URI") if (win) win.onload = my_onload </SCRIPT> 

在Tcl中,这看起来像:

  <SCRIPT type="text/tcl"> proc my_onload {} { . . . } set win [window open "some/other/URI"] if {$win != ""} { $win onload my_onload } </SCRIPT> 

用Tcl编写的脚本在HTML中是完全可以的! 那么PHP呢? HTML5文档说:

如果脚本块types的每个组件都是用户代理实现的脚本语言的MIMEtypesstring中对应组件的ASCII大小写不敏感匹配,则说用户代理支持脚本语言。 (…) 用户代理可能支持其他语言的其他MIMEtypes ,但不能支持上述列表中的其他语言的其他MIMEtypes。 用户代理不需要支持上面列出的语言。

因此,只有在网页浏览器(用户代理)支持PHP的情况下。 玩W3C的例子,PHP感知的networking浏览器可能已经接受这样的事情。

 <script type="text/php"> function my_onload() { . . . } $win = $window->open('some/other/URI'); if ($win !== false) $win->onload = 'my_onload'; </script> 

所以,人们提出这样的问题的原因并不是他们不知道PHP是如何工作的。 这是因为他们一般不了解networking技术。 他们在这一点上失败了,这需要了解什么,在哪里和为什么应该被执行。