我是靠谱客的博主 平常荔枝,最近开发中收集的这篇文章主要介绍php生成锁文件避免文件重复执行,文件锁fopen及使用方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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

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

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及使用方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部