【问题标题】:Running a Laravel Artisan command as a new process将 Laravel Artisan 命令作为新进程运行
【发布时间】:2014-11-19 15:21:42
【问题描述】:

所以通常你可以在 php 中说 exec('MyCommand &> /dev/null &')MyCommand 将作为一个单独的进程执行,所以你的主要 php 执行可以继续它的快乐方式。

奇怪的是,如果你尝试使用 Laravel 的 Artisan 来执行此操作,就会出现问题。例如,exec('php artisan command &> /dev/null &') 结果令人惊讶的是,在这个过程中仍然只是挂起,直到工匠命令完成。如果将 artisan 命令包装在 bash 脚本中,它根本不会执行。

为什么会这样?如何在新的分离进程中执行工匠命令?

【问题讨论】:

    标签: php laravel laravel-artisan


    【解决方案1】:

    您必须创建一个新进程来运行它:

    $pid = pcntl_fork();
    
    switch($pid)
    {
        case -1:    // pcntl_fork() failed
            die('could not fork');
    
        case 0:    // you're in the new (child) process
            exec("php artisan command");
    
            // controll goes further down ONLY if exec() fails
            echo 'exec() failed';
    
        default:  // you're in the main (parent) process in which the script is running
            echo "hello";
    }
    

    【讨论】:

    • 遗憾的是,根据this 问题,我认为我不能在 Apache 模块调用中使用 pcntl_fork()
    • 您确定这不仅仅是因为您的 php.ini 文件中禁用了 pcntl_* 功能吗?
    • 它们被禁用了,我出于好奇启用了它们 - 但是,我随后在this 答案上找到了第一条评论,其中明确指出这些功能在 Apache 配置中被禁用,因为它们没有不行。
    猜你喜欢
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 2016-05-09
    • 2020-01-30
    • 2013-08-01
    相关资源
    最近更新 更多