当前位置: 澳门新濠3559 > 编程 > 正文

轻便的咨询文件锁定, 函数成功之后返回值

时间:2019-12-08 22:39来源:编程
使用PHP文件锁写一个多个请求同时并发写入一个文件,要求不脏读、数据不丢失. 点击这里:file_put_contents() 图片保存 函数成功之后返回值   今天弄图片保存时,用到file_put_contents()来保

使用PHP文件锁写一个多个请求同时并发写入一个文件,要求不脏读、数据不丢失.

点击这里:file_put_contents() 图片保存  函数成功之后返回值

 

今天弄图片保存时,用到file_put_contents()来保存图片,运行了几次,发下一直没有数据出来,以为是这个函数没操作成功

//并发文件操作
function filehandle($filename,$data){
    $start = 0;
    $end = 3000;

    if(!file_exists($filename)){
        return "文件不存在";
    }

    if(!is_string($data)){
        return "写入内容只能为字符串类型";
    }

    if($fp = fopen($filename,'a')){
        do{
            //获取文件独占锁
            $canWrite = flock($fp,LOCK_EX);

            if(!$canWrite){
                $rand = mt_rand(1,100);
                //让程序休眠随机毫秒数再试
                usleep($rand*1000);
                $start += $rand;
            }

        }while(!$canWrite && $start < $end);

        if(!$canWrite){
            //未能获得锁
            return "获取文件锁失败";
        }else{
            fwrite($fp,$data);
        }

        //释放锁定,关闭文件
        flock($fp, LOCK_UN);
        fclose($fp);
        return true;

    }else{
        return "打开文件失败";
    }

}

于是查看了下这个函数的用法和返回值,发现我输出的返回都正确,后来才发现是其他原因引起的

此方法的要点是当用户操作文件的时候必须获取文件的独占锁,若文件已经被锁定,则让程序休眠若干毫秒后重试,知道获得锁或者超时为止。

现在分享下这个函数的用法:

flock():轻便的咨询文件锁定

file_put_contents() 函数是一次性向文件写入字符串或追加字符串内容的最合适选择。 

函数参数说明:

file_put_contents() 函数用于把字符串写入文件,成功返回写入到文件内数据的字节数,失败则返回 FALSE。 

handle - 文件系统指针,是典型地由 fopen() 创建的 resource(资源)。

语法: 

operation - 可以是以下值之一:

int file_put_contents ( string filename, string data [, int flags [, resource context]] )
参数说明: 参数 说明 
filename 要写入数据的文件名 
data 要写入的数据。类型可以是 string,array(但不能为多维数组),或者是 stream 资源 
flags 可选,规定如何打开/写入文件。可能的值: 
FILE_USE_INCLUDE_PATH:检查 filename 副本的内置路径 
FILE_APPEND:在文件末尾以追加的方式写入数据 
LOCK_EX:对文件上锁 
 
context 可选,Context是一组选项,可以通过它修改文本属性 

  1. LOCK_SH取得共享锁定(读取的程序)。
  2. LOCK_EX   取得独占锁定(写入的程序。
  3. LOCK_UN释放锁定(无论共享或独占)。

例子: 

返回值:成功时返回 TRUE, 或者在失败时返回 FALSE

<?php
echo file_put_contents("test.txt", "This is something.");
?>
运行该例子,浏览器输出: 

 

18
而 test.txt 文件(与程序同目录下)内容则为:This is something.。

方案二:

查看更多:file_put_contents() 图片保存  函数成功之后返回值

file_put_contents($filename, $data, FILE_APPEND|LOCK_EX);

int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] );

函数说明:将一个字符串写入文件

参数说明:

  filename - 要被写入数据的文件名。

  data - 要写入的数据。类型可以是 string,array(一维) 或者是 stream 资源。

  flags - flags的值可以是 以下 flag 使用 OR (|) 运算符进行的组合。

    FILE_USE_INCLUDE_PATH : 在 include 目录里搜索 filename。 更多信息可参见 include_澳门新濠3559,path。
    FILE_APPEND : 如果文件 filename 已经存在,追加数据而不是覆盖。
    LOCK_EX : 在写入时获得一个独占锁。

  context - 一个 context 资源。

返回值:该函数将返回写入到文件内数据的字节数,失败时返回FALSE

 

(注:以上方案均未经过实际项目测试)

 

编辑:编程 本文来源:轻便的咨询文件锁定, 函数成功之后返回值

关键词:

  • 上一篇:没有了
  • 下一篇:没有了