Php 当存在';里面没什么?

Php 当存在';里面没什么?,php,mysql,queue,job-queue,Php,Mysql,Queue,Job Queue,我有一个人们上传到我的网站的照片队列,因为在高峰时间,一个小时可以上传10000张或更多的照片 我的php脚本每分钟都会通过cron调用一次,并使用where子句FLOOR(photoId/100)%$digit,从数据库中拾取照片,其中$digit=$counter%10 因此,在第一分钟处理ID与xx0xx匹配的照片,然后是下一分钟处理ID为xxxx1x、xxxx2xx的照片,等等。我限制查询0,1000并让它在超时之前尽可能多地执行查询 我有一个6核HT xeon,通常让这些进程运行6分钟

我有一个人们上传到我的网站的照片队列,因为在高峰时间,一个小时可以上传10000张或更多的照片

我的php脚本每分钟都会通过cron调用一次,并使用where子句
FLOOR(photoId/100)%$digit
,从数据库中拾取照片,其中
$digit=$counter%10

因此,在第一分钟处理ID与xx0xx匹配的照片,然后是下一分钟处理ID为xxxx1x、xxxx2xx的照片,等等。我
限制查询0,1000
并让它在超时之前尽可能多地执行查询

我有一个6核HT xeon,通常让这些进程运行6分钟

当我启动进程时,我通过
ionice
nice
运行它,如果服务器的1分钟平均负载高于6,我将中止。如果没有,我将递增
$计数器
并继续

这似乎是一个相当好的平衡,既能完成大量工作,又不会太多地影响网站性能(所有内容都在同一台专用服务器上)

为什么我要做
FLOOR(photoId/100)
而不仅仅是
photoId
?人们上传了大量的批量照片(例如,一系列快速的照片),在网站上,这些照片同时出现会更好。这并不总是能够实现,但它将非常接近,并且比仅仅修改photoId要好得多

当队列很忙并且有很多人在上传时,这种方法非常有效

但在一个安静的时间,只有一个摄影师上传了几十张照片,他们可能会“不走运”,让排队的人花10分钟来处理他们的ID

缓解这种情况的最佳方法是什么?我现在排队的想法都是垃圾吗?我应该做些更好的事情吗

我可以选择前1000个没有标记为“正在处理”的ID,而不是整个%技术

然后我在数据库中将它们标记为“正在处理”,以便下一个进程不会选择它们。尽可能多地做,然后取消标记其余的,以便再次拾取。但是如果队列中少于1000个进程,那么接下来的5个进程将无法选择任何一个进程来提供帮助,直到初始进程超时

请给我一些建议


谢谢你

有时需要权衡(有些场景效果很好,有些则不行),你需要为“最佳”情况编写代码。不幸的是,在不知道处理涉及到什么以及任何代码的情况下,这是一个太宽泛的问题(IMHO)。仅调整大小和应用水印等平均每张照片需要约2秒,但我可以每小时运行8000个多进程。