PHP proc_nice是否将Apache线程置于新的优先级设置?

时间:2009-12-04 20:22:22

标签: php apache apache2 nice renice

执行proc_nice()时,它实际上是不是Apache的线程?

如果是这样,并且当前用户(非超级用户)无法重新设置其原始优先级,那么在Apache 2.0x服务器上杀死相应的Apache线程(apache_child_terminate)?

问题在于我试图限制允许用户运行Ad-Hack查询的应用程序的影响。查询可能很大,对数据的结果转换需要大量的内存和CPU。

我已经重新编写了基于流的流程 - 帮助消耗内存,但我还希望流程运行的优先级较低。但是我不能将Apache线程置于低优先级,因为我们在同一个盒子上运行了很多高优先级的Web服务。

TIA

1 个答案:

答案 0 :(得分:2)

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

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


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

  • 它允许用户立即获得一些反馈:“服务器已收到您的请求,并将尽快处理”
  • 它并没有让Apaches的流程长期“正常工作”:重要的事情是由其他流程完成的
  • 如果有一天,你需要这么大的处理能力,一台服务器就不够了,这种系统将更容易扩展:只需添加一个从同一个FIFO队列中选择的第二台服务器
  • 如果您的服务器真的太负载,您可以停止从队列中处理,至少在一段时间内,因此负载可以变得更好 - 例如,如果您的关键Web服务被大量使用,这将非常有用在特定的时间范围内。


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

  

Gearman提供了一个通用的应用程序   将工作分配给其他人的框架   机器或过程更好   适合做这项工作。
它允许你   要并行工作,加载   平衡处理,并打电话   语言之间的功能。
它可以   用于各种应用,   从高可用性网站到   数据库复制的传输   事件。
换句话说,就是这个   神经系统如何分配   处理沟通。