PHP如何工作,它的体系结构是什么? - php

伙计们,最近我决定回到PHP,做一些比简单登录页面更复杂的事情。三年来,我一直在使用Java / JavaEE进行编程,并且对Java应用程序的体系结构有很好的了解。基本上,虚拟机(一个简单的OS进程)运行称为字节码的已编译代码。一个简单的Java Web服务器基本上是一个Java应用程序,它侦听所提供的TCP端口上的Http请求并做出相应的响应,这当然要复杂得多,但这是其最初的工作。

现在,PHP呢?它是如何工作的 ?简而言之,就是它的体系结构。

我在这个问题上用谷歌搜索,但是90%的文章解释了如何用PHP来实现和构建Web应用程序,这不是我想要的。

参考方案

Java Web服务器和PHP之间的最大区别是PHP没有自己的内置Web服务器。 (嗯,较新的版本可以使用,但是应该仅用于测试,它不能用于生产环境的Web服务器。)PHP本身基本上是一个可执行文件,可读取PHP代码的源代码文件并解释/执行该代码中的命令。文件。而已。简而言之,这就是PHP的体系结构。

该可执行文件支持用户API代码可以调用的默认API,并且可以添加扩展以提供更多API。这些扩展通常使用C编写,并在安装时与PHP可执行文件一起编译。某些扩展只能通过使用其他标志重新编译PHP来添加,而其他扩展则可以针对PHP安装进行编译,然后通过配置文件激活。 PHP提供PEAR和PECL方面的项目是为了标准化和简化此类事后安装。 Userland PHP代码通常还会包含其他简单地用PHP代码编写的第三方库。 C扩展的优点是它们的执行速度和低级系统访问权限,而Userland代码库的优点是它们的琐碎包含。如果您要管理自己的PHP安装,添加新的PHP扩展通常很简单。但是,在非常流行的共享主机模型上,主机要安装的内容和开发人员需要的内容之间通常会存在紧张关系。

实际上,用PHP编写的Web服务通常在第三方Web服务器(Apache)上运行,该服务器处理所有传入请求并使用给定的请求PHP源代码文件作为参数来调用PHP解释器,然后将该进程的所有输出传递回给HTTP客户端。这也意味着,没有像Java通常那样在任何时候都以持久状态运行持久的PHP进程,但是每个请求都是通过启动然后拆除新的PHP实例来处理的。

Java只是将持久性数据保存在内存中,而PHP中请求之间的数据持久性则通过多种方法来处理,例如内存缓存,会话,数据库,文件等。视情况而定。 PHP确实具有操作码缓存插件,其工作方式类似于Java字节码,因此,PHP不必在每次执行相同文件时都重复相同的解析和编译过程。

请记住,编写一个持久运行的PHP程序(就像Java一样运行)是完全可行的,这根本不是PHP的默认方式。我个人非常喜欢为在Gearman或ZMQ上持续运行的特定任务编写工作人员,并在Web服务器上运行一些临时脚本作为“前端”,根据需要将工作委托给这些工作人员。

如果这听起来像一个典型的PHP应用程序,它更多是几个不同组件的胶粘在一起,那么您是正确的。 Java是非常独立的,除了RDBMS服务器之类的外部产品。另一方面,PHP通常倾向于依赖一堆第三方产品。在可以将最佳产品用于特定任务的意义上,它可以发挥其优势,但是在处理不同系统时也需要更多开销。

PHP getallheaders替代 - php

我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…

PHP:将字符串拆分为字母和数字部分的最佳方法 - php

我有几个格式的字符串AA11 AAAAAA1111111 AA1111111 分离字符串的字母和数字部分的最佳方法(最有效)? 参考方案 如果它们都是一系列字母,然后是一系列数字,并且没有非字母数字字符,那么sscanf()可能比regexp更有效$example = 'AAA11111'; list($alpha,$numeric) =…

php-casperjs获取内部文本 - php

我正在为casperjs使用php包装器-https://github.com/alwex/php-casperjs我正在网上自动化一些重复的工作,我需要访问一个项目的innerText,但是我尚不清楚如何从casperjs浏览器访问dom。我认为在js中我会var arr = document.querySelector('label.input…

PHP strtotime困境 - php

有人可以解释为什么这在我的服务器上输出为true吗?date_default_timezone_set('Europe/Bucharest'); var_dump( strtotime('29.03.2015 03:00', time()) === strtotime('29.03.2015 04:00�…