2011-12-26 6 views
5

私はこれを数時間見てきましたが、私が見てきたことはすべてかなり難しいようです。私は今までのところ私のウェブサイト上のすべての単純なもののためにPHPを使用してきました。私は多くの統計的作業をしています。より強力な計算のためにC++を利用したいと思います。PHPをローカルのC++プログラムとリンクする

C++は、PHPと同じUnixマシン上でローカルに実行されます。次のような

何かは私が行う方法について損失によものです:もちろん

<?php 
//c++ program has a counter initialized to 0 
//PHP tells c++ to add 5 to the counter. $incremented is 5 
$incremented = increment_in_cpp_and_return(5); 
//$incremented_again will be 7 
$incremented_again = increment_in_cpp_and_return(2); 
?> 

、私はいくつかのモンテカルロ・シミュレーションを実行し、代わりにインクリメント番号の本当に大きな木を横断しています、しかし、それは私を抱きしめているものではありません。

C++だけの数をリッスンし、別の数(最大でJSONで多分いくつかのもの)を返す必要があります。 C++では、呼び出し間の変数を追跡することが重要です。

私はなど、TCP、ソケットプログラミングで読んをたくさんやったし、私はこれが例のように複雑になるためにそれを作ることをちょっと疑わしいです。多くのことが私にこれを指摘していますhttp://beej.us/guide/bgnet/output/html/multipage/clientserver.html#simpleserver

本当に100行以上のC++がある場合は、いくつかの人気のあるライブラリがありますか、別の言語で簡単に実装されていますか?

ありがとうございます!

+0

@therefromhere:完了:http://stackoverflow.com/a/8639563/367456 – hakre

+0

私は、C++が呼び出しの間にどのように状態を保持しているか少し混乱しています。 proc_openを使用して、STDIN経由で継続的に実行されているC++プログラムに渡すことはできますか?私はそれがC++の新しいインスタンスを開始することを心配しています... – dcc310

+0

私の答えとコメントを下に見てください... – Paul

答えて

2

あなたは試みることができる: exec()

あなたが実行され、あなたがC++プログラムの実行後にPHPでそれを使用できるようにプログラムが出力を返しますC++に書かれたプログラムの引数としてPHPからデータを送信します。私は、リモート・プロシージャのgSOAP使用してきた

+0

"C++は呼び出し間の変数を追跡することが重要です。" - それで、execはそれをカットしません。 –

+0

Hmmm、彼は永続的なデータストレージのためにデータベースまたはファイルを使用することができました! – Paul

5

PHPからC++プログラムにアクセスしたい場合(またはC++コードのWebフロントエンドとしてPHPを使用する場合)、ソケットを介して通信する代わりに、C++コードをPHPに埋め込みます。

かなりの量の定型文がありますが、そのほとんどはext_skelスクリプト(PHPソースに含まれています)によって生成されます。

PHPエクステンションを書くことについてのオンラインほとんどの情報は、このためにC++を使用してに関連する落とし穴のカップルのためExtending PHP with C++?を参照して、Cを使用することに関する。

3

あなたのC++がexecuteableであれば、あなたは、プログラムとしてそれを開くSTDINを経由して、それにデータを渡すとSTDOUTを経由して戻ってPHPへの戻り値を渡すことができます。 proc_open­Docsを参照してください。あなたはすでにあなたが必要なものを持っているので、STDINやSTDOUTへのアクセスを提供する必要があります++ライブラリ

あなたの標準C。

私は、C++が呼び出しの間にどのように状態を保持しているか少し混乱しています。 proc_openを使用して、STDIN経由で継続的に実行されているC++プログラムに渡すことはできますか?それはほとんどのオペレーティングシステムでサポートされて、:それはあなたがNamed pipe­Wikipediaを探しているかもしれないC++

の新しいインスタンスを開始することを、私は心配して、プロセス間通信の形式は、(What are named pipes?としても参照します)。それはSTDINとSTDOUTと比較して単純なI/O(FIFO)であり、類似しています。他のプロセスがデータを送信できる間に、実行可能ファイルをメモリに保持することができます。

もう一つの簡単な方法はソケットを使用することです。これらのソケットはPHPでもサポートされており、C/C++と一緒にいなければなりません。ソケットはさまざまなマシン間で動作するため、たとえば、計算だけを行う専用サーバー上で(メモリ/ CPU集約型)独自の実行可能ファイルを実行できます。ちょうど私があなたがプロセス間通信をお探しのコメントからあなたのケースでは、どのようなものが良い見た目に見えます。

(これらはほんの一部の資源である、あなたは自然に少し研究して詳細を見つけることができ、私は名前付きパイプとソケットの両方のためだと思いますあなたのケースのソースコードの例を見つけることができるはずです)

+0

@ dcc310これを行うと、PHPプログラムから 'proc_open'を1回だけ呼び出すことができます(その実行の残りの部分でパイプの配列を使用することができます)ので、PHPプログラムの実行ごとに1つのC++プログラムのインスタンスを持つことができます。それはあなたが必要とするものですか? –

+0

私はあなたがC++の実行可能ファイルをメモリに残しておきたいとは思っていませんでした。私は、プロセス間通信のための2つの方法について答えを広げました:* named pipes *と*ソケット*。 – hakre

+0

申し訳ありませんが、私は物事を試してみてください。私は複数のPHPスクリプトに1つのC++インスタンスを保持するために、C++でさらに多くの "サーバー"を探していました。名前付きパイプのソリューションは私のためにうまく動作します:)これを試している他の人のために、私はこれらのリンクが多少役立つことがわかりました:http://my.opera.com/zomg/blog/2007/08/29/php-and-named -pipes and http://squirrelshaterobots.com/programming/php/building-a-queue-server-in-php-part-3-accepting-input-from-named-pipes/およびhttp://squirrelshaterobots.com/プログラミング/ php/building-a-queue-server-in-php-part-3-accepting-named-from-named-pipes / – dcc310

関連する問題