그림과 같이 두 개의 스크립트를 동시에 실행하면 왜 두 번째 스크립트가 파일에 바로 쓸 수 있나요? 첫 번째가 아닙니다. 스크립트가 잠겨 있습니까?
그림과 같이 두 스크립트를 동시에 실행하면 두 번째 스크립트가 파일에 바로 쓸 수 있는 이유는 무엇인가요? 첫 번째가 아닙니다. 스크립트가 잠겨 있습니까?
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>