laravel 命令 storage:link 报错 Call to undefined function Illuminate\Filesystem\symlink()
部署一个基于 Dcat-admin 后台开发的项目,在执行 php aritsan storage:link
命令来创建 public/storage
符号链接(软链)时报错了:
Error
Call to undefined function Illuminate\Filesystem\symlink()
at vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:355
351▕ */
352▕ public function link($target, $link)
353▕ {
354▕ if (! windows_os()) {
➜ 355▕ return symlink($target, $link);
356▕ }
357▕
358▕ $mode = $this->isDirectory($target) ? 'J' : 'H';
359▕
+13 vendor frames
14 artisan:35
Illuminate\Foundation\Console\Kernel::handle()
看到是 symlink() 未定义报错,一开始还比较迷茫,本地似乎没有遇到过这个错误。
百度看到有些回答里说是符号链接已经存在,查看了一下并没有。并且我在修复问题之后重复执行命令,已存在的报错是这样的:
ERROR The [public/storage] link already exists.
因为使用的是宝塔面包安装的 PHP 和 Nginx 的服务软件。对于 laravel 项目需要做的一些事情基本了然:
- 创建网站后删除
.user.ini
等文件,删除不了参考 Linux下 root 用户移动、删除文件 .user.ini 报错:Operation not permitted git clone http:xx.git xx
将项目代码克隆到网站目录下,并设置git config credential.helper store
本地化存储 git 账号密码- 设置网站目录为项目目录,运行目录选择
/public
,并取消防跨站攻击(open_basedir) - 设置伪静态,选择 laravel5 模版,也就是如下内容:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
- 在
composer install
安装依赖之前需要解决安装的 PHP 的问题。版本要符合项目要求,并且要安装扩展fileinfo
和opcache
,如果有 redis 缓存需求,要安装 redis 扩展。最后是要取消一些默认禁用的函数:putenv
、shell_exec
、proc_open
等 - 安装依赖
composer install
- 修改日志文件目录权限,一般会设置为用户组
chown -R www.www storage
,如果日志访问还报错,就修改文件权限 755 - 复制 .env 文件到项目下,或者从
.env.example
复制一份,复制后需要执行php aritsan key:generate
生成项目加密密钥,修改数据库、redis 等连接信息 - 此时就可以访问网站查看是否正常了
回顾整个过程,猜测是 PHP 的问题。查看到禁用函数里有一个 symlink
,删除禁用后,再次执行生成符号链接,成功!