PHP高并发下文件的读写

PHP高并发下文件的读写

最近做一个服务把日志文件写入文件中存储,如果是在访问量密集的高并发情况下会出现数据丢失的情况,这时候应该给文件加锁,代码如下:

    if($fp = fopen($fileName, 'a')) {
     $startTime = microtime();
     do {
            $canWrite = flock($fp, LOCK_EX);
                        if(!$canWrite) 
                        {
                                    usleep(round(rand(0, 100)*1000));
                        }

    } while ((!$canWrite) && ((microtime()-$startTime) < 1000));

    if ($canWrite) 
        {
      fwrite($fp, $dataToSave);
    }
    fclose($fp);
  }

这里加上时间条件是因为听说在PHP中,flock似乎工作的不是那么好!在多并发情况下,经常独占资源,不即时释放,或者是根本不释放,造成死锁,从而使服务器的cpu占用很高,甚至有时候会让服务器彻底死掉 当然对于日志这种不需要特别实时性的任务,放在消息队列里处理特别合适,推荐一个高性能的消息系统kafka,对于处理日志这种频繁的操作很合适。

猜你喜欢