php 不是有自己的解析器吗?
apache 只是将url请求对应到本地服务器的磁盘文件,发现该文件是.php的,就会交给php解析器来做(这个过程之后就和apache暂时没有关系了)
apache所在用户(www-data)需要对该文件有读取的权限 然后php解析器去执行这个脚本
将执行完毕的结果(dom文档)一并交给apache,
apche再将dom文档原样(可能加一些响应头之类的)返回给客户端浏览器
客户端浏览器接收到dom文档,加载js引擎 逐行解析, 碰到img这些特殊标签才会再次向服务器发送请求 ...
我理解的是apache只是负责传递一下分配一下? 请前辈指出我理解不对的地方
回复内容:
php 不是有自己的解析器吗?
apache 只是将url请求对应到本地服务器的磁盘文件,发现该文件是.php的,就会交给php解析器来做(这个过程之后就和apache暂时没有关系了)
apache所在用户(www-data)需要对该文件有读取的权限 然后php解析器去执行这个脚本
将执行完毕的结果(dom文档)一并交给apache,
apche再将dom文档原样(可能加一些响应头之类的)返回给客户端浏览器
客户端浏览器接收到dom文档,加载js引擎 逐行解析, 碰到img这些特殊标签才会再次向服务器发送请求 ...
我理解的是apache只是负责传递一下分配一下? 请前辈指出我理解不对的地方
从宏观上来看,PHP内核的实现与世界上绝大多数的程序一样,接收输入数据, 做相应处理然后输出(返回)结果。 我们编写的代码就是PHP接收的输入数据,PHP内核对我们编写的代码进行解释和运算, 最后返回相应的运算结果。
这个问题要从『PHP内部的生命周期』和『SAPI接口』来理解:
先来看张图:
从图上可以看出,PHP从下到上是一个4层体系:
Zend引擎:Zend整体用纯C实现,是PHP的内核部分,它将PHP代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕Zend实现。
Extensions:围绕着Zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过extension来实现,用户也可以根据需要实现自己的extension以达到功能扩展、性能优化等目的(如贴吧正在使用的PHP中间层、富文本解析就是extension的典型应用)。
Sapi:Sapi全称是Server Application Programming Interface,也就是服务端应用编程接口,Sapi通过一系列钩子函数,使得PHP可以和外围交互数据,这是PHP非常优雅和成功的一个设计,通过sapi成功的将PHP本身和上层应用解耦隔离,PHP可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。
上层应用:这就是我们平时编写的PHP程序,通过不同的sapi方式得到各种各样的应用模式,如通过webserver实现web应用、在命令行下以脚本方式运行等等。
Sapi通过通过一系列的接口,使得外部应用可以和PHP交换数据并可以根据不同应用特点实现特定的处理方法,我们常见的一些sapi有:
apache2handler:这是以apache作为webserver,采用mod_PHP模式运行时候的处理方式,也是现在应用最广泛的一种。
cgi:这是webserver和PHP直接的另一种交互方式,也就是大名鼎鼎的fastcgi协议,在最近今年fastcgi+PHP得到越来越多的应用,也是异步webserver所唯一支持的方式。
cli:命令行调用的应用模式
Apache是Apache软件基金会的一个开放源代码的Web服务器, 可以在大多数电脑操作系统中运行,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。 Apache支持许多特性,大部分通过模块扩展实现。常见的模块包括mod_auth(权限验证)、mod_ssl(SSL和TLS支持) mod_rewrite(URL重写)等。一些通用的语言也支持以Apache模块的方式与Apache集成。 如Perl,Python,Tcl,和PHP等。
当PHP需要在Apache服务器下运行时,一般来说,它可以mod_php5模块的形式集成, 此时mod_php5模块的作用是接收Apache传递过来的PHP文件请求,并处理这些请求, 然后将处理后的结果返回给Apache。如果我们在Apache启动前在其配置文件中配置好了PHP模块(mod_php5), PHP模块通过注册apache2的ap_hook_post_config挂钩,在Apache启动的时候启动此模块以接受PHP文件的请求。
先看一些Apache里的PHP配置httpd.conf:
<code>LoadModule php5_module modules/libphp5.so AddHandler application/x-httpd-php .php</code>
libphp5.so/libphp7.so作为Apache的一个模块module,PHP解释器是工作在Apache进程内(运行用户是相同的),Apache会把.php后缀的文件交给进程内的PHP模块处理,并把结果返回给浏览器.也就是说,载入了PHP模块的Apache就是一个PHP运行容器,它们是一个整体,是耦合的,所以必须先编译Apache,才能在编译PHP时用参数--with-apxs2=/png/httpd/2.4/bin/apxs
指定Apache模块构建脚本,告诉Apache我要构建PHP模块.
对于Nginx和PHP-FPM这种模式,楼主才需要考虑到运行用户不同权限不同的问题,因为Nginx和PHP-FPM是分离的,两者是不同的进程,通过TCP或者Unix Domain Socket通信,不过一般Nginx和PHP-FPM都设为同样的运行用户,方便Nginx和PHP-FPM都能有权限操作同样的文件.另外PHP-FPM也可以看做一个PHP容器,因为PHP-FPM进程也是内置了PHP解释器的,因为其不依赖命令行的php,也不依赖php-cgi,跟Apache的区别就是PHP-FPM是一个FastCGI服务,而Apache是一个HTTP服务,Apache能够直接跟浏览器通信,而PHP-FPM则需要通过Nginx跟浏览器交互.
题外话:
PHP从5.4开始内置了一个HTTP服务器,官方定位是用于开发和测试,因为这个HTTP服务器并不是一个通用的标准的HTTP服务器,比如其不支持HTTPS,也不支持目录列表,还有单进程架构也不能利用多核.除了用来开发,我还找到了一个有意思的应用场景,既然PHP内置了HTTP服务器和SQLite数据库,那就可以把它当做一个家用的物联网服务器,于是我在Ubuntu上交叉编译了适用于Android和树莓派(Raspbian)的PHP,然后用Java写了个App,调用命令行启动PHP的HTTP服务器,然后打开WebView访问本地PHP服务器,本地PHP负责操作文件系统和网络,WebView用于人机交互,虽然不能调用Android上的Java API,但也能做蛮多事了.这个App已经跑在我的小米4上了.

PHP在现代编程中仍然是一个强大且广泛使用的工具,尤其在web开发领域。1)PHP易用且与数据库集成无缝,是许多开发者的首选。2)它支持动态内容生成和面向对象编程,适合快速创建和维护网站。3)PHP的性能可以通过缓存和优化数据库查询来提升,其广泛的社区和丰富生态系统使其在当今技术栈中仍具重要地位。

在PHP中,弱引用是通过WeakReference类实现的,不会阻止垃圾回收器回收对象。弱引用适用于缓存系统和事件监听器等场景,需注意其不能保证对象存活,且垃圾回收可能延迟。

\_\_invoke方法允许对象像函数一样被调用。1.定义\_\_invoke方法使对象可被调用。2.使用$obj(...)语法时,PHP会执行\_\_invoke方法。3.适用于日志记录和计算器等场景,提高代码灵活性和可读性。

Fibers在PHP8.1中引入,提升了并发处理能力。1)Fibers是一种轻量级的并发模型,类似于协程。2)它们允许开发者手动控制任务的执行流,适合处理I/O密集型任务。3)使用Fibers可以编写更高效、响应性更强的代码。

PHP社区提供了丰富的资源和支持,帮助开发者成长。1)资源包括官方文档、教程、博客和开源项目如Laravel和Symfony。2)支持可以通过StackOverflow、Reddit和Slack频道获得。3)开发动态可以通过关注RFC了解。4)融入社区可以通过积极参与、贡献代码和学习分享来实现。

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

PHP不是在消亡,而是在不断适应和进化。1)PHP从1994年起经历多次版本迭代,适应新技术趋势。2)目前广泛应用于电子商务、内容管理系统等领域。3)PHP8引入JIT编译器等功能,提升性能和现代化。4)使用OPcache和遵循PSR-12标准可优化性能和代码质量。

PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

禅工作室 13.0.1
功能强大的PHP集成开发环境

WebStorm Mac版
好用的JavaScript开发工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3 Linux新版
SublimeText3 Linux最新版

记事本++7.3.1
好用且免费的代码编辑器