web-dev-qa-db-ja.com

pythonとphpは一緒に動作しますか?

IOS用に作成されたモバイルアプリを持っています。開発者は、phpでアプリを作成しました。アプリにはアルゴリズムが必要なので、別のプログラマーを開発して見つけました。アルゴリズムプログラマーは、Pythonでアルゴリズムを作成しました。開発者はアプリがpythonでは機能しないと言っているため、アプリの完成を拒否しますが、プログラマーはそうすると主張します。プログラマーは、アルゴリズムをサーバー上に置き、http経由で接続すると言います。これは機能しますか?将来の問題に対してどのくらいリスクがありますか?

5
user71741

これは機能しますか?将来の問題に対してどのくらいリスクがありますか?

はい、それは機能します、そしてそれがどれほど危険であるかはあなたの実装がどれだけ良いかに依存します。これは、正しく行われれば完全に許容されます。 PHPとC、PHPが特定のニッチなタスクをリアルタイムで実行するには遅すぎた場合、(IIRC、PHPは、Cの対応物よりも7倍遅いです)。

最良の実装は、それらが特にPHP/Pythonであるという事実を無視し、それらを2つの別個の言語として扱うことです。

ここで、「標準的な」対話方法を選択する必要があります。おそらくHTTPが最も簡単です。誰もがすでにWebサーバーをセットアップしているので、スクリプトをオンラインに置くだけです。

ここからは、PHP/Pythonであるという事実から離れ、それを知らずにAPIを設計する必要があります。たとえば、電卓があるとします。

<?php
print '<answer>' . ($_GET['one'] + $_GET['two']) . '</answer>';
?>

次に、APIはhttp://location/script.php?one=5&two=7。これは完全に許容できます。APIのユーザーは<answer>タグ(私の例は、単なるデモンストレーションとしての怠惰なXMLですが、出力 [〜#〜] json [〜#〜] )を検討する必要があると思います。これではありません:

<?php
print eval($_GET['expr']);
?>

あなたのAPIはhttp://location/script.php?expr=5+7。同じ答えになる(そして、主要なセキュリティ上の欠陥を無視する)場合でも、呼び出し元はPHP(eval is a PHP関数は入力を実際の値として評価しますPHPコード)。もしそうなら2^3、それは2 xor 3または2 * 2 * 2(2の3乗)。これは悪い設計です。入力は、APIが実装されている言語とは独立している必要があります。さらに、エラーメッセージと回答をどのように区別するのですか? 「応答が数値でない場合」は魔法ではありません。

Python側-HTTPリクエストが正常に失敗することを確認する必要があるだけです。スクリプトに接続できない場合は、おそらく再試行してください。接続に失敗した場合は、後で再試行するように求める素敵なエラーメッセージをあきらめてください。 Pythonスタックトレースを表示するだけではありません。

APIも可能な限り文書化する必要があります。これにより、時間を大幅に節約できます。それぞれの入力がどうあるべきか、どの範囲に含まれるべきかを言い、それを使用する方法の良い例をいくつか挙げてください。

API側-何か問題がある場合は、すぐに失敗するようにしてください。変数が欠落している、不完全である、または無効である場合は、メッセージを出力し、最初に行うこととして終了します。 しないでください値を使用して実行し、PHPエラーメッセージを返すようにします(覚えておいてください、 APIが実装されている言語がわからない、または気にしない)が、使いやすいYou didn't give me a 'two' variable. What do you want me to add 'one' to?

12
Jay

ジェイの答え 正しいですあなたはこのことを行うことができます

これを説明する通常の方法は、pythonアルゴリズム(関数)を「サービス」(スタンドアロンアプリケーション)に開発し、PHPアプリは「消費」します(呼び出しを行います)。アルゴリズムが複雑で、独自のプログラムと見なしたい場合は、これは良いアイデアです。コードをさまざまなレベル(個別のオブジェクト、個別のライブラリ、個別のレベル)の個別の部分に隔離します。サーバー)は、問題の明確な(定義された)分離がある場合に、多くの場合良いアイデアです。

このルートを使用する場合は、HTTP(S)が適切なオプションです。他の簡単なsynchronousオプションは、pythonへの system 呼び出しの使用ですスクリプトを直接、またはスクリプトをラップするデーモンに送信します。これはパフォーマンス上の利点があり、最も高速なソリューションになる可能性がありますが、HTTPSには柔軟性とセキュリティ上の大きな利点があります。

asynchronousオプションが機能する場合は、それをお勧めします。あなたのphpアプリは、(データベースのような)共有された場所に行われるべき作業の記録を残し、あなたのpythonアプリは、行われる必要がある作業を常にポーリングします*。あなたのphpアプリは、完成した作業をチェックし、その結果を使用します。
このような非同期の解決策は、正しく理解するのが少し難しいですが、いったん手に入れれば、本当にいいことです。

(* AWSやAzureなどの大きなクラウドプロバイダーを使用している場合は、投票よりも優れたオプションがある場合があります。)

開発者の異議に注意してください
1つのアプリを複数のアプリに分割する決定は、軽視すべきではありません。システムをより単純な独立した部分に分割する理由はたくさんありますが、請負業者がたまたま「間違った」言語で作品を書いたという事実はそれらの1つではありません。

1
ShapeOfMatter