node.js側の実装
Node.jsのAPIだけでやってます。
PHPをコマンドラインで呼び出します。
icallyou.js
var util = require('util');
var spawn = require('child_process').spawn;
var php = spawn('php', ['callme.php']); // $ php callme.php と同じ意味
var data = {
'foo': 'something',
'bar': 'something',
};
php.stdin.write(JSON.stringify(data)); // 標準入力としてPHPに渡す
php.stdin.end(); // PHPさん、標準入力終わったよ
php.stdout.on('data', function (data) {
console.log('stdout: ', JSON.parse(data));
});
php.stderr.on('data', function (data) {
console.log('stderr: ', JSON.parse(data));
});
php.on('exit', function (code) {
console.log('phpプロセスが終了しました: ステータスコード: ' + code);
});
// ↓エラーなパターン
var php2 = spawn('php', ['callme.php']);
var data = 'なんか変なデータ';
php2.stdin.write(JSON.stringify(data));
php2.stdin.end();
php2.stdout.on('data', function (data) {
console.log('stdout: ', JSON.parse(data));
});
php2.stderr.on('data', function (data) {
console.log('stderr: ', JSON.parse(data));
});
php2.on('exit', function (code) {
console.log('php2プロセスが終了しました: ステータスコード: ' + code);
});
PHP側の実装
php://stdinで標準入力を取得できます。
callme.php
<?php
$stdin = file_get_contents('php://stdin');
$data = json_decode($stdin, true);
// var_dump($data);
if ( is_array($data) === false )
{
echo json_encode(array(
'status' => 'error',
'message' => 'フォーマットに誤りがあります。JSONの配列で送ってこいゴルァ',
));
exit(1);
}
else
{
echo json_encode(array(
'status' => 'success',
'message' => 'OKです',
));
exit(0);
}
実行してみる
$ node icallyou.js
stdout: { status: 'success', message: 'OKです' }
stdout: { status: 'error',
message: 'フォーマットに誤りがあります。JSONの配列で送ってこいゴルァ' }
phpプロセスが終了しました: ステータスコード: 0
php2プロセスが終了しました: ステータスコード: 1