当前位置: 首页 > 知识库问答 >
问题:

PHP flock():我可以在file-get和file-put-contents(读-修改-写)中使用它吗

皇甫飞宇
2023-03-14

我想对一个文件进行读-修改-写,同时我有一个独占锁。显然,我可以使用flock()并执行fopen、flock、fread、fwrite、flock、fclose序列,但是如果我可以使用file_get_contents和file_put_contents,我的代码看起来会更整洁。然而,我需要锁定这两个进程,我想知道是否可以使用flock“以某种方式”做到这一点。当然,危险在于,我会写一些看起来有效但实际上不能锁定任何东西的东西:-)

共有1个答案

楚和悌
2023-03-14

正如@Jonathan所说,您可以将LOCK_EX标志与file_put_contents一起使用,但是对于file_get_contents,您可以构建自己的自定义函数,然后在代码中使用它。下面的代码可以作为您的起点:

function fget_contents($path,$operation=LOCK_EX|LOCK_NB,&$wouldblock=0,$use_include_path = false ,$context=NULL ,$offset = 0 ,$maxlen=null){
    if(!file_exists($path)||!is_readable($path)){
        trigger_error("fget_contents($path): failed to open stream: No such file or directory in",E_USER_WARNING);
        return false;
    }
    if($maxlen<0){
        trigger_error("fget_contents(): length must be greater than or equal to zero",E_USER_WARNING);
        return false;
    }
    $maxlen=is_null($maxlen)?filesize($path):$maxlen;
    $context=!is_resource($context)?NULL:$context;
    $use_include_path=($use_include_path!==false&&$use_include_path!==FILE_USE_INCLUDE_PATH)?false:$use_include_path;
    if(is_resource($context))
        $resource=fopen($path,'r',(bool)$use_include_path,$context);
    else
        $resource=fopen($path,'r',(bool)$use_include_path);
    $operation=($operation!==LOCK_EX|LOCK_NB&&$operation!==LOCK_SH|LOCK_NB&&$operation!==LOCK_EX&&$operation!==LOCK_SH)?LOCK_EX|LOCK_NB:$operation;
    if(!flock($resource,$operation,$wouldblock)){
        trigger_error("fget_contents(): the file can't be locked",E_USER_WARNING);
        return false;
    }
    if(-1===fseek($resource,$offset)){
        trigger_error("fget_contents(): can't move to offset $offset.The stream doesn't support fseek ",E_USER_WARNING);
        return false;
    }
    $contents=fread($resource,$maxlen);

    flock($resource, LOCK_UN);
    fclose($resource);
    return $contents;
}

我只是将flock的参数与file_get_contents的参数组合在一起,所以您只需要阅读关于这两个函数的内容就可以理解代码。但是,如果您不需要高级用法,您可以这样做

 $variable=fget_contents($yourpathhere);

我想这句台词和:

 $variable=file_get_contents($yourpathhere);
 类似资料:
  • 我通过使用这段代码从php中的html文件中回显tah。 但我得到错误后运行我的代码在本地。 错误: 致命错误:未捕获错误:调用C:\xampp\htdocs\2\index中未定义的函数文件\u get\u html()。php:2堆栈跟踪:#0{main}在C:\xampp\htdocs\2\index中抛出。php在线2 php代码: 这是更改后的错误: 警告:file_get_conten

  • 主要内容:C++ ostream::put()成员方法,C++ istream::get()成员方法在某些特殊的场景中,我们可能需要逐个读取文件中存储的字符,或者逐个将字符存储到文件中。这种情况下,就可以调用 get() 和 put() 成员方法实现。 C++ ostream::put()成员方法 通过《 C++ cout.put()》一节的学习,读者掌握了如何通过执行 cout.put() 方法向屏幕输出单个字符。我们知道,fstream 和 ofstream 类继承自 ostream 类,因

  • 我正在尝试上传图片到imgur,我可以上传大部分图片,但有些图片我无法上传,我不知道为什么。这给了我警告。 警告:文件\获取\内容():文件名在C:\wamp64\www\social\my-account.php中不能为空 如果代码有问题,我如何才能上传相同文件类型的其他图像。 从我观察到的所有未能上传的图片来看,文件大小相当大(约2MB至4MB)。 如果这是因为大小,我怎么能解决这个问题。 p

  • 我想使用maven安装JDBC连接器。 我有以下几点: mvn install:install-file -DgroupId=mysql -达蒂法特 Id=mysql-connnector-java -Dversion=5.1.6 -Dpackaging=jar -Dfile= -DgenerationPom=真 我想我所需要的就是我放在=Dfile=另一边的东西? 我也有段时间没用maven了,

  • 问题内容: 我正在开发一个JavaScript应用程序,该应用程序可以从Web服务器(通过http)运行,也可以从文件系统(在file:// URL上)运行。 作为此代码的一部分,我需要使用XMLHttpRequest在与页面相同的目录中以及页面的子目录中加载文件。 在Web服务器上执行时,此代码可以正常工作(“通过”),而在文件系统中运行时,此代码在Internet Explorer 8中则无法

  • 本文向大家介绍Objective C中可修改和不可以修改类型。相关面试题,主要包含被问及Objective C中可修改和不可以修改类型。时的应答技巧和注意事项,需要的朋友参考一下 答案:可修改不可修改的集合类。这个我个人简单理解就是可动态添加修改和不可动态添加修改一样。 比如NSArray和NSMutableArray。前者在初始化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的内存