部署一个基于 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 的问题。版本要符合项目要求,并且要安装扩展 fileinfoopcache,如果有 redis 缓存需求,要安装 redis 扩展。最后是要取消一些默认禁用的函数:putenvshell_execproc_open
  • 安装依赖 composer install
  • 修改日志文件目录权限,一般会设置为用户组 chown -R www.www storage,如果日志访问还报错,就修改文件权限 755
  • 复制 .env 文件到项目下,或者从 .env.example 复制一份,复制后需要执行 php aritsan key:generate 生成项目加密密钥,修改数据库、redis 等连接信息
  • 此时就可以访问网站查看是否正常了

回顾整个过程,猜测是 PHP 的问题。查看到禁用函数里有一个 symlink,删除禁用后,再次执行生成符号链接,成功!