【问题标题】:laravel file_put_contents(): Exclusive locks are not supported for this streamlaravel file_put_contents():此流不支持独占锁
【发布时间】:2018-06-03 22:06:29
【问题描述】:

我尝试将我的网站上传到 laravel 以进行托管和配置,但我无法加载项目。错误如下:

file_put_contents():此流不支持独占锁

我该如何解决这个问题?

【问题讨论】:

    标签: laravel


    【解决方案1】:

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

    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);
    }
    

    【讨论】:

    • 为我工作,这可能至少是一种解决方法或标记为答案。
    • @ClaudiuHaidu 您的更改将在您更新 Laravel 后立即被覆盖。请参阅下面的答案以获得更可持续的解决方案。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我最近遇到了类似的问题。运行 artisan 命令:php artisan config:cache 为我修复了它

      【讨论】:

        【解决方案4】:

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

        这解决了我的问题

        【讨论】:

          【解决方案5】:

          在不支持独占file locks的系统上运行时会出现问题。

          独占锁或写锁赋予进程独占访问权限以写入文件的指定部分。当写锁到位时,没有其他进程可以锁定文件的该部分。

          目前 Laravel 中有 2 个地方出于数据安全原因强制执行此类锁定:在编写 cache entriessessions 时。请注意,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') 来确认您的提供商正在工作。你应该得到一个新类的实例。

          【讨论】:

            【解决方案6】:
            1. 您必须通过关闭最初启动服务器时使用的批处理窗口来关闭服务器。

            2. 刷新浏览器并确保服务器已关闭。

            3. 输入$ php artisan serve启动一个新的开发服务器

            4. 进入浏览器并输入工匠生成的服务器地址。通常是http://127.0.0.1:8000

            【讨论】:

              【解决方案7】:

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

              【讨论】:

              • 虽然您的回答可能会解决问题,但 including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。您可以编辑您的答案以添加解释并指出适用的限制和假设。 - From Review
              • 手动修改依赖项中的文件不是一个可持续的解决方案。这些更改不会(或不应该)保留在版本控制中,项目的其他用户必须在设置期间完成此步骤。
              猜你喜欢
              • 2019-01-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-09-11
              • 1970-01-01
              • 2014-06-30
              相关资源
              最近更新 更多