2017-04-06 10 views
0

サーバAで1つのPHPユーザプロセスが別のサーバBからhttp://ストリーム経由でデータを要求でき、サーバBが複数のファイルを返すことができる必要がありますストリームを介して。複数のファイルをストリーム間でPHPプロセス間で渡す

ユーザープロセスは、ファイルの1つを外部クライアントに送信し、残りをサーバーAにローカルに保存する必要があります(後でクライアントによって要求される)。基本的には、画像ファイルを添付したsvgファイルを送信しています。

私はこれをシングルストリームで行いたいと思います。私はサーバーBのディスクに何も保存しておらず、ユーザーがそれを1つずつ要求してもらいたい。

これを行う最もクリーンな方法は何ですか? ありがとう!

+1

あなたの質問の現在の文言では、あなたは「他人をローカルで保存する」と言っているが、同時に「何かをディスクに保存したくない」と言っている。私はあなたが "ローカルに他の人を保存する"ことで、あなたが欲しい、または意味していることを理解していません。 –

+0

コメントありがとうございます。私はその質問を明確にした。私は後ですべてのファイルをクライアントに送るというオプションを探るかもしれませんが、今のところこれは必ずしも必要ではありません。 – Vakarelov

答えて

0

ストリームには、好きなだけ書くことができます。受信側(サーバーAのPHP)は、次の各ファイルの開始位置を認識できる必要があります。あなた自身のためにいくつかのプロトコルを考えることができます。 TLVをストリームに書き込むか、各ファイルの内容の先頭にファイル内容のバイト数を付加します。この提案では、ファイル名が失われるので、それらも組み込む必要があることに注意してください。しかし、おそらく最も良い方法は既存の標準を使用することです。 Linuxの世界では、人々はしばしばTARやTAR-GZを使っています。あなたはそれを調べたり、代わりにZIPを使うことができます。 This questionには、その操作方法に関するオプションがいくつか含まれています。どちらの提案もライブラリを使用しています。

別の方法として、tempnameを使用して一時ファイルを使用しています。ただし、ファイルを保存する必要はありませんが、クリーンアップを管理する必要はありません。サーバBがメモリ内にtempdirを持つように設定されている場合は、あなたの要件を満たしています:-)

Here is a similar question on TAR-GZ。そして、this questionの2番目の答えは、コマンドラインtarを使ってコマンドを実行する方法を示しています。stdoutへのコマンドの書き込みは、PHPシェルの実行(さまざまなレベルのエラー処理を可能にするさまざまなオプション)を介してPHPから呼び出されます。

私は電話でこれを書いているので、私は試してみることはできませんし、例を提供します。今週末には、デモのための作業コードを編集して追加する時間があります。あなたはそれに私を打つ自分ならばここで

+0

まず、ZipArchiveオプションを探求します。プロトコルを書くことは、システムが壊れるかもしれない別の場所に過ぎません。アーカイブをクライアントに直接渡して、JSで処理させることも考えられます。一時ファイルについて、私が避けたいのは、サーバーAが各ファイルを個別に要求することです。 "ファイル"は決して実際にはサーバB上のファイルではありません。彼らはちょうど刺青やデータストリームです。 – Vakarelov

0

が、私はバンレイバンの提言のいくつかの次なかったものです:-)ことを行うにはお気軽に:サーバB側では

を、私はmaennchen/ZipStream-PHPを使用しましたコンポーネントは、このような呼び出しを使用して、コードの異なる部分で:サーバB側の

$zipArchive = new ZipStream(); 
$zipArchive->addFile($file_name, $image->getImageBlob()); 
$zipArchive->addFile($this->getId().".svg", $svg); 
$zipArchive->finish(); 

Iは、受信したファイルを処理するためZIPARCHIVE()クラスを使用します。

私は2つの異なるが接続されている理由のためのソリューションと完全に満足していない、と私は、コミュニティが私を改善に役立たせていただきますことを期待しています:

  1. ZipStreamコンポーネントは、出力バッファに直接 にコンテンツを送信すべてのaddFile呼び出しで、副作用として発生します。これは、オブジェクト指向の良い の練習に違反します。オブジェクトによって返される任意のストリームリソース を使用する方が良いでしょう。
  2. ZipArchiveは何らかの理由でファイルシステムからファイルをロードするだけです。私はzipデータをファイルに書き込んで、 のZipArchiveオブジェクトで開くことができなければなりませんでしたが、それは道徳的には が間違っていますか?

両方のライブラリは、PHPの優れたストリームを十分に活用していません。どのようにこれを行うにはどのような考え?

関連する問題