概述
在秒杀的情况下,问有几种方式不超卖
使用文件锁是否可以线性执行?
当文件加锁后,在打开文件时,
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' . "rn" .
'#Fields: date time c-ip x-msg' . "rn";
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) . '"' . "rn";
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;
}
最后
以上就是平常荔枝为你收集整理的php生成锁文件避免文件重复执行,文件锁fopen及使用方法的全部内容,希望文章能够帮你解决php生成锁文件避免文件重复执行,文件锁fopen及使用方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复