PHP proc_nice 是不是让 Apache 线程处于新的优先级设置?

Posted

技术标签:

【中文标题】PHP proc_nice 是不是让 Apache 线程处于新的优先级设置?【英文标题】:Does PHP proc_nice leave Apache threads at new priority setting?PHP proc_nice 是否让 Apache 线程处于新的优先级设置? 【发布时间】:2009-12-04 20:22:21 【问题描述】:

执行 proc_nice() 时,它真的是 Apache 的线程吗?

如果是这样,并且如果当前用户(非超级用户)无法更改其原始优先级,是否会在 Apache 2.0x 服务器上终止适当的 Apache 线程 (apache_child_terminate)?

问题是我试图限制允许用户运行 Ad-Hack 查询的应用程序的影响。查询可能非常庞大,因此对数据的转换需要大量内存和 CPU。

我已经重写了流程,使其更加基于流 - 有助于减少内存消耗,但我也希望流程运行较低的优先级。但是我不能让 Apache 线程处于低优先级,因为我们有很多高优先级的 Web 服务在同一个机器上运行。

TIA

【问题讨论】:

【参考方案1】:

在这种情况下,一个解决方案通常是不在 Apache 进程中做那种繁重的工作,但是:

运行一个外部 php 进程,例如使用 shell_exec 之类的东西 -- 如果您必须在同步模式下工作(即,如果您无法在几分钟后执行任务) 将任务推送到先进先出系统,并立即向用户返回一条消息说“您的任务将很快被处理” 并有一些其他进程(例如,每分钟通过 crontab 启动)检查 FIFO 队列 并在队列中有东西时进行处理 该进程本身可以在低优先级模式下运行。

尽可能多地,特别是如果繁重的计算需要一些时间,我会选择第二种解决方案:

它可以让用户立即得到一些反馈:“服务器已收到您的请求,将尽快处理” 它不会让 Apache 的进程长时间“工作”:繁重的工作由其他进程完成 如果有一天,您需要如此多的处理能力,以至于一台服务器已经不够用,这种系统将更容易扩展:只需添加第二台服务器,该服务器将从同一个 FIFO 队列中挑选李> 如果您的服务器确实负载过重,您可以停止队列中的处理,至少一段时间,这样负载会变得更好——例如,如果您的关键 Web 服务被大量使用,这可能很有用在特定的时间范围内。

另一个(看起来不错,但我还没有尝试过) 解决方案是使用某种工具,例如Gearman:

Gearman 提供了一个通用应用程序 将工作外包给其他人的框架 更好的机器或流程 适合做这项工作。 它可以让你 并行工作,加载 余额处理,并调用 语言之间的功能。 可以 用于各种应用, 从高可用性网站到 数据库复制的传输 事件。 换句话说,它是 神经系统如何分布 处理通信。

【讨论】:

感谢您提供的详细信息。如您所述,我已经将该系统拆分为请求/队列系统(某些查询可能需要数小时才能完成),尽管它是一个可以完成工作的 Web 服务(因此仍然涉及 Apache)。我与一位同事讨论了这个问题,他还建议分派一个 CLI 工作人员来完成可以“很好”的实际工作。我会看看 Gearman,但同时我会考虑换成 CLI 工作者。 不客气 :-) ;;如果您的任务花费了那么长时间,那么似乎真的需要一个与 Apache 分开的 CLI 应用程序:否则,您将终有一天没有可用的 Apache 进程来提供页面...不过,玩得开心!

以上是关于PHP proc_nice 是不是让 Apache 线程处于新的优先级设置?的主要内容,如果未能解决你的问题,请参考以下文章

apache 如何部署 php

如何让apache和nodejs共用80端口

试图让 PHP-FPM 工作 (Apache 2.4.33)

如何让 Apache 2.2 加载 *.php?

让Apache和Nginx支持php文件解析

如何让多个PHP版本在同一个Apache服务下并存