【发布时间】:2018-06-03 22:06:29
【问题描述】:
我尝试将我的网站上传到 laravel 以进行托管和配置,但我无法加载项目。错误如下:
file_put_contents():此流不支持独占锁
我该如何解决这个问题?
【问题讨论】:
标签: laravel
我尝试将我的网站上传到 laravel 以进行托管和配置,但我无法加载项目。错误如下:
file_put_contents():此流不支持独占锁
我该如何解决这个问题?
【问题讨论】:
标签: laravel
尝试删除路径中的以下代码行:
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);
}
【讨论】:
问题是主机不支持“独占锁”。我在 Ubuntu 主机上遇到了 Vagrant 的这个问题。 然后你可以像这里描述的那样修复它:https://stackoverflow.com/a/35743592/2707570 如果您在远程服务器上遇到问题,您需要联系提供商并询问为什么不支持独占锁。
【讨论】:
我最近遇到了类似的问题。运行 artisan 命令:php artisan config:cache 为我修复了它
【讨论】:
我在使用 NFS 将我的代码从我的开发人员机器共享到我的 Centos 服务器时遇到了同样的错误。问题似乎是服务器默认情况下尝试使用 NLM 锁定访问我的 NFS 共享文件,所以我不得不在我的设置中禁用锁定。这是通过在 /etc/fstab 的 NFS 选项中添加 nolock 来完成的
这解决了我的问题
【讨论】:
在不支持独占file locks的系统上运行时会出现问题。
独占锁或写锁赋予进程独占访问权限以写入文件的指定部分。当写锁到位时,没有其他进程可以锁定文件的该部分。
目前 Laravel 中有 2 个地方出于数据安全原因强制执行此类锁定:在编写 cache entries 和 sessions 时。请注意,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') 来确认您的提供商正在工作。你应该得到一个新类的实例。
【讨论】:
您必须通过关闭最初启动服务器时使用的批处理窗口来关闭服务器。
刷新浏览器并确保服务器已关闭。
输入$ php artisan serve启动一个新的开发服务器
进入浏览器并输入工匠生成的服务器地址。通常是http://127.0.0.1:8000
【讨论】:
Laravel 的最佳解决方案 转到 /laravel/framework/src/Illuminate/Filesystem/Filesystem.php 删除内容函数“public function put($path, $contents, $lock = false)”第 120 行。 完成
【讨论】: