PHP 测试

Hello World'; ?>

这个是一段简单的php代码,文件是hello.php,我通过www.xxx.com/hello.php请求这个页面的时候,php是如何解析数据返回给服务器,返回给我的,这个过程是怎么样的。我的理解是当我访问这个文件的时候服务器找到了这个php脚本,然后调用php的脚本解析器解析里边的php代码,那么echo的意思是直接返回了数据么,返回数据只能使用echo么,服务器整合了html和php返回的数据然后发送给客户端,这个页面是我直接访问的,如果这个页面依赖于其他的全局的变量,要怎么办。其他的语言都有一个初始化的东西,初始化整个应用程序,那php就直接运行某一个指定的脚本么,没有初始化这一说么。

回复内容:

PHP 测试

Hello World'; ?>

这个是一段简单的php代码,文件是hello.php,我通过www.xxx.com/hello.php请求这个页面的时候,php是如何解析数据返回给服务器,返回给我的,这个过程是怎么样的。我的理解是当我访问这个文件的时候服务器找到了这个php脚本,然后调用php的脚本解析器解析里边的php代码,那么echo的意思是直接返回了数据么,返回数据只能使用echo么,服务器整合了html和php返回的数据然后发送给客户端,这个页面是我直接访问的,如果这个页面依赖于其他的全局的变量,要怎么办。其他的语言都有一个初始化的东西,初始化整个应用程序,那php就直接运行某一个指定的脚本么,没有初始化这一说么。

这样吧,你先别管web,直接在你hello.php的文件夹运行命令php hello.php

会看到输出下面的内容(1):

PHP 测试

Hello World

这就是php解释器执行你的hello.php的结果,没错,现在跟web还没有半毛钱关系。

php程序对hello.php做了些什么事情呢:

1、打开hello.php文件;

2、从上到下扫描hello.php文件内容;

3、如果找到则按照php的语法执行code,一般的逻辑代码直接执行,但如code里面有输出语句(比如echo print_r等等),则将结果输出;

4、如果字符串不在里面,那么php程序就不认识这些字符串,无法处理,直接把它们输出就行。

php解释器能做的就这么几件事情,你在上面看到的输出也就这个过程得到的。

那么 ,现在来说是php和web。

你浏览器打开http://www.xx.com/hello.php,这个请求被你的web服务程序(nginx、apache……)收到,它(web服务程序)根据你的配置知道这个请求应该是给php解释器来执行的(而像css、js、图片等静态文件的话是不用给php解释器解释了,web服务程序直接处理就ok),它再根据你的配置得到这个网站的根目录在那里,就知道这个请求应该对应到你的哪个hello.php文件上去,继而它将相关的请求信息(HTTP请求头等)设置到环境变量里面,然后通知php解释器去解释hello.php,php解释器就像一开始那样去解释hello.php,并输出(1),web服务程序再把php解释器的输出返回给浏览器(当然会加一些额外的信息,比如HTTP头)。

简单讲就是,web服务程序告诉php该执行那个文件,然后把php的执行结果返回给浏览器。整体上就这样一个过程,但是配置成cgi、fastcgi、php-fpm在web服务程序和php解释器之间的交互上有些差异。

这整个过程在任意的web上都是类似的,尤其是脚本类的语言,无外乎换了个解释器或者是web服务程序和解释器之间的通信方式。

希望你不要走入误区:其实没必要了解这个,就像不知道空调的制冷原理不影响使用一样。如果你想开发一门语言才需要,但是如果你有能力开发一门语言的话你肯定不会问这个问题。为什么说你走入误区了呢?

而且你举的例子和PHP关系不大。

1-通过xxx.com/hello.php运行php文件,这是你的web服务器做的事情,与php无关。

2-是web服务器收到你的请求,然后找到hello.php这个文件,然后调用php解释器解析文件

3-php解析hello.php返回解析结果给web服务器

4-web服务器返回结果给浏览器

5-浏览器把这个结果解析成网页呈现到你的面前。

这是全过程,而php只在步骤3发生了作用。

而人机交互本来就是非常傻瓜的事情,在非图形界面的前提下,使用者总是输入字符,解释器按照预定的规则解释,然后返回字符。

所以,你举的例子的核心部分,当php解释hello.php做了什么呢?判断是不是php代码,不是就原样返回,是就执行并把执行结果返回。怎么判断是不是php代码呢?写在的就是,否则都不是。

所以,基础很重要。先搞明白web请求、http协议、服务器端脚本、浏览器端脚本等基本的概念吧,你的问题跨度太大了。

PHP不仅仅 解释了 Hello World'; ?> 它解释了整个页面,

你可以试着搜索cgi

当用户代码输入给PHP内核去执行的时候, PHP内核会对PHP代码进行词法分析和语法分析, 词法分析是把PHP代码分割成一个个的“单元”(TOKEN), 语法分析则将这些“单元”转化为Zend Engine可执行的操作。 然后PHP内部的Zend Engine对这些操作进行顺次的执行。 Zend Engine是PHP内核的核心部分,负责最终操作的执行和结果的返回, 可以理解成为PHP内核中的“发动机”。

php不仅仅只是解析一下内的内容,它是解释了整个页面,你请求服务器时,服务器返回给你的html代码(也就是所说的网页源代码)是在服务端已经解析好的代码了,然后才是到浏览器端进行渲染等操作,不过现在比较火的方式是将拼接html这些拿到浏览器端来做。

这个直接看php源代码最清楚了

所以,你举的例子的核心部分,当php解释hello.php做了什么呢?判断是不是php代码,不是就原样返回,是就执行并把执行结果返回。怎么判断是不是php代码呢?写在的就是,否则都不是。

非常感谢你的回答,对于上面这段话想继续请教一下,如果hello.php既包含html也包含php服务器看到php后缀都会发给php解析器处理,而不是自己先解析 遇到php才发给php解析器。你说的把执行结果返回,echo这种输出代表一种执行结果,其他的比如运算,如果不适用echo是不是就不返回,暂时这么多 还请赐教

楼主问的好像主要是:其他的语言都有一个初始化的东西,初始化整个应用程序,那php就直接运行某一个指定的脚本么,没有初始化这一说么。

这一句吧?

你所说的初始化,是不是指“编译”???

而php是脚本语言,它是执行的时候再“编译”,而不是先编译,再执行的。

当然,脚本语言有很多,不只是php.

楼主,你的这个意思么?

这涉及到cgi的知识。

从用户请求一个php文件到php解释器解释执行脚本文件再到服务器把解释结果返回给用户这整个过程@incNick解释的很清楚了。而楼主疑惑的地方是php解释器怎么实现“初始化”过程,这其实就是CGI的工作原理。

维基百科上说:

CGI的工作方式,从Web服务器的角度看,是在特定的位置(比如:http://www.example.com/wiki.cgi)定义了可以运行CGI程序。当收到一个匹配URL的请求,相应的程序就会被调用,并将客户端发送的数据作为输入。程序的输出会由Web服务器收集,并加上合适的档头,再发送回客户端。

以php脚本为例,当web服务器遇到匹配的php结尾的uri请求时,会启动php解释器,并把客户端发送的相关的数据(比如,用户请求的uri,相应的get和post的数据等)通过环境变量传递给php解释器,然后php解释器根据这些环境变量在解析脚本的时候设置$_GET, $_POST, $_SERVER等全局变量以供脚本使用,然后解析整个脚本内容,html原样输出,php代码执行输出,得到最后的html页面,传递回web服务器,由web服务器返回给用户,完成整个响应过程。

所以,初始化过程就是根据服务器设定的环境变量设置这些全局变量,没有其他的。而web服务器设置哪些环境变量正事整个CGI协议的中心。

相关标签:php

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

怎么去观察php运行原理,php运行原理如何理解,具体看代码?相关推荐

  1. 以太坊完整工作原理和运行机制!

    以太坊完整工作原理和运行机制! 2018年04月28日 00:00:00 阅读数:26 作者 | Preethi Kasireddy 编译 | 老曹.Aholiab 链圈的人提起「以太坊」三个字想必是 ...

  2. java字节码运行原理_JVM 内部原理(六)— Java 字节码基础之一

    JVM 内部原理(六)- Java 字节码基础之一 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...

  3. Java虚拟机(一)结构原理与运行时数据区域

    前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关知识,Java虚拟机也并不是三言两语能够介绍完的,因此开了Java虚拟机系列,这一篇文章我们来学习Java虚拟 ...

  4. php的工作原理,PHP的运行机制和工作原理的内容

    这篇文章给大家介绍的内容是关于PHP的运行机制和工作原理的内容,有着一定的参考价值,有需要的朋友可以参考一下. 一.PHP设计理念及特点 多进程模型:由于PHP是多进程模型,不同请求间互不干涉,这样保 ...

  5. MR的原理和运行流程

    文章目录 MR的原理和运行流程 Map的运行过程 Reduce处理过程 Shuffle过程 MR运行过程 Yarn && Job MR的原理和运行流程 Map的运行过程 以HDFS上的 ...

  6. 观察多个线程同时运行|| 查看进程线程的方法——未完待续

    观察多个线程同时运行:主要是理解,交替执行,谁先谁后,不由我们控制 查看进程线程的方法

  7. BC之SC:区块链之智能合约——与传统合约的比较以及智能合约模型部署原理、运行原理相关配图

    BC之SC:区块链之智能合约--与传统合约的比较以及智能合约模型部署原理.运行原理相关配图 目录 SC与传统合约的比较 SC模型部署原理.运行原理 SC与传统合约的比较 1.传统合约VS智能合约  特 ...

  8. 使用ToolRunner运行Hadoop作业的原理及用法

    使用ToolRunner运行Hadoop作业的原理及用法 @(HADOOP)[hadoop, 大数据] 使用ToolRunner运行Hadoop作业的原理及用法 一示例程序一打印所有参数 1直接运行程 ...

  9. 利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 Jtop

    利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 原文链接 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能 ...

  10. jvm性能调优实战 - 41JVM运行原理和GC原理Review

    文章目录 Pre JVM和GC的运行原理 对象什么时候进入老年代? 老年代的GC是如何触发的? 正常情况下的系统 Pre 我们已经把完整的JVM运行原理.GC原理以及GC优化的原理,还有线上发生GC问 ...

最新文章

  1. 深入解析阿里 PouchContainer 如何实现容器原地升级
  2. 朋友圈玩分身术!逼死用户的节奏?
  3. mysql查询活跃连接,mysql – 使用大量可能的连接进行查询的最佳方法
  4. 互斥锁 QMutex Class 的翻译
  5. COLING 2020 | 面向机器阅读理解的双向认知思维网络
  6. Django模板语言
  7. CentOS6.2下使用Nokia E72i成功发送短信
  8. P1387 最大正方形
  9. mysql隔离级别和mvcc_数据库MVCC和隔离级别的关系是什么?
  10. VirtualBox4.3.12 安装ubuntu 14.04 分辨率过小(600*480)问题的解决方法
  11. webview img照片旋转_Python图像处理,照片去色、翻转、模糊、缩略图统统搞定
  12. 安装Cnario提示.Net 3.5安装错误, 检查Windows系统更新提示无法检查到更新, 安装.Net 3.5提示Windows无法完成请求的更改, 错误代码:0x800F081F...
  13. 河北省计算机考试报名的照片要求,「河北省考」河北公务员考试报名照片制作在线处理照片教程...
  14. hive经典面试题1--根据主播上播、下播时间戳求播出时长
  15. error C2084 函数“”已有主体
  16. java 支付宝预下单失败,系统异常,预下单状态未知!!! connect timed out
  17. 在ArcGIS中创建Python工具或者pyt工具箱
  18. Altium designer常用设置【转】
  19. 十大蓝牙耳机排名,2021性价比蓝牙耳机
  20. python-树-BST_Traversal-二叉搜索树的遍历

热门文章

  1. Oracle 默认表空间(default permanent tablespace) 说明
  2. 金山毒霸专业版高调上线 宣称杀毒速度增3倍
  3. spring的IOC原理,容器管理的bean类型、bean的生命周期
  4. Nacos内核设计之一致性协议
  5. golang开发效率神器汇总
  6. 简单易懂的 Raft 分布式共识算法讲义
  7. Go Web编程--应用ORM
  8. 编程书说的“Go程序员应该让聚合类型的零值也具有意义”是在讲什么
  9. 高吞吐消息中间件Kafka集群环境搭建(3台kafka,3台zookeeper)
  10. 关于snowflake算法的几个问题