laravel文件_put_contents():此流不支持独占锁

yk9xbfzb  于 2022-12-01  发布在  其他
关注(0)|答案(8)|浏览(180)

我试图上传我的网站到laravel主机和被配置,但我无法加载该项目.错误如下:
文件放置内容():此流不支持独占锁
我该如何解决这个问题?

bvk5enib

bvk5enib1#

尝试删除路径中的以下代码行:

public function put($path, $contents, $lock = false)
    {
        return file_put_contents($path, $contents, $lock ? LOCK_EX : 0);
    }

并将其替换为以下内容:

public function put($path, $contents, $lock = false)
{
    return file_put_contents($path, $contents, 0);
}
hpcdzsge

hpcdzsge2#

问题是主机不支持“exlusive锁”。我在Ubuntu主机上使用Vagrant时遇到了这个问题。那么你可以像这里描述的那样修复它:https://stackoverflow.com/a/35743592/2707570如果您在远程服务器上遇到问题,您需要联系提供商并询问为什么不支持独占锁。

ykejflvf

ykejflvf3#

我最近也遇到过类似的问题。运行Artisan命令:php Artisan配置:缓存为我修复了它

cxfofazt

cxfofazt4#

我在使用NFS将我的代码从开发人员计算机共享到Centos服务器时遇到了同样的错误。问题似乎是服务器试图使用默认的NLM锁定来访问我的NFS共享文件,因此我不得不在我的设置中禁用锁定。这是通过在/etc/fstab的NFS选项中添加nolock来完成的
这解决了我的问题

cld4siwp

cld4siwp5#

在不支持独占file locks的系统上运行时会出现此问题。
独占锁或写锁授予进程对文件的指定部分进行写操作的独占访问权限。当写锁就位时,其他进程不能锁定文件的该部分。
出于数据安全原因,目前在Laravel有2个地方强制执行此类锁定:请注意,在这两个调用中,Filesystem::put()的第三个参数都是true,这会导致它在写入之前尝试获取独占锁。
解决这个问题的方法是让文件系统适配器不尝试锁定。一个答案中建议的方法是编辑Laravel的库文件。正如孩子们所说,这是一种头脑简单的方法。您的更改将在升级时丢失,因此必须持续管理。
而是编写您自己的自定义类,重写该方法,并将应用程序配置为使用它。
步骤1:使用这些内容创建app/Filesystem/Filesystem.php

<?php

namespace App\Filesystem;

use Illuminate\Filesystem\Filesystem as FilesystemBase;

class Filesystem extends FilesystemBase
{
    public function put($path, $contents, $lock = false)
    {
        // don't pass the value of $lock to the parent method
        return parent::put($path, $contents);
    }
}

步骤2:编辑app/Providers/AppServiceProvider.php来注册新的类。不要删除现有的注册,如果有的话,只添加以下注册:

<?php

namespace App\Providers;

use App\Filesystem\Filesystem;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton('files', fn () => new Filesystem);
    }
}

启动php artisan tinker并输入app('files'),确认提供程序正在运行,您应该会得到新类的一个示例。

nwnhqdif

nwnhqdif6#

按照这些步骤,当我尝试在我的Android平板电脑上运行laravel 9与termux时,解决了相同的问题。

  • 请转到供应商/laravel/framework/src/照明/文件系统. php
  • 然后将put方法中的这段代码替换为以下代码行,如图像Run laravel on linux

只需将LOCK_EX更改为LOCK_SH即可。

0mkxixxg

0mkxixxg7#

1.必须通过关闭最初启动服务器时使用的批处理窗口来关闭服务器。
1.刷新浏览器并确保服务器已关闭。
1.通过键入$ php artisan serve启动新的开发服务器
1.进入浏览器,输入由Artisan生成的服务器地址,通常为http://127.0.0.1:8000

7cjasjjr

7cjasjjr8#

最好的解决方案Laravel转到/laravel/framework/src/Illuminate/Filesystem/Filesystem. php删除内容函数“公共函数put($path,$contents,$lock = false)”第120行。完成

相关问题