processReport
可以使用相同的参数并行调用方法。processReport
但是如果两个进程同时使用相同的 $reportId调用,则处理应该只进行一次。为了解决这个并发问题,我创建了辅助方法isLocked
和. 为 $reportId 创建临时文件。检查临时文件是否存在。如果文件存在,则不应进行处理。但问题是两个并行进程同时调用相同的 $reportId 有时这种策略不起作用并且处理完成了两次(这显然是因为使用太慢的文件系统而发生的)。由于进程不共享内存,我不知道如何解决这个并发问题。有什么方法可以避免两次处理相同的 $reportId 吗?lock
unlock
lock
isLocked
processReport
private function getLockFileName($reportId) {
return sprintf('%s/%s.lock', sys_get_temp_dir(), $reportId);
}
private function isLocked($reportId) {
return file_exists($this->getLockFileName($reportId));
}
private function lock($reportId) {
touch($this->getLockFileName($reportId));
}
private function unlock($reportId) {
unlink($this->getLockFileName($reportId));
}
public function processReport($reportId) {
if ($this->isLocked($reportId)) return;
$this->lock($reportId);
// processing should be done only once for the same $reportId
$this->unlock($reportId);
}