PHP CPU和内存使用

PHP CPU和内存使用,php,laravel,memory,cpu,Php,Laravel,Memory,Cpu,我正在学习PHP和Laravel。我工作的公司有一个纯PHP内置的web应用程序。我注意到,当从一个占用大量CPU和内存的大型CSV文件执行数据库更新时,web应用程序几乎无法完成其他任何操作。例如,用一些无关紧要的东西更新某人的帐户,而不是CPU和内存密集型的东西。基本上,在系统完成前,先完成前一步。查看Linux服务器上的TOP,可以发现CPU使用率高达99%,内存使用率相当高 无论如何,这并不是一个像企业一样的系统,只是一些用户用来管理另一个用Python框架编写的web应用程序的用户,客

我正在学习PHP和Laravel。我工作的公司有一个纯PHP内置的web应用程序。我注意到,当从一个占用大量CPU和内存的大型CSV文件执行数据库更新时,web应用程序几乎无法完成其他任何操作。例如,用一些无关紧要的东西更新某人的帐户,而不是CPU和内存密集型的东西。基本上,在系统完成前,先完成前一步。查看Linux服务器上的
TOP
,可以发现CPU使用率高达99%,内存使用率相当高

无论如何,这并不是一个像企业一样的系统,只是一些用户用来管理另一个用Python框架编写的web应用程序的用户,客户端使用这个应用程序。但这让我想到,对于基于PHP的企业系统,应该采用什么方法

显然,在完成之前,不能让一个用户执行密集的任务来构建系统。我想现实世界中有很多例子,PHP正在处理非常复杂的内存密集型任务,其他用户看不到


编辑:当我说“构建系统”时,我指的是服务器本身,这样管理PHP web应用程序和客户端Python web应用程序都不会响应请求。

在企业系统中,首先要处理的是冗余。一切都必须是多余的。对于基于PHP的应用程序,设置是至关重要的

如果我们谈论的是一个网站,以下是步骤

  • DNS已更新,因此它可以解析多个IP。这样一来,将哪个IP返回到浏览器或者DNS池中的某个服务器是否首先死亡都无关紧要。亚马逊的53号公路是我们使用的。这太棒了

  • 接下来是web服务器。当一个IP被“命中”时,请求会到达一个web服务器。我们使用
    nginx
    (因为
    nginx
    是——你猜到了——棒极了)。由于DNS池中有多个IP地址,因此有多个web服务器可用。同样,哪个web服务器将处理客户机的请求是无关紧要的——冗余是为了获胜

  • nginx
    提供静态内容,或者在满足规则的情况下将请求传递给PHP。我们使用
    phpfpm
    。每个
    nginx
    服务器都将HTTP请求代理给
    php fpm
    节点集群。在常规语言中,它在为PHP服务的计算机集群中选择另一台计算机。对于win来说,哪个PHP节点将处理请求冗余是无关紧要的

  • PHP现在做了一些工作,连接到数据库,然后——你猜到了——它“说话”到一个数据库集群。数据库是同步的,有关于这个主题的整本书,所以我将不详细介绍。同样,哪一个数据库获得win的查询冗余并不重要(实际上有很多方法可以解决这个问题)

  • 数据库服务器针对其所做的工作类型进行了优化,这意味着它们针对读取或写入进行了优化。数据库或任何类型的存储解决方案都不是无限的黑洞,您可以这样填充它。你必须仔细选择服务器将要做什么-它会写吗?它会用于阅读吗?它能写多少字?它能读多少遍?工作量增加的计划是什么?基本上,您需要优化数据库服务器-您肯定不能使用默认的MySQL配置。如果您有可能使数据库负担过重的大量工作负载,那么您可以使用一种排队机制,它能够在一个事务中整理多个插入并刷新它们-该方法利用硬盘的带宽,并将其用于I/O(基本上,这意味着它很好,工作速度很快)

好了,给你。这是一个简短的概述,介绍如何在PHP中实现企业级。每件作品都应该是冗余的、水平可伸缩的,并且针对它所做的工作类型进行优化


你肯定不希望你的应用程序挂起或在有人搞错某件事时变得不可用。

我敢打赌,你已经为长时间运行的请求打开了一个会话,正在进行数据库插入,这会阻止后续请求打开会话。您需要做的是:

<?php
session_start();

/* pre-game stuff that depends on $_SESSION */

session_write_close();

/* long-running stuff that doesn't need to update $_SESSION */

高要求的流程不应在web请求上执行

例如,您应该使用队列。
这样,您就可以允许文件上传并创建一个队列进程来提供服务,然后请求就完成了,在服务器上启动该进程后不久,用户就收到了请求

您可以考虑配置具有低CPU优先级的队列,或者可以在数据处理之间添加休眠时间,允许CPU服务于其他进程。 或者,您可以在上载文件后记录该文件,并将控制台作业配置为每分钟检查是否有待处理的挂起数据,然后处理一个批,并允许下一批在下一分钟检查时处理,使当前行在某处处理

但是,再次尝试避免在web请求上执行那些冗长繁重的过程,使用web请求获取信息,然后单独触发该过程


Laravel非常支持框架中的控制台作业或队列。

关于CSV文件有多大?几十兆字节..千兆字节?列的数据类型是什么?只需添加一个大的数据列表,它应该是快速的。您是否让SQL执行任何逻辑或简单的插入?我们需要查看代码才能知道为什么需要这么长时间。我目前使用的代码大约是17MB,但SQL正在检查表中是否已经存在行,以及是否添加行。我没有写它,但在我看来,这个表应该被删除,然后创建一个新的表。看起来他们几乎制造了所有的
VARCHAR(32)
。。。和