首頁  >  文章  >  後端開發  >  file - php 檔案加鎖

file - php 檔案加鎖

WBOY
WBOY原創
2016-08-04 09:22:131174瀏覽

file - php 檔案加鎖
file - php 檔案加鎖
如圖,我同時運行兩個腳本時,為什麼第二個腳本可以立即寫入文件呢,文件不是在第一個腳本中被加鎖了嗎

回覆內容:

file - php 檔案加鎖
file - 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