在秒杀的情况下,问有几种方式不超卖
使用文件锁是否可以线性执行?
当文件加锁后,在打开文件时,
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; }