我有php脚本,用php exec函数调用另一个脚本。被调用脚本执行批处理作业,即更新事务状态,通知客户(将电子邮件放入单独运行的邮件队列)。所以由于一个非常大的表(500000行)需要20-30分钟,现在我在我的桌面Windows机器下运行它,php使用高达50%的CPU,mysql 20%CPU。这是正常的做法吗?如果我把这个脚本放在共享主机中怎么办?我会遇到麻烦吗?它不会破坏共享托管规则?批处理过程可以由用户随时启动(通常每月一次或更频繁)。
对此有何建议?
感谢阅读。
答案 0 :(得分:4)
几乎可以肯定的是,它取决于共享主机可用的CPU功率(可能与您的桌面大致相同),在这种情况下,您会看到自己在短时间内启动。共享主机往往是堆栈高级事务,您可以在其中获得100个托管的站点。
你可以选择一个虚拟主机,在那里他们可以自由地做任何你喜欢的事情,但是你可能会发现你所限制的CPU功率有限,可能对你来说太有限了。虚拟主机倾向于在几个虚拟客户机之间拆分主机,有时只有4个,但更频繁(尤其是对于更便宜的计划)一直到64个。
然后你的第三个选择是去一个完全专用的服务器,你自己得到一个完整的服务器,并可以用它做你喜欢的。如果您需要大量服务器硬件(因为它使用了大量非常昂贵的电力)或大量带宽,这些往往会很昂贵。
显然,这3个选项的成本增加,在网站主办领域,你确实得到了你付出的代价。
您可能希望找到一个虚拟主机论坛并在那里询问 - 请务必指定CPU要求,以及可能需要多长时间。如果您同意与他们共度时间(不干扰备份,或者如果他们的资源时间较短,那么您可能会得到一些非常高兴您在“非工作时间”运行脚本的快乐网站往往在每个时区都可以在世界各地访问)
答案 1 :(得分:2)
一般情况下,共享主机不喜欢你占用宝贵的CPU能力,所以我不建议你做一些非常密集的事情。如果你想要执行批处理作业,你应该考虑投资一个专用的服务器,一般来说也是有用的。
答案 2 :(得分:2)
我正在使用Facebook应用程序(php,350,000通知)做类似的事情。我确实从我的托管公司获得了关于CPU使用率的“警报”,但是“警报”来自销售,提供与我一起升级。
我将批处理脚本更改为一次使用更少的CPU,主要是通过生成较少的同步进程(10)并将sleep(10)命令放在几个位置。 sleep命令允许CPU回退到“正常”级别,因此存在CPU峰值,而不是持续使用。
在共享主机上,预计会出现CPU峰值。但是,持续较高的CPU级别将导致向托管公司发出警报(如果它们有任何好处)。您希望避免在任何长时间内以50%或任何高级别运行CPU。
如果脚本需要多花几分钟并不重要,请在代码中放置一些等待状态(sleep)。这对同一台机器上的其他用户来说也是公平的。
答案 3 :(得分:1)
运行共享主机的服务器通常比普通家用计算机快得多,因此它可能不会像在本地计算机上运行那样长。我认为,如果你每天发送500,000封电子邮件,警报会开始响起,但如果你有一个合理的主机在短时间内使用那么多的CPU,那不应该是一个问题。
你可以先跟他们谈谈这件事,我相信他们会解决一些问题。
答案 4 :(得分:1)
简而言之,在共享服务器上占用资源是不合适的。
基本上,如果你有足够的时间来处理其他进程,那并不是件坏事。然而,就像你正在讨论的那样加入CPU是一件坏事,对系统的其他用户来说并不好。你应该在主循环中有一个yield机制(例如usleep(100)
)并运行一个高nice
的命令,如19。
此外,听起来您正在批处理脚本中执行单独的插入/更新/等调用。使用mysql,尽可能进行批量插入是一种更好的做法(与单个插入相比速度极快)。但是,根据您的操作方式,它可以在RAM中占用CPU时间(例如,如果将所有插入值存储在字符串中,直到准备插入单个insert语句,那么可能会添加高达很多RAM)。如果RAM存在问题,您始终可以构建一个临时SQL文件,然后在该过程结束时导入整个文件。
批量插入看起来像(对于具有两个varchar列的表):
INSERT INTO `mytable` VALUES ('Field 1-Row 1', 'Field 2-Row 1'), ('Field 1-Row 2', 'Field 2-Row 2');
这会在很短的时间内一次插入两行。
但话又说回来,基于你所描述的脚本的目的,你可能不会开始做很多插入。但也许您仍然可以将所有(或许多)数据库更新/插入/删除构建到最后调用的最终脚本中?
此外,如果您确定可以按正确顺序保持外键进行导入,则关闭外键检查也可以显着提高速度。
所有其他可能的建议都将基于代码和数据库架构的特定优化(优化循环,查找,索引等)。
我强烈暗示这里是你可以在共享主机中做这样的事情而不占用资源,但你的数据库结构,SQL语句和算法(循环等)必须是高度的优化。如果您这样做,额外的好处是您的流程也将非常快速地完成。有一个常见的错误概念,php + mysql = slow / cpu hog,但99%的时间是编程或数据库设计问题。他们应该能够轻松处理那么多记录。
答案 5 :(得分:0)
我建议使用Amazon EC2或Mosso's Cloud Servers(由Rackspace拥有)等服务。这些虚拟服务器具有合理的小时费率和出色的API。您无需每月最低承诺即可获得专用服务器的强大功能。例如,您可以使用EC2配置虚拟服务器,然后让常规Web服务器运行每周/每月cron作业以启动该EC2实例,运行您的作业,然后关闭EC2实例。