【问题标题】:Envoyer Deployment with custom artisan command fails使用自定义工匠命令的 Envoyer 部署失败
【发布时间】:2018-09-25 08:00:53
【问题描述】:

我在使用执行我创建的工匠命令的 envoyer 部署项目时遇到问题。

该命令获取我的所有用户,执行另一个工匠命令 ($this->call('command')) 并通过遍历所有用户来执行它的操作。

问题出在这里:

    foreach($usernames as $username) {
        shell_exec('php ' . base_path('artisan') . ' command ' . $username . ' > /dev/null 2>/dev/null &');
    }

此命令在后台启动脚本。 它手动执行没有任何问题并且不会以超时结束(大约需要 1s~ 执行)但是在 envoyer 中它不会在部署步骤中停止运行并且超时失败尽管它执行完美无瑕。

其他信息:
我在后台运行脚本的原因:
我开始的脚本打开了一个套接字,他将 24/7 全天候监听该套接字,直到 用户手动取消。

【问题讨论】:

  • 你使用的是哪个版本的 Laravel?
  • 我正在使用 Laravel 5.6(最新 - 已标记)
  • 你可以试试'php artisan command ' . $username . '
  • 这不起作用,因为脚本必须在后台 24/7 运行 - 脚本将打开一个套接字并运行,直到有人告诉它停止运行
  • 尝试shell_exec('nohup php ' 应该将其与父进程分离

标签: laravel laravel-5.6 envoyer.io


【解决方案1】:

我刚刚创建了一个较小的示例以确保一切正常:

文件 forever.php 将保持无限循环,每 5 秒打印一次:

<?php
while (true) {
  echo "I am still in the loop $argv[1]\n";
  sleep(5);
}

文件script.php 将调用forever.php 的多个实例并与父进程分离(与您所做的相同):

<?php
for ($i = 0; $i < 5; $i++) {
  shell_exec("php forever.php $i > /dev/null 2>/dev/null &");
}

在执行php script.php 时,显然有5 个forever.php 实例正在运行。所以你的代码看起来不错(你展示的部分)。

在你的情况下,我唯一能想到的是:

  • 1 秒对于在 Envoyer 上运行脚本来说太长了?
  • 您的循环是针对所有用户的 foreach。可能是您在该循环中生成了太多进程吗?您有多少用户?
  • 能否在执行命令前打印命令,直接在终端上试一下,看看是否一切正常?

希望对您有所帮助,如果您需要更多帮助,请提供更多信息。

【讨论】:

  • 我在 2-6 个用户之间运行它。我在终端中手动执行的脚本完美无缺。我会尽快尝试 nohup。
猜你喜欢
  • 1970-01-01
  • 2020-11-02
  • 2019-09-19
  • 2016-01-08
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 2016-03-26
  • 2023-01-30
相关资源
最近更新 更多