首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP CPU和内存使用情况

PHP CPU和内存使用情况
EN

Stack Overflow用户
提问于 2016-09-09 22:59:58
回答 3查看 3.2K关注 0票数 3

我正在学习PHP和Laravel。我工作的公司有一个用纯PHP构建的web应用程序。我注意到,当执行诸如从CPU和内存密集型的大型CSV文件执行数据库更新时,web应用程序几乎什么也做不了。例如,用一些无关紧要的内容更新某人的帐户,而根本不需要CPU和内存。基本上,以前的砖块系统,直到它完成。查看Linux上的TOP,可以看到CPU使用率高达99%,内存使用率相当高。

不管怎么说,这并不是一个像系统这样的企业,只是一些用户用来管理另一个web应用程序的用户,该应用程序是用Python框架编写的,客户可以使用它。但是,这让我想到了基于PHP的企业系统的方法是什么?

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

编辑:当我说“砌筑系统”时,我指的是服务器本身,因此管理PHP web应用程序和客户机Python应用程序实际上都不会响应请求。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-10 00:43:39

我敢打赌,您已经为长时间运行的请求提供了一个开放会话,用于执行数据库插入,从而阻止后续请求打开会话。你需要做的是:

代码语言:javascript
复制
<?php
session_start();

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

session_write_close();

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

或者更好的是,如果可能的话,跳过打开此任务的会话。

增编:

  1. 不管是谁创建了956列,只有varchar的DB模式。
  2. 如果插入速度这么慢,我敢打赌,有人已经走了,并且添加了太多的索引。
  3. 如果您运行的是最便宜的、共享的CPU和公共云实例,那么您很可能耗尽了所有的CPU共享。我只是通过将一个大文件写入一个快速磁盘来修改一个GCE微实例的CPU。
票数 2
EN

Stack Overflow用户

发布于 2016-09-09 23:24:14

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

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

  • DNS是更新的,因此它解决了多个IP。这样,哪个IP返回到浏览器,或者DNS池中的一个服务器首先死掉,都是无关紧要的。亚马逊的53号公路是我们使用的东西。而且太棒了。
  • 下一个是web服务器。当IP被“命中”时,请求就会发送到web服务器。我们使用nginx (因为nginx是--你猜的--棒极了)。由于DNS池中有多个IP地址,因此有多个可用的web服务器。同样,哪个web服务器将处理客户的请求
  • nginx要么提供静态内容,要么在满足规则的情况下将请求传递给PHP。我们使用php-fpm。每个nginx服务器都将HTTP请求代理到一个php-fpm节点集群。在常规语言中,它在计算机集群中选择了另一台为PHP服务的计算机。哪一个PHP节点将处理请求-冗余的胜利是无关紧要的。
  • PHP现在做了一些工作,连接到数据库,并且--您猜--它对一组数据库“说话”。数据库是同步的,有关于这个主题的整本书,所以我不想详细讨论。同样,与哪个db获得查询无关-- win的冗余(实际上有很多种方法来处理这个问题)。
  • 数据库服务器是优化的,用于它们所做的工作类型--这意味着它们是为读写而优化的。一个数据库或任何一种存储解决方案都不是无限黑洞,你可以这样填写。您必须仔细选择服务器将做什么-它会写吗?它会被用来阅读吗?它能写多少封信?它能读几个字?工作量增加的计划是什么?基本上,您需要优化数据库服务器--肯定不能使用默认的MySQL配置。如果您有可能覆盖db的大量工作负载,则使用一种排队机制,它能够在单个事务中整理多个插入并刷新它们--该方法利用硬盘的带宽并将其交换为I/O (基本上,这意味着它很好,而且工作速度很快)。

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

你肯定不想让你的应用程序挂起,或者在有人搞砸了的时候就无法使用。

票数 3
EN

Stack Overflow用户

发布于 2016-09-10 21:48:04

对于web请求,不应该进行高要求的处理。

例如,您应该使用队列。

这样,您就允许文件上传并创建一个队列进程来提供服务,然后请求就完成了,在进程在服务器上启动后的一分钟内,但是用户得到了请求。

然后可以考虑配置具有较低CPU优先级的队列,或者在数据处理之间添加睡眠时间,从而允许CPU为其他进程服务。

或者,您可以在上传文件后记录该文件,并配置一个控制台作业,以便在有待处理的数据时每分钟检查一次,然后处理一个批处理,并允许下一个批处理在下一分钟检查中处理,将当前行保持在某个位置。

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

Laravel对框架中的控制台作业或队列都有很好的支持。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39420801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档