file_put_contents  这个方法顾名思义就是将一个字符串写入到指定的文件。这个方法需要注意的是:在出现并发事件的时候,file_put_contents可能会出现写入文件失败的情况。直接上测试代码。

</p>
<p>&lt;?php </p>
<p>$index = isset($_GET['index']) ? $_GET['index'] : microtime(true);<br />
$ret = file_put_contents('e:/tmp/file_put_contents.log',$index . PHP_EOL, FILE_APPEND); </p>
<p>if ($ret === false) {<br />
    echo index, ' file_put_contents failure';<br />
} else {<br />
    echo index, ' file_put_contents success';<br />
}</p>
<p>

使用 apache的ab直接做压力测试。

path-to-ab:  ab -n 1000 -c 50 http://local.test.me/file_put_contents.php

PS:意思为 总共访问http://local.test.me/file_put_contents.php这个脚本1000次,50并发同时执行。

最后的到得结果950左右行记录。 也就是说,会有50左右次写失败。

稍微修改代码,在file_put_contents 后面追加参数 LOCK_EX。最终代码如下:

</p>
<p>&lt;?php</p>
<p>$index = isset($_GET['index']) ? $_GET['index'] : microtime(true);<br />
//$ret = file_put_contents('e:/tmp/file_put_contents.log',$index . PHP_EOL, FILE_APPEND); //直接这样有失败的情况</p>
<p>$ret = file_put_contents('e:/tmp/file_put_contents.log',$index . PHP_EOL, LOCK_EX | FILE_APPEND);</p>
<p>if ($ret === false) {<br />
echo index, ' file_put_contents failure';<br />
} else {<br />
echo index, ' file_put_contents success';<br />
}</p>
<p>

再次ab压测,得出结果正常。1000次写入全部成功。

参数 LOCK_EX的意思 php manual 描述如下:Acquire an exclusive lock on the file while proceeding to the writing. (写入文件的时候,添加一个排他锁)。