gpt4 book ai didi

php - 如何管理 php 中的并发问题?

转载 作者:搜寻专家 更新时间:2023-10-31 20:42:21 26 4
gpt4 key购买 nike

方法 processReport 可以用相同的参数并行调用。但是,如果两个进程同时使用相同的 $reportId 调用 processReport,则处理应该只进行一次。为了解决这个并发问题,我创建了辅助方法 isLockedlockunlocklock 为 $reportId 创建临时文件。 isLocked 检查临时文件是否存在。如果文件存在,则不应进行处理。但问题是两个并行进程同时使用相同的 $reportId 调用 processReport 有时这种策略不起作用并且处理完成两次(这显然是因为使用的文件系统太慢了).由于进程不共享内存,我不知道如何解决这个并发问题。有什么办法可以避免处理相同的 $reportId 两次?

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);
}

最佳答案

这里有几种“模拟”锁的可能性

  1. flock - 你可以获取文件的独占锁,这样其他 php 进程就会等待
  2. Memcached::cas - 基于内存缓存的锁,你需要组织cas循环
  3. sem_acquire - 如上所述,基于信号量的锁
  4. Shared Memory - php 有共享内存模块
  5. Same session id - 您可以使用相同的 session ID,因为一次每个 session 只允许一个请求

关于php - 如何管理 php 中的并发问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19279077/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com