b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

高配机器选静态为何不在PHP-FPM下做代码连接池?

电脑杂谈  发布时间:2021-03-12 06:02:20  来源:网络整理

通常来说,对于具有更大内存的服务器,将其设置为静态将提高效率。由于频繁切换时php-fpm进程有时会滞后,因此当内存足够大时最好打开静态效果。数量也可以根据RAM / 30M获得。例如,可以将2GB的内存服务器设置为50;将2GB的内存服务器设置为50。可以将4GB内存设置为100,依此类推。高配置计算机选择静态,低配置计算机(节省内存)选择动态,高配置计算机无法充分利用内存资源和CPU资源,也无法及时响应瞬时高并发性。

2.如何处理和验证请求

PHP-FPM的过程管理方法与Nginx相似。在处理请求时,主进程不接受请求,然后将其转移到子进程,但是子进程“抢先”接受用户请求。从本质上讲,PHP-FPM多进程和Nginx多进程在主进程侦听同一个端口后,fork子进程达到了多个进程侦听同一个端口的目的。

Linux系统的所有进程IO操作都需要处理操作系统。换句话说,系统知道所有IO操作。这个过程就是我们通常所说的“系统调用”。我们可以从系统调用开始解决这个问题。要查看系统调用,可以使用Strace。

如何验证相对简单,我们可以采取两种方式:

3.为什么不在PHP-FPM下建立代码连接池

首先,在PHP-FPM模式下,请求的生命周期注定只能是一次。换句话说,从FPM请求到请求,PHP脚本解析,到FPM的Zend虚拟机分配执行资源,然后到最终处理结束,PHP-FPM将回收该请求的所有资源。

第一种方法是使开发人员不必关心资源的回收,因此您可能不必关心关闭网络,关闭文件描述符等等。第二个是减少内存溢出。

在这种模式下,如果实现连接池,则也意味着请求已结束,连接池消失,并且您做了无用的工作。

“无味” PConnect(永久链接)。持久链接表示未释放该链接。但是问题在于PHP-FPM是一种多进程模式,并且持久链接存在于该进程中。这意味着,如果一台计算机具有300个FPM进程,则将立即初始化300个持久性链接。如果由于业务活动的需要而急速扩展了计算机,则业务的连接数很可能会直接满。

4.如何优化性能

首先,我们应该考虑性能不佳的可能原因。如果应用程序的性能很差,我们倾向于从两个方面进行分析,一个是IO性能,另一个是计算性能。

就IO而言,由于很难在PHP-FPM模式下进行连接池,因此高并发服务下的网络处理将具有缺点。请注意,我在这里所说的是在PHP-FPM模式下进行的,您仍然可以在CLI模式下自行进行连接池化。但是此连接池仅限于CLI模式下的单个进程,并且该模式不能用于处理网络请求(例如HTTP请求)。由于PHP默认为单进程模式,因此FPM和CLI是默认的单进程。即使CLI可以用作连接池,但执行链接保持活动并不方便(无法同时进行心跳检测)。

就计算性能而言,尽管PHP是用C编写的,但是如果它纯粹是关于计算性能的,那是很好的。但是问题是,PHP处理请求时,必须解析PHP脚本,将PHP代码转换为Opcode,然后使用Zend虚拟机执行Opcode。处理结束并且资源被释放。经历这样的过程是导致PHP计算性能下降的最大原因之一。

如何优化:

关于设计合格的Logger组件,我们需要注意以下几点:

①每个请求仅执行一次日志写入操作。每次有人调用您的函数时,请勿执行类似于file_put_contents的操作。

②兼容各种相似的错误。换句话说,即使发生PHP致命错误,您也必须能够在众所周知的错误之前记录日志。可以在PHP类的destructor方法的帮助下完成此实现。您也可以使用更好的register_shutdown_function来注册一个钩子。当PHP请求结束时,请回调此挂钩以完成最终的日志操作。

5.为什么YAC无法通过CLI模式共享内存

我们知道在PHP扩展开发中要执行的第一个宏是PHP_MINIT_FUNCTION。 PHP-FPM进程启动时,YAC扩展需要初始化一块共享内存,以供每个进程共享和使用。因此,实现共享的关键是拥有与所有进程相同的标识符。

YAC扩展的初始化过程为:

让我们检查一下create_segments的具体实现:

在这里插入图片描述

上面已经做了一些注释。最重要的是打开shared_segment_name,这是打开共享内存所需的系统ID。此值包含进程ID。即,PHP-FPM的主进程ID。具有相同的共享内存标识ID是PHP-FPM模型中所有进程之间进行通信的秘密。而且,如果我们想使用yac扩展名通过PHP脚本读取此共享内存,我们将执行以下操作:

在CLI模式下,不可能在PHP-FPM模式下获取共享内存数据集。因为在CLI模式下执行的PHP脚本和进程ID与PHP-FPM模式下的进程ID完全不同。

在以下文章中,我们将寻找机会讨论进程间通信和基于共享内存的通信。总之,如果多个进程要共享内存通信,则必须从头开始协调唯一的ID。在多个进程之间必须知道此ID。 PHP-FPM是一个多进程,主进程派生子进程,并且子进程自然知道此唯一ID是什么(因为Linux进程派生了整个进程的堆栈内存)。但是,以这种方式执行php a.php实际上是一个完全独立的过程,与PHP-FPM无关。对于这样的过程,不可能知道PHP-FPM过程中的唯一ID是什么。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-363949-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...