phpとperlのプログラムについての質問です。

あるシステム案件を複数人で担当することになり、当方がphpでプログラムを書き、相手方がperlでプログラムを書く必要性が出てきました。そのためそれぞれの言語内で同じ目的の処理が必要になった場合に、同じ処理を2回書くのは無駄なので相手方がAPIを実装してそれを使ってもらえればいい、という話になりました。

JSONなどでデータを取り出すタイプのAPIなら(twitterのAPIとか)使ったことがあるのですが、同一サーバー内においてAPIを経由して異言語間でやりとりしたことがありません。

phpでAPIを叩く、というとfile_get_contents関数を連想するのですが、ここの取得先のファイル名に同一サーバー内の特定のファイル名を相対パスで書いた場合、それを実行してその結果を取得するのではなくそのファイルの中身を当然取ってきてしまいます。実際同一サーバー内に設置されたapiを叩いて結果を取得するにはphpにおいてはどの関数をどのように使うべきなのでしょうか。

以上、お手数ですが詳しい方にご回答いただけますと幸いです。

回答の条件
  • 1人20回まで
  • 13歳以上
  • 登録:2010/06/12 14:47:41
  • 終了:2010/06/12 22:04:04

ベストアンサー

id:Bombastus No.2

ホーエンハイム回答回数409ベストアンサー獲得回数522010/06/12 16:08:46

ポイント42pt

どのレベルでAPIを組むのか、perl担当の方とよく相談する必要がありますね。


PHPでperlスクリプトとの間でプロセス間通信するのであれば、popenがよく使われます。

それ以上の規模のデータの授受が発生するのでしたら、jsonを使った方が楽だと思います。

id:n_maco2

ご回答ありがとうございます。

popenを試させて頂きました。非常に希望している動作に近く、かつ楽にコードを書くことができました。

シンプルでとてもいいと思います。

JSONのほうの話になりますが、JSONはあくまでデータ形式の一つだと理解しております。Bombastusさんがおっしゃってるのは、上記のpopenの実行結果、つまりAPIを叩いた結果の文字列をJSON形式のデータで受け取るべきだ、という意味でしょうか。それともJSON専用の何かしらの関数があったりするものなのでしょうか。

以上、よろしくお願いいたします。

2010/06/12 16:50:11

その他の回答(5件)

id:niwa-mikiho No.1

niwa-mikiho回答回数508ベストアンサー獲得回数382010/06/12 16:04:48

ポイント31pt

API と言っても、所詮は HTTP によるデータのやりとりなので、

クライアントは post なりで要求だして、API 側は print するだけです。

そのやりとりするデータの構造を考えるのがプログラマ側ですので、

やりとりしたいデータを既存の技術にあてはめて、扱いやすいものを選べばいいかと思います。


簡単に言えば 「フォーマットは自分たちで決める」 です。


同一サーバー内のファイルだからといってそのまま実行するのではなく、

ちゃんと HTTP 経由でアクセスしてあげれば希望の動作かと思います。

id:n_maco2

ご回答ありがとうございます。

http経由のアクセスをあえて行う、ということですね。確かにそれであれば、諸々やりやすいかと思います。

しかしhttp経由ということは、インターネット上にデータをさらすことになってしまい、余計なセキュリティの問題が発生したり、Writeやdeleteなどのselect以外の命令を渡したいときに結構面倒になるかな、と感じます。

そこらへんはどのように思われますでしょうか。何かアイデアがあればお教えください。

よろしくお願いいたします。

2010/06/12 16:18:11
id:Bombastus No.2

ホーエンハイム回答回数409ベストアンサー獲得回数522010/06/12 16:08:46ここでベストアンサー

ポイント42pt

どのレベルでAPIを組むのか、perl担当の方とよく相談する必要がありますね。


PHPでperlスクリプトとの間でプロセス間通信するのであれば、popenがよく使われます。

それ以上の規模のデータの授受が発生するのでしたら、jsonを使った方が楽だと思います。

id:n_maco2

ご回答ありがとうございます。

popenを試させて頂きました。非常に希望している動作に近く、かつ楽にコードを書くことができました。

シンプルでとてもいいと思います。

JSONのほうの話になりますが、JSONはあくまでデータ形式の一つだと理解しております。Bombastusさんがおっしゃってるのは、上記のpopenの実行結果、つまりAPIを叩いた結果の文字列をJSON形式のデータで受け取るべきだ、という意味でしょうか。それともJSON専用の何かしらの関数があったりするものなのでしょうか。

以上、よろしくお願いいたします。

2010/06/12 16:50:11
id:koriki_kozou No.3

小力子象回答回数78ベストアンサー獲得回数22010/06/12 16:21:44

JSON (JavaScript Object Notation)は、軽量のデータ交換フォーマットです。人間にとって読み書きが容易で、マシンにとっても簡単にパースや生成を行なえる形式です。 JavaScriptプログラミング言語 (ECMA-262標準第3版 1999年12月)の一部をベースに作られています。 JSONは完全に言語から独立したテキスト形式ですが、C、C++、C#、Java、JavaScript、Perl、Python、その他多くのCファミリーの言語を使用するプログラマにとっては、馴染み深い規約が使われています。これらの性質が、 JSONを理想的なデータ交換言語にしています。

id:n_maco2

ご回答ありがとうございます。

しかし質問に対する答えではないです。

2010/06/12 16:30:53
id:Bombastus No.4

ホーエンハイム回答回数409ベストアンサー獲得回数522010/06/12 18:03:45

ポイント22pt

JSONのほうの話になりますが、JSONはあくまでデータ形式の一つだと理解しております。

はい、データ形式という解釈で結構です。


PHP側ではjsonデコード関数json_decodeとエンコード関数json_encodeが用意されているので、より大規模な構造化されたデータを扱う場合には便利です。

id:n_maco2

ご回答ありがとうございます。

この関数は知りませんでした、勉強になります、ありがとうございます。

2010/06/12 20:51:36
id:b-wind No.5

b-wind回答回数3344ベストアンサー獲得回数4402010/06/12 18:50:10

ポイント38pt

しかしhttp経由ということは、インターネット上にデータをさらすことになってしまい、余計なセキュリティの問題が発生したり、Writeや deleteなどのselect以外の命令を渡したいときに結構面倒になるかな、と感じます。

別に http で無くともインターネット越しにアクセスすることは変わりない。

file_get_contents でもやっていることは同じ。

HTTPS の利用や Basic 認証・Digest 認証を組み合わせればそれなりのセキュリティは担保できる。

(もっと必要であればそもそもVPNで接続した経路でしかつながない等)


言語をまたがったデータのやりとりは SOAP や XML::RPC 等いくつかあるが XML をベースにした物はオーバーヘッドが高く最近は利用されなくなっている。

結局自分たちで使用するだけのAPIならプロトコルは自分で決めてしまえばよいのでデータ形式に JSON を使うのは理にかなっているし、メリットも多い。


なにを出来ればよいのかがご自分でもまだよく分かっていないように見える。

たとえば、PHP から perl 側の関数を呼び出したい場合、

$json_obj = file_get_contents('https://user:password@api.example.com/api.pl?arg1=aaaa&arg2=bbbb');
$json = new Services_JSON();
$data = json->decode($json_obj);
print_r($data);

PHPでJSON - Do You PHP?

等としてやればよい。

呼ばれている perl スクリプトが中で何をやっているのかは PHP 側で知る必要は無いし、知らなくても

使えるようにした物を API と呼んでいるだけなので。

id:n_maco2

ご回答いただきありがとうございます。

引数だけ渡して後はperl側で、ということですね。一般的なWebAPIによくあるパターンのように見えます。

心配してた「セキュリティの問題」はただの杞憂だということが他にいただいたご回答で解決しました。

httpsと認証加えれば大丈夫そうですね。ありがとうございます。

2010/06/12 21:58:44
id:koriki-kozou No.6

koriki-kozou回答回数480ベストアンサー獲得回数792010/06/12 21:25:48

ポイント37pt

perlからもphpからも呼ばれるのであれば

・perlから扱いやすい

・phpからも扱いやすい

・仕様変更時にも互いの手間を極力少なくする

などを考慮する必要があり、これらを考慮して個別に設定するよりは、perlでもphpでも扱う環境が既に整っているXMLやJSONなどを利用したほうが仕様書レベルでの手間が少なくて済み、スクリプトを組む際のテストなども容易になるという事


しかしながら、XMLでもJSONでもネイティブではないので変換の手間は結構かかってしまう。

phpがインターフェースでperlがバックでの作業だと思うけど、受け渡すデータによっては

・shell_exec() 出力をスカラーで受け止める

・exec() 出力を配列にて受け止める

でデータを受け取る仕様にしたほうが楽な場合もあり、

データが大量にあるとか、少し複雑なやりとりが発生するなどの状況であれば

・popen()

・proc_open()

が楽な場合もあり、一概には言えないところではあるので、詳細については、やりとりする手順やデータの内容が判らないと決定打は出せない

id:n_maco2

ご回答ありがとうございます。

いろいろな選択肢がありますね。perl側の担当と相談してどれを使うか決めていくのがよさそうです。

参考にさせていただきます、ありがとうございます。

2010/06/12 21:59:36
  • id:n_maco2
    回答に追加の質問を重ねてしまい申し訳ありません。
    追加の質問に対してご回答いただいた場合にもきちんとポイントを付与させていただきたいと思います。
    よろしくお願いいたします。
  • id:KuroNeko666
    id:niwa-mikiho さんではありませんが…
    なぜインターネットの話題になるのでしょうか?
    LAN 内や、サーバ内部(localhost宛)だけで完結させる http 通信であっても、それは http ですよ。
  • id:n_maco2
    ご回答ありがとうございます。
    いわれてみればそうですね。http://127.0.0.1/〜とかを指定してローカル内で済ませればいいだけですね。
    てっきりドメインを書いて、外部に〜という考えになってしまっておりました。
    ご指摘ありがとうございました。
  • id:n_maco2
    みなさんご回答いただきありがとうございました。
    おかげさまでいろいろな選択肢があることを認識できたのと、
    セキュリティ上の懸念も特に問題ないということがよくわかったので、
    大変参考になりました。

    この後は実際に実装を行うもの同士でどこまで必要か検討して、
    どういった手段で実装を行うか決めたいと思います。

    ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません