原贴:http://bbs.phpchina.com/viewthread.php?tid=103832
php的写文件并发问题谁遇见过?
象 ![Rank: 2](http://bbs.phpchina.com/images/default/star_level2.gif)
|
1#
大
中
小 发表于 2009-2-7 23:49
只看该作者
php的写文件并发问题谁遇见过?
现 在写了一个访问统计访问人数,网站的访问量每天也就几千人,结果发现统计结果有时会出问题,使用APACHE AB 高流量测试更能发现问题,确定问题是出在file_put_contents 未完成就被另一个file_get_contents读取为 NULL,使用了排他型锁定仍然无法
解决问题。
请问该如果解决读写
文件并发问题?为什么加锁也没有用?
<script src="http://bbs.phpchina.com/tag.php?action=relatetag&rtid=103832" type="text/javascript"></script>
|
|
|
大象 ![Rank: 3](http://bbs.phpchina.com/images/default/star_level2.gif) ![Rank: 3](http://bbs.phpchina.com/images/default/star_level1.gif)
|
2#
大
中
小 发表于 2009-2-7 23:59
只看该作者
我看到FLEAPHP框架里有这样两个函数
复制PHP内容到剪贴板
PHP代码:
/** * safe_file_put_contents() 一 次性完成打开文件,写入内容,关闭文件三项工作,并且确保写入时不会造成并发冲 突 * * @param string $filename * @param string $content * @param int $flag * * @return boolean */ function safe_file_put_contents($filename, & $content) { $fp = fopen($filename, 'wb'); if ($fp) { flock($fp, LOCK_EX); fwrite($fp, $content); flock($fp, LOCK_UN); fclose($fp); return true; } else { return false; } }
复制PHP内容到剪贴板
PHP代码:
/** * safe_file_get_contents() 用共享锁模式打开文件并读取内容,可以避免在并发写入造成的读取不完整问题 * * @param string $filename * * @return mixed */ function safe_file_get_contents($filename) { $fp = fopen($filename, 'rb'); if ($fp) { flock($fp, LOCK_SH); clearstatcache(); $filesize = filesize($filename); if ($filesize > 0) { $data = fread($fp, $filesize); } else { $data = false; } flock($fp, LOCK_UN); fclose($fp); return $data; } else { return false; } }
不知道能否解决你的问题
|
|
|
大象 ![Rank: 3](http://bbs.phpchina.com/images/default/star_level2.gif) ![Rank: 3](http://bbs.phpchina.com/images/default/star_level1.gif)
|
3#
大
中
小 发表于 2009-2-8 00:00
只看该作者
|
|
|
大象 ![Rank: 3](http://bbs.phpchina.com/images/default/star_level2.gif) ![Rank: 3](http://bbs.phpchina.com/images/default/star_level1.gif)
|
4#
大
中
小 发表于 2009-2-9 21:36
只看该作者
|
|
|
大象 ![Rank: 3](http://bbs.phpchina.com/images/default/star_level2.gif) ![Rank: 3](http://bbs.phpchina.com/images/default/star_level1.gif)
|
5#
大
中
小 发表于 2009-2-9 21:53
只看该作者
复制PHP内容到剪贴板
PHP代码:
file_put_contents(sys_get_temp_dir() . '/test.txt', new foo(), LOCK_EX);
|
|
|
象 ![Rank: 2](http://bbs.phpchina.com/images/default/star_level2.gif)
|
6#
大
中
小 发表于 2009-2-11 12:57
只看该作者
|
| |