从PHP请求中卸载繁重处理(如图像大小调整)的最佳方法

时间:2009-04-04 15:21:30

标签: php architecture scalability

我正在开发一个可以获得巨大流量的PHP Web界面。某些插入/更新请求将包含必须调整为一些常见大小的图像,以加快其进一步检索。

一种方法是在服务器上设置一些异步队列。例如。在数据库中设置一个表,其中包含一个将由PHP请求填充的任务队列,并让服务器上的其他进程监视该表并处理任何等待的任务。你会怎么做?这个长期运行过程的适当环境是什么? Java,或者更轻松的东西会做什么?

5 个答案:

答案 0 :(得分:14)

如果您所做的事情真的很高,那么您所寻找的就像beanstalkd。它是一个分布式工作队列处理器。你只是把一份工作放在队列上然后忘了它。

当然,你需要在另一端读取队列并处理工作。有多种方法可以做到这一点。

最简单的可能是拥有一个足够经常运行的cron作业来读取工作队列并处理请求。或者,您可以使用某种持久性守护程序进程,该进程可通过工作变为可用而被唤醒。

这种方法的优点是你可以根据需要完成多少工作来定制工人数量,并且beanstalkd处理分布式prorcessing(在列表可以在不同机器上的意义上)。

答案 1 :(得分:2)

您可以设置一个检查队列表的cron任务。处理在队列中等待的动作的脚本可以被写入例如在PHP中,所以你不必改变实现语言。

答案 2 :(得分:2)

您可能希望创建一个守护程序,该守护程序将“休眠”一段时间,然后检查数据库中是否有要处理的项目。一旦找到要处理的项目,它就会处理它们,然后在完成后立即再次检查,如果没有,则再进行休眠。 您可以使用任何语言创建守护进程,包括PHP。

或者,您可以让PHP执行脚本并继续。因此PHP不会在继续之前等待脚本完成,而是在后台执行它。

exec("nohup /usr/bin/php -f /path/to/script/script.php > /dev/null 2>&1 &");

虽然你必须要小心,因为你可能最终在后台运行了太多的进程,因为没有排队。

答案 3 :(得分:2)

我将perl与beanstalkd一起用于长时间运行的过程。好处是Perl的Beanstalkd客户端有一个阻塞保留方法。这样,当无事可做时,它几乎不使用CPU时间。但是当它必须完成它的工作时,它将自动开始处理。效率非常高。

答案 4 :(得分:1)

您可以使用IronWorker之类的服务在后台进行图像处理,并减轻服务器的负担。由于它是一项服务,你不需要管理任何东西或设置其他任何东西,随着你的成长,它将与你一起扩展,所以如果你可以用它做一个图像,你可以毫不费力地扩展到数百万的图像。

这是一篇关于如何进行一系列图像处理转换的文章:

http://dev.iron.io/solutions/image-processing/

Ruby中有这些例子,但你可以很容易地用PHP做同样的事情。

相关问题