by shigemk2

当面は技術的なことしか書かない

CakePHP3 executeCommand

3.9.8

以下のような2種類のConsole Commandがあって、片方がもう片方をexecで呼び出しているようなコードがあったとして、

<?php
namespace App\Command;

use Cake\Console\Arguments;
use Cake\Console\Command;
use Cake\Console\ConsoleIo;

class FooCommand extends Command
{
    public function execute(Arguments $args, ConsoleIo $io)
    {
        $this->log('THIS IS FOO INFO LOG', 'info');
        exec('/path/to/cake bar');
    }
}
<?php
namespace App\Command;

use Cake\Console\Arguments;
use Cake\Console\Command;
use Cake\Console\ConsoleIo;

class BarCommand extends Command
{
    public function execute(Arguments $args, ConsoleIo $io)
    {
        $this->log('THIS IS BAR INFO LOG', 'info');
        $this->log('THIS IS BAR ERROR LOG', 'error');
    }
}

以下のような出力を期待しているが、

Info: THIS IS FOO INFO LOG
Error: THIS IS BAR INFO LOG
Error: THIS IS BAR ERROR LOG

実際は以下のようなログしか出てこず、INFOログがでない。

Info: THIS IS FOO INFO LOG
Error: THIS IS BAR ERROR LOG

理由は不明だがexecを使って他Console Commandを実行すると他Console Commandについてはエラーログしか出力されない。

book.cakephp.org

その場合はこのようにexecuteCommandを使って他Commandを呼び出す。

$this->executeCommand(BarCommand::class, []);

ちなみに間違ってexecuteCommandで同じCommandを呼び出すと無限ループになって死ぬ。

$this->executeCommand(FooCommand::class, []);