我一直没有成功找到这个问题的答案。希望这里有人可以提供帮助。
我有一个 PHP 脚本(具体来说是一个 WordPress 模板),当用户点击它时,它会自动导入和处理图像。问题是图像处理占用了大量内存,特别是如果多个用户同时访问模板并启动图像处理。我的服务器因此多次崩溃。
我对此的解决方案是,如果图像处理功能已经在运行,则不执行它。在函数开始运行之前,我会检查一个名为 image_import_running 的数据库条目,看看它是否设置为 false。如果是,则该函数运行。该函数所做的第一件事就是将 image_import_running 设置为 true。然后,在全部完成后,我将其设置回 false。
它工作得很好——理论上。从那以后网站就没有崩溃过,我可以告诉你。但它有两个主要问题:
如果用户在加载页面时关闭页面,则脚本永远不会完成图像处理,因此永远不会将 image_import_running 设置回 false。在手动设置为 false 之前,模板将永远不会再次处理图像。
如果脚本在处理图像时超时——如果队列中有很多图像,这很有可能——你会遇到与第 1 号基本相同的问题:脚本永远不会到达将 image_import_running 设置回的点错误的。
为了处理第一个问题(我意识到的两个问题中的第一个),我添加ignore_user_abort(true)
到脚本中。它奏效了吗?我不知道,因为 2 号仍然是个问题。这就是我难住的地方。
如果我可以询问服务器脚本是否正在运行,我可以这样做:
if($import_running && $script_not_running) {
$import_running = false;
}
但是如何设置该$script_not_running
变量?打败我。
我已经与您分享了整个故事,以防您有其他出色的解决方案。