>  기사  >  백엔드 개발  >  파일 - PHP 파일 잠금

파일 - PHP 파일 잠금

WBOY
WBOY원래의
2016-08-04 09:22:131218검색

파일 - PHP 파일 잠금
파일 - PHP 파일 잠금
그림과 같이 두 개의 스크립트를 동시에 실행하면 왜 두 번째 스크립트가 파일에 바로 쓸 수 있나요? 첫 번째가 아닙니다. 스크립트가 잠겨 있습니까?

답글 내용:

파일 - PHP 파일 잠금
파일 - PHP 파일 잠금
그림과 같이 두 스크립트를 동시에 실행하면 두 번째 스크립트가 파일에 바로 쓸 수 있는 이유는 무엇인가요? 첫 번째가 아닙니다. 스크립트가 잠겨 있습니까?

PHP 읽기 및 쓰기 파일이 잠겨 있습니다. 자세한 내용은 http://www.jb51.net/article/81246.htm을 참조하세요.

두 번째 fwrite는 이전에 전용 잠금 LOCK_EX를 적용하지 않고 실행되었으며, 당연히 작성됩니다.
두 fwrite 전에 반드시 LOCK_EX를 신청해야 잠금 효과를 얻을 수 있습니다.

<code>foo1.php:
<?php
header('Content-Type: text/plain; charset=utf-8');
if(file_exists('arr.php')) {
    $arr = require 'arr.php'; //先require后fopen
} else {
    file_put_contents('arr.php','<?php return array();');
}
$fp = fopen('arr.php', 'r+'); //读写方式打开,将文件指针指向文件头
if(flock($fp,LOCK_EX)) { //阻塞到获取排它锁
    $arr['name'] = __FILE__;
    ftruncate($fp, 0); //截断文件
    fwrite($fp,'<?php return '.var_export($arr, true).';');
    var_export($arr);
    fflush($fp); //在释放锁之前刷新输出
    sleep(10); //睡眠10秒,在此期间访问foo2.php将被阻塞
    flock($fp, LOCK_UN); //释放锁定
}
fclose($fp);

foo2.php:
<?php
header('Content-Type: text/plain; charset=utf-8');
$arr = require 'arr.php';
$fp = fopen('arr.php', 'r+');
if(flock($fp,LOCK_EX)) {
    $arr['name'] = __FILE__;
    ftruncate($fp, 0);
    fwrite($fp,'<?php return '.var_export($arr, true).';');
    var_export($arr);
    fflush($fp);
    flock($fp, LOCK_UN);
}
fclose($fp);</code>
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.