4

我在使用执行我创建的工匠命令的 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 监听该套接字,直到用户手动取消它。

4

1 回答 1

0

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

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

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

Filescript.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。可能是您在该循环中生成了太多进程吗?你有多少用户?
  • 您能否在执行命令之前打印命令,然后直接在终端上尝试,看看是否一切正常?

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

于 2018-04-28T11:53:19.917 回答