2

我有 php 脚本,它使用 php exec 函数调用另一个脚本。被调用的脚本执行批处理工作,即更新交易状态,通知客户(将电子邮件放入单独运行的邮件队列)。因此,由于一个非常大的表(500000 行),这将需要 20-30 分钟,现在我在我的桌面 windows 机器下运行它,php 使用高达 50% 的 CPU,mysql 20% 的 CPU。这是正常的做法吗?如果我将此脚本放在共享主机中怎么办?我会遇到麻烦吗?它不会破坏共享主机规则吗?用户可以随时启动批处理过程(通常每月一次或更频繁)。

对此有什么建议吗?

谢谢阅读。

4

6 回答 6

4

几乎可以肯定,但这取决于共享主机可用的 CPU 功率(老实说,可能与您的桌面一样多),在这种情况下,您会看到自己在短时间内启动。共享主机往往是堆栈高度的事务,您可以在其中托管 100 多个站点。

你可以选择一个虚拟主机,在那里他们会给你自由做任何你喜欢的事情,但是你可能会发现你被限制的 CPU 能力是有限的,可能对你来说太有限了。虚拟主机倾向于将主机拆分为几个虚拟客人,有时少至 4 个,但更常见的是(尤其是对于更便宜的计划)一直到 64 个。

然后,您的第三个选择是购买一个完全专用的服务器,您自己拥有一个完整的服务器,并且可以随心所欲地使用它。如果您想要大量服务器硬件(因为它使用大量非常昂贵的电力)或大量带宽,这些往往会很昂贵。

显然,这 3 个选项会增加成本,在虚拟主机领域,您确实得到了您所支付的费用。

您可能想找到一个虚拟主机论坛并在那里四处询问 - 请务必指定 CPU 要求以及可能需要多长时间。如果您同意他们的时间(不干扰备份,或者如果他们的资源时间较短,如网站往往在世界各地的每个时区都可以访问)

于 2009-05-10T13:53:27.693 回答
2

通常共享主机不喜欢你占用他们宝贵的 CPU 能力,所以我不建议你在其中做任何非常密集的事情。如果您正在寻找执行批处理作业,您应该考虑投资一台专用服务器,一般来说它也很有用。

于 2009-05-10T13:50:12.387 回答
2

我正在使用 Facebook 应用程序(php,350,000 个通知)做类似的事情。我的托管公司确实收到了 1 个关于 CPU 使用情况的“警报”,但该“警报”来自销售,提供与我合作进行升级。

我将批处理脚本更改为一次使用更少的 CPU,主要是通过产生更少的同时进程 (10) 并在几个位置放置一个 sleep(10) 命令。sleep 命令是为了让 CPU 回落到“正常”水平,所以会出现 CPU 峰值,而不是持续使用。

在共享主机上,预计会出现 CPU 峰值。但是持续的高 CPU 级别会向托管公司发出警报(如果它们有任何好处)。您希望避免在 50% 或任何长时间运行任何高级别 CPU。

如果脚本是否需要额外的几分钟并不重要,请在您的代码中放置一些等待状态(睡眠)。这对同一台机器上的其他用户也是公平的。

于 2009-05-10T14:23:22.367 回答
1

运行共享主机的服务器通常比普通的家用计算机快得多,因此它可能不会像在本地计算机上运行那样长。我认为如果您每天发送 500,000 封电子邮件,警钟就会开始响起,但如果您有一个合理的主机在短时间内使用那么多 CPU,这应该不是什么大问题。

你总是可以先和他们谈谈,我相信他们会解决的。

于 2009-05-10T13:47:55.460 回答
1

简而言之,在共享服务器上占用资源是不合适的。

基本上,如果您为其他进程腾出足够的时间,那并不是一件坏事。但是,像您正在讨论的那样增加 CPU 是一件坏事,并且对系统的其他用户不利。你应该在你的主循环中有一个 yield 机制(usleep(100)例如),并使用nice像 19 这样的大数字运行命令。

此外,听起来您正在批处理脚本中进行单独的插入/更新/等调用。使用 mysql,尽可能进行批量插入是一种更好的做法(与单个插入相比非常快)。但是,取决于您如何执行此操作,这可能是 RAM 与 CPU 时间的权衡(例如,如果您将所有插入值存储在一个字符串中,直到它们准备好使用单个插入语句插入,那么这可能会增加最多很多 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 = 慢/cpu hog,但 99% 的时间它是编程或数据库设计问题。他们应该能够轻松处理那么多记录。

于 2011-10-14T02:29:34.900 回答
0

我建议使用Amazon EC2Mosso 的云服务器(由 Rackspace 拥有)之类的服务。这些虚拟服务器具有合理的小时费率和出色的 API。您无需最低每月承诺即可获得专用服务器的强大功能。例如,您可以使用 EC2 配置虚拟服务器,然后让您的常规 Web 服务器运行每周/每月的 cron 作业以启动该 EC2 实例,运行您的作业,然后关闭 EC2 实例。

于 2009-05-12T05:28:40.103 回答