SSH::run($command, function($output){})の罠

通信してるような画像

SSH::run()とは

PHPプログラム上で、別サーバへSSH接続し、サーバ内で任意のコマンドを実行することができる便利なメソッド。

何が問題なのか

SSH::run($command, function($output){
dump(7);
});

上記を実行した時、コマンド実行した時の標準出力およびエラー出力が$output変数に格納され、クロージャ内のdump(7);が実行されるのだが、ここに罠がある。$outputが規定のバイト数以上の出力が格納される場合、クロージャ内の処理が複数回実行されてしまう。しかも、$outputが途中で分割されたような状態になる。こういう挙動になることを全く知らなかったです。

対策

SSH::run($command, function($output) use(&$merge_output){
$merge_output .= $output;
});

上記のようにしないと正常に$outputを取得することができないというメモ。クロージャでこういう挙動をするメソッドがあるということ自体知らなかった。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ABOUTこの記事をかいた人

山中 雅彦

大分でWebシステム受託開発会社のバックエンドエンジニアとして働いてます。 Laravel5でのシステム開発を中心に仕事してます。 高校卒業後に鉄鋼会社で電気整備の仕事をする傍ら、HTML、CSS、JS、PHP、MySQL、サーバ関連技術を独学で勉強。 2017年9月にWebシステム開発会社に入社し、システム開発をしています。 Web技術全般が好きなPHPerです。