php框架性能测试您了解PHP吗?的一件事情就是生态系统一如战争框架龙甲性能
2023-01-19
LAMP 堆栈有了新的竞争,但此版本中的功能再次将 PHP 推向了极限。
2012 年 4 月发布
大约八年前,我为 写了一篇名为“你知道 PHP 吗?”的文章。 在那篇文章中,我谈到了 PHP 对“Web 问题”的顽固的功能优于形式的解决方案及其使事情变得简单的能力。 当时,我们即将发布 PHP 5.0。 现在,在将近十年之后,我们有了全新的 PHP 5.4.0 版本,虽然在此期间发生了很多事情,但很多事情根本没有改变。
没有改变的一件事是生态系统一如既往地重要。 解决 web 问题不仅仅是脚本语言的选择,而是围绕它的整个生态系统。 现在将近 15 年了,LAMP 架构仍然很流行,但我们开始注意到其他强大的选项。 随附的 PHP-FPM 迅速流行起来,因为自 PHP 5.3 以来支持得到了极大改进,并在 5.4 中进一步简化。 系统的 M(即数据库)部分也开始看起来与 8 年前大不相同。 各种解决方案提供了更丰富的选择,而不仅仅是将所有内容都放入表格中。
那里有许多有趣的技术,因此我们编写了 PHP 扩展来轻松访问它们。 我最喜欢的扩展之一是您可以使用它在 PHP 中编写事件驱动的高性能应用程序。 另一个是,这是一个高级套接字库。 就像不需要编写另一种原始文件格式和相关的解析器一样,也没有任何理由使用套接字协议和相关的套接字处理代码。 您甚至可以组合并获得一个独立的、高性能的、事件驱动的高级服务器。 (如果您有兴趣,请参阅此示例。)我也非常喜欢 SVM(支持向量机)机器学习算法,您不必成为机器学习迷也可以问很多问题。
还有许多扩展在最近几年获得了广泛的认可。 特别是流行起来php框架性能测试,逐渐成为用户部署的通用架构的一部分。 您可以分派作业,以便它们由工作人员异步完成。 可以分布在多个服务器上,甚至可以进一步分派到更多类型的工作中。
2004 年发布 PHP 5.0,2005 年发布 5.1,增加了实现、PDO 和性能改进。 PHP 5.2 于 2006 年发布,引入了改进的内存管理器、JSON 支持和输入过滤。 当时,我们着手推动 PHP 6,这是一个非常雄心勃勃的计划,要彻底重写 ICU(国际化组件)库的所有内容。 事实证明,这个计划很仓促——我们无法让足够多的开发人员对此感到兴奋,最终将 PHP 6 中将要引入的各种特性添加到 2009 年发布的 PHP 5.3 5.2 和 5.3 版本中相隔 3 年,这也意味着 5.3 为 PHP 增加了很多内容:命名空间、后期静态绑定、闭包、垃圾收集、受限的 goto、(本机驱动程序)、更好的性能等等。
事后看来,将此版本称为 PHP 6 可能有些道理php框架性能测试,但 PHP 6 等同于编写有关它的书籍的努力,因此我们认为如果不对 PHP 6 进行重大改进,则无法发布。 我们引入了一个名为“intl”的 ICU 扩展,它也是针对 PHP 5.2 编译的,它使您可以访问更多 ICU 功能。 随着时间的推移,扩展不断改进,这意味着几乎所有与 相关的问题都有解决方案,只是没有明确地集成到语言本身。
这导致了 2012 年 PHP 5.4 的推出。此外,自上次发布以来已经过去了将近 3 年,在此期间我们进行了一些改进。 我宁愿恢复到每年一个版本,每个版本包含更少的新功能。
以下是升级到 5.4 后您将看到的主要功能:
内存和性能改进
许多内部结构已变得更小或完全消失,从而在大型 PHP 应用程序中节省了 20-50% 的内存。 通过各种优化将性能提高 10-30%(主要取决于代码在做什么)网站模板,包括内联各种通用代码路径、将 $ 添加到 JIT、使“@”运算符更快、添加运行时类/函数/常量缓存,运行时字符串常量现在被保留,通过预先计算的散列更快地访问常量,空数组更快并且使用更少的内存,()和请求处理得更快,以及整个代码中更多的内存和性能调整。
例如,一些早期测试表明,Zend 在 5.4 中运行速度提高了 21%,内存使用量减少了 23%,而内存使用量减少了 50%,运行速度提高了大约 7%。
可能是 PHP 5.4 中最受关注的功能 — 将它们视为编译器辅助的复制粘贴。 这也是 . 其他语言可能称它们为“”——或者那些语言根本不给它们命名,而是有一个扩展的接口机制,允许一个接口包含其方法的实际实现。
相比之下,PHP 包含针对同一方法的多个实现的显式冲突解决机制。
{
() { ... }
}
一种 {
利用;
//...
}
乙{
利用;
//...
}
// 现在两者都适用
一种::();
B::();
请参阅/获取更多示例,包括冲突解决语法、方法优先级、可见性以及对常量和属性的支持。 此外,要了解有关概念理论的更多信息,您可以阅读 Schärli 的论文“:行为构建块中的复合类”。
紧凑数组语法
添加了一个简单但非常流行的语法:
$a = [1, 2, 3];
$b = ['foo' => '', 'bar' => ''];
也就是说网站模板,您现在不再需要使用“”关键字来定义数组。
函数数组取消引用
添加了另一个通用语法。 返回数组的函数调用现在可以直接取消引用:
() {
['', '', ''];
}
回声()[0]; // :
实例方法调用
与函数数组取消引用相关,您现在可以调用对象实例化方法。 与早期版本一样,您当然仍然可以链接方法调用,因此您现在可以编写如下代码:
富 {
$x = 1;
getX() {
$这个->x;
}
setX($val) {
$this->x = $val;
$这个;
}
}
$X = (new foo)->setX(20)->getX();
回声 $X; // 20
但是,除非您的构造函数执行有用的操作,否则您应该在此处使用静态方法调用,因为可能会丢弃实例化对象。 如果我们将其与紧凑的数组语法和函数数组解引用结合起来,我们可以编写一些非常复杂的代码:
富 {
($arr) {
::($arr);
}
}
echo (new foo( [1, [4, 5], 3] ))[1][0];
看了之后,你能说出输出是什么吗? 在这里,我们将一个二维数组传递给一个只返回数组的构造函数。 然后,我们选择第二个维度的第一个元素,所以这将输出“4”。
闭包绑定
闭包是在 PHP 5.3 中引入的,但在 5.4 中我们改进了闭包与对象交互的方式。 例如:
富{
$道具;
($prop) {
$this->prop = $prop;
}
() {
() { echo ($this->prop); };
}
}
$a = new Foo('酒吧');;
$func = $a->();
$函数(); // : 酒吧
请注意,闭包访问私有属性 $this->prop。 默认情况下,PHP 中的闭包使用预绑定——这意味着闭包内的变量具有定义闭包时的值。 这可以使用引用转换为反向绑定。 但是,也可以重新绑定闭包:
$a = new Foo('酒吧');
$b = new Foo('');
$func = $a->();
$函数(); // : 酒吧
$func = $func->($b);
$函数(); // :
在这里,我们将闭包从 $a 实例重新绑定到 $b 中的实例。 如果你不想让闭包在任何时候访问对象实例,你可以将闭包声明为静态的:
富{
$道具;
($prop) {
$this->prop = $prop;
}
() {
() { echo ($this->prop); };
}
}
$a = new Foo('酒吧');;
$func = $a->();
$函数(); // : $this 不在的时候
作为函数的对象
有一种名为“”的新魔术方法,其用法如下:
{
$;
($价值) {
$this->= $val;
}
() {
('$%.2f', $this->);
}
}
$ = 新的 (11.02/5*13);
回声 $(); // : 28.65 美元
内置网络服务器 (CLI)
CLI 服务器是一个小型 Web 服务器实现,可以从命令行运行:
%php -S :8000
2012 年 3 月 11 日星期日 13:27:09 的 PHP 5.4.0
在:8080
根目录是/home/
Ctrl-C 退出。
CLI 服务器不适合用作生产 Web 服务器; 我们将使用它来运行一些 PHP 回归测试,其他单元测试机制可以使用它,IDE 也可以使用它。 它确实具有一些有用的功能,可用于从命令行进行日常代码调试。 默认情况下,它使用当前目录作为; 它还处理静态文件请求。 默认的目录索引文件是“.php”,所以你可以在充满.php、.css、.jpg等的目录中激活它,它会自动运行。 对于可能使用发送所有请求的前端控制器或路由器的更复杂的应用程序,您可以使用简单的小脚本包装此路由器并启动 CLI 服务器,如下所示:
% php -S :8080 /路径/到/.php
2012 年 3 月 11 日星期日 13:28:01 的 PHP 5.4.0
在:8080
根目录是 /tmp/web
Ctrl-C 退出。
.php 脚本可能如下所示: