我正在开发一个将接收大量流量的 PHP Web 界面。一些插入/更新请求将包含图像,这些图像必须调整为一些常见的大小,以加快它们的进一步检索。
一种方法可能是在服务器上设置一些异步队列。例如。在数据库中设置一个带有任务队列的表,该队列将由 PHP 请求填充,并让服务器上的其他一些进程监视该表并处理任何等待的任务。你会怎么做?对于那个长期运行的过程来说,合适的环境是什么?Java,或者更轻的东西会做?
我正在开发一个将接收大量流量的 PHP Web 界面。一些插入/更新请求将包含图像,这些图像必须调整为一些常见的大小,以加快它们的进一步检索。
一种方法可能是在服务器上设置一些异步队列。例如。在数据库中设置一个带有任务队列的表,该队列将由 PHP 请求填充,并让服务器上的其他一些进程监视该表并处理任何等待的任务。你会怎么做?对于那个长期运行的过程来说,合适的环境是什么?Java,或者更轻的东西会做?
如果您正在做的事情真的很大,那么您正在寻找的是beantalkd 之类的东西。它是一个分布式工作队列处理器。您只需将工作放在队列中,然后忘记它。
当然,您需要在另一端读取队列并处理工作。有多种方法可以做到这一点。
最简单的可能是有一个足够频繁地运行以读取工作队列并处理请求的 cron 作业。或者,您可以使用某种由工作可用唤醒的持久守护进程。
这种方法的优点是您可以根据需要完成多少工作来调整工作人员的数量,并且 beanstalkd 处理分布式处理(从某种意义上说,侦听器可以在不同的机器上)。
您可以设置一个 cron 任务来检查队列表。处理队列中等待的动作的脚本可以用 php 编写,因此您不必更改实现语言。
您可能希望创建一个“休眠”一段时间的守护程序,然后检查数据库中要处理的项目。一旦找到要处理的项目,它就会处理它们,然后在完成后立即再次检查,如果没有,则休眠。您可以使用任何语言创建守护程序,包括 PHP。
或者,您可以让 PHP 执行一个脚本并继续。为了使 PHP 在继续之前不会等待脚本完成,请在后台执行它。
exec("nohup /usr/bin/php -f /path/to/script/script.php > /dev/null 2>&1 &");
尽管您必须小心这一点,因为您最终可能会在后台运行太多进程,因为没有排队。
我将 Perl 与 beanstalkd 结合用于长时间运行的进程。好消息是 Perl 的 Beanstalkd 客户端有一个阻塞的保留方法。这样,当无事可做时,它几乎不使用 CPU 时间。但是当它必须完成它的工作时,它会自动开始处理。非常有效率。
您可以使用IronWorker 之类的服务在后台进行图像处理并减轻服务器的负载。由于它是一项服务,因此您无需管理任何内容或设置任何其他内容,它会随着您的成长而扩展,因此如果您可以使用它制作一张图像,您可以零努力地扩展到数百万张图像。
这是一篇关于如何进行一堆图像处理转换的文章:
http://dev.iron.io/solutions/image-processing/
这些示例在 Ruby 中,但您可以很容易地用 PHP 做同样的事情。