【问题标题】:symfony/process - Process silently not startingsymfony/process - 进程静默不启动
【发布时间】:2015-02-20 18:25:21
【问题描述】:

在一个新的 symfony2 项目中(安装如 here 所述),我想启动一个控制台进程作为请求的一部分。该应用程序在带有 nginx + php-fpm 的“标准”ubuntu 14.04 机器上运行。

考虑这个控制器代码:

<?php
namespace AppBundle\Controller;


use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Process\Process;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

class CommandController extends Controller
{
    /**
     * @Route("/command")
     * @return JsonResponse
     */
    public function commandAction ()
    {
        $rootDir = $this->get('kernel')->getRootDir();
        $env = $this->get('kernel')->getEnvironment();
        $commandline = $rootDir . '/console --env=' . $env . ' acme:hello --who jojo'
        $process = new Process($commandline);
        $process->start();
        return new JsonResponse(array('command' => $commandline));
    }
}

当我向 /command 发出请求时,我得到了预期的结果并开始了进程,例如我用 htop 等看到它。 当我再次发出此请求时,我得到了预期的结果,但是要启动的过程没有出现在任何地方。没有错误,什么都没有。

重启php5-fpm服务可以让我通过一个请求再次启动一个进程,所以基本上每次请求后我都需要重启整个php-service。所以这可能不是编程问题。但老实说,我还不知道。 之前在 stackoverflow 上描述了这个问题,Symfony2 - process launching a symfony2 command,但是使用 exec 的解决方法对我不起作用。

有人知道吗?

谢谢,问候, 乔乔

【问题讨论】:

  • 至于否决票:没关系,但由于这是我在这里的第一个问题,我希望能就需要改进的地方提供简短的反馈。谢谢:)

标签: php symfony nginx process symfony-process


【解决方案1】:

您的进程很可能在完成工作之前就死掉了。这是因为 PHP 在响应返回给客户端并关闭连接后将其杀死。

Process::start() 用于start a process asynchronously。您需要wait() 才能完成,或者使用isRunning() 检查它是否已经完成:

$process->start();

$process->wait(function ($type, $buffer) {
    // do sth while you wait
});

或者,使用Process::run() 代替Process:start()。

如果您想在后台处理某些内容,请使用消息队列。

【讨论】:

  • 感谢您的帮助。是的,打算异步启动进程,我猜你是对的,fpm 只是在请求完成时杀死相关进程。我真的很想了解为什么它在发生这种行为之前恰好工作了 1 次。无论如何,通过消息队列实现整个事情确实是一个解决方案,所以谢谢。
  • 我不明白为什么它被称为“异步”。对我来说,“异步处理”意味着“运行并忘记”。 Process::run() 和 Process:start() 都会阻止当前请求,这会导致“超出最大执行时间”错误。试图理解 Symfony Process 库的全部意义,它臃肿且无用。我从来没有遇到过简单的 exec() 的任何问题
  • Process::start() 不会阻塞。 wait() 块,如果您需要等待结果,这很方便。 Process 组件擅长的事情之一是处理各种平台之间的差异。祝你的 exec() 在 Linux 和 Windows 上都能工作!
  • 我在 Win 上运行 Laravel Homestead vagrant box。这是一个unix盒子。 Process::run() 和 Process:start() 都会在没有 wait() 的情况下阻塞。 exec() 效果很好。
【解决方案2】:

2020 年只有一次更新 .... 我收到一个静默错误,并这样做是为了调试

$process = new Process($command);
$process->run();
print_r($process->getErrorOutput());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    相关资源
    最近更新 更多