我可以想到两件相对简单的事情,你可以在不放弃 PHP 的情况下做(尽管我不得不提到 PHP 没有太多可推荐的,你可能会更好地使用 Python/Django、Python/Flask 或 Ruby/Rails ):
一是您可以切换到 Redis 来管理您的工作人员,而不是使用您的数据库。这样做的好处是 Redis 有一个发布/订阅系统,您可以在其中订阅信号,同时保持连接打开。这意味着如果连接打开,例如来自 Web 进程,您将立即收到更改通知,而无需轮询。
二是您可以切换到使用 ajax,这样您就不会在等待时阻止页面的加载。立即加载您的页面,然后使用 javascript 访问单独的 PHP 页面以定期检查您的工作状态的更新,然后在结果可用时使用 javascript 在页面上呈现结果。
更好的是,使用 ajax 长轮询。立即呈现您的页面,然后使用 javascript 发回请求。然后当您的 php 页面收到第二个请求时,向 Redis 注册订阅,然后手动检查更新(如果您不使用 Redis,只需检查更新)。如果没有更新,则等待订阅收到消息,或等待 30 秒,以两者为准。(老实说,我从来没有在 PHP 中完成过 Redis 订阅,所以我不确定如何实现它——如果你不能轻松地做到这一点,那就每隔几秒钟轮询一次。)如果 30 秒计时器到期,返回 json 表示没有结果并立即重试 javascript。如果您确实在该时间内收到了结果,请返回结果并让 javascript 呈现它们。