作为程序员一定要保持良好的睡眠,才能好编程

文件锁fopen及使用方法

发布时间:2018-09-17

在秒杀的情况下,问有几种方式不超卖



使用文件锁是否可以线性执行?


当文件加锁后,在打开文件时,


LOCK_EX (取得独占锁) 加锁后文件会显示什么? 答案:空


LOCK_SH (取得共享锁)加锁后文件会显示什么? 答案:显示正常字符,当在没有释放锁,去写文件会报错。

 

LOCK_UN 解锁


flock($fp,LOCK_EX);

 

文件死锁后,如果禁用掉所有进程,文件中的内容会丢失。

 


当在文件加锁后,我们去打开文件时,会显示空白,当程序释放资源锁以后,会立即显示内容。



注意事项:


加锁、解锁 是成对出现的,切记。




不要只加锁,不解锁,会造成程序访问死锁。




#问如何知道文件是否已经加锁? 可以采用这种方式


可以采用加锁前 生成一个本地文件 *.lock 判断文件是否存在,如果存在,说明文件正在加锁。


在每一次程序执行完毕后,删除这个文件。


stream_get_contents();



fgets($handle)


fread()


feof($handle) //判断是否到文件结尾



fopen 打开模式:


r 读写

w 写

a 追加

b 二进制

x 创建并以写入方式打开




每次进行文件的锁定,在执行多次请求的时候,是顺序执行的





fopen.php


$fp = fopen('./output.txt', 'rb');

//flock($fp, LOCK_EX);

var_dump(flock($fp, LOCK_SH));

sleep(10);
flock($fp, LOCK_UN);
exit;

$content = '';
while (!feof($fp)) {
	$content .= fread($fp, 1024);
}
printf("\n %s", '锁了...');
flock($fp, LOCK_UN);
fclose($fp);

$fwp = fopen('./output.txt', 'wb');
flock($fwp, LOCK_EX);
printf("\n %s", '等待中...');
sleep(10);
$content .= "\n" . date('Y-m-d H:i:s');
fwrite($fwp, $content);
printf("\n %s", '写入...');
flock($fwp, LOCK_UN);
printf("\n %s", '写入成功');

echo "\n";



如果同时执行二次,记录的时间:

2018-09-17 15:04:12

2018-09-17 15:01:28

2018-09-17 15:03:52

2018-09-17 15:04:02

2018-09-17 15:15:08






综合应用:

function Weblog($directory, $logfile, $message) {
	// Created 15 september 2010: Mirco Babin
	$curtime = time();
	$logfile = date('Ymd', $curtime) . $logfile;

	if (!isset($directory) || $directory === false) {
		$directory = './';
	}

	if (substr($directory, -1) !== '/') {
		$directory = $directory . '/';
	}

	$count = 1;
	while (1) {
		$logfilename = $directory . $logfile . '.' . $count;

		$lockfile = $logfilename . '.lock';
		$lockhandle = false;
		if (!file_exists($lockfile) || @unlink($lockfile)) {
			$lockhandle = @fopen($lockfile, 'xb');
		}

		if ($lockhandle !== false) {
			break;
		}

		$count++;
		if ($count > 100) {
			return false;
		}

	}

	if (file_exists($logfilename)) {
		$created = false;
		$loghandle = @fopen($logfilename, 'ab');
	} else {
		$loghandle = @fopen($logfilename, 'xb');
		if ($loghandle !== false) {
			$created = true;

			$str = '#version: 1.0' . "\r\n" .
				'#Fields: date time c-ip x-msg' . "\r\n";
			fwrite($loghandle, $str);
		}
	}

	if ($loghandle !== false) {
		$str = date('Y-m-d', $curtime) . "\t" .
		date('H:i:s', $curtime) . "\t" .
		(isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '-') . "\t" .
		'"' . str_replace('"', '""', $message) . '"' . "\r\n";
		fwrite($loghandle, $str);

		fclose($loghandle);

		if ($created) {
			chmod($logfilename, 0644);
		}
		// Read and write for owner, read for everybody else

		$result = true;
	} else {
		$result = false;
	}

	fclose($lockhandle);
	@unlink($lockfile);

	return $result;
}