Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从一个Laravel安装到另一个安装运行php artisan_Php_Laravel_Laravel Artisan_Artisan Migrate - Fatal编程技术网

从一个Laravel安装到另一个安装运行php artisan

从一个Laravel安装到另一个安装运行php artisan,php,laravel,laravel-artisan,artisan-migrate,Php,Laravel,Laravel Artisan,Artisan Migrate,我们在deploy.mysite.com下建立了一个Laravel部署网站,该网站处理许多其他网站的部署 我正在尝试部署的另一个网站也是一个Laravel网站,位于site2.myothersite.com下 两者都在同一台服务器上。Deploy在site2上调用脚本,此Deploy脚本在cd加载到项目目录后运行各种命令。我们使用以下命令来更新数据库结构 php artisan migrate --force 通常,在项目根目录中直接通过SSH运行时,它可以正常运行 然而,当通过部署脚本(使用

我们在deploy.mysite.com下建立了一个Laravel部署网站,该网站处理许多其他网站的部署

我正在尝试部署的另一个网站也是一个Laravel网站,位于site2.myothersite.com下

两者都在同一台服务器上。Deploy在site2上调用脚本,此Deploy脚本在
cd
加载到项目目录后运行各种命令。我们使用以下命令来更新数据库结构

php artisan migrate --force
通常,在项目根目录中直接通过SSH运行时,它可以正常运行

然而,当通过部署脚本(使用php
exec()
来运行这些命令)运行该过程时,该过程确实可以工作-然而,它不是更新我们已经
cd
'd进入的项目,而是更新部署站点的数据库结构

似乎
php artisan migrate
命令忽略了我已将
cd
放入另一个项目的事实,它从当前目录获取数据库值

$log = shell_exec("unset DB_HOST &&
       unset DB_PORT && 
       unset DB_PASSWORD && 
       unset DB_USERNAME && 
       unset DB_DATABASE && 
       composer dump-autoload &&
       cd /var/www/yourproject/ && php /var/www/yourproject/artisan migrate:fresh &&
       php /var/www/yourproject/artisan db:seed &&
       php /var/www/yourproject/artisan seed:translation");

如何更改此行为?

您可以将命令更改为类似于以下内容的内容,而不是将
cd
更改为目录:

php/var/www/sitea/artisan迁移--force


这将为提供的目录运行artisan命令。

在尝试了多种不同的解决方案后,我最终意识到问题在于我所在项目中的
.env
文件正在设置环境变量,然后没有被任何内容覆盖,因此基本上是将代码作为错误的站点运行

$log = shell_exec("unset DB_HOST &&
       unset DB_PORT && 
       unset DB_PASSWORD && 
       unset DB_USERNAME && 
       unset DB_DATABASE && 
       composer dump-autoload &&
       cd /var/www/yourproject/ && php /var/www/yourproject/artisan migrate:fresh &&
       php /var/www/yourproject/artisan db:seed &&
       php /var/www/yourproject/artisan seed:translation");
我是如何解决这个问题的

在部署脚本中,我手动加载了
.env
文件,并使用
重载
而不仅仅是
加载
重写了环境变量。 注意:这仅适用于V5以下的版本

$dotenv = Dotenv::create(__DIR__);
$dotenv->overload();
V5更新

根据,由于dotenv V5(现在在Laravel 7.0中),这将加载不可变的环境变量。在我的情况下,我很高兴允许这些是可变的,在这种情况下,我可以做以下而不是上面

$dotenv = Dotenv::createMutable(__DIR__);
$dotenv->load();

这就是我所要做的一切,以使我的原始脚本工作


注意:由于这是一个所有端部的laravel安装,该软件包已安装。这可以通过单独安装来用于任何项目。

不幸的是,novocaine的答案在Laravel 7.x中不再有效,因为DotEnv文件是不可变加载的

我当前的解决方法是在项目中创建一个临时.env文件(即“.env.temp”),然后在调用artisan命令时使用--env参数:

php artisan迁移--env=temp


这可能不适用于所有用例,但如果您从项目A中调用项目B中的artisan命令,它应该可以正常工作。

这是我实际尝试过的-我刚才也仔细检查了它,不幸的是,我得到了相同的结果。我首先擦除了数据库,没有创建表,而是失败了,告诉我已经存在一个users表(它在部署站点上就是这样做的),因此,即使像上面那样运行该命令,它仍在尝试在不同的安装上运行它。您是否检查以确保站点中的.env文件包含正确的数据库凭据?我还没有在7.x安装中运行该命令,但这看起来是一个很好的解决方案。我现在遇到了这个问题,并更新了我的答案。如果对您的环境没有问题,那么初始化为可变也可以工作-
$dotenv=dotenv::createMutable(\uuu DIR\uuu)$dotenv->load()是的-createMutable选项也很好用-谢谢!