後世のためにオリジナルを一番下に保存していますが、結局のところ、これを行う方法があります
使用する必要があるのは、HTTP put メソッド (残念ながら、ネイティブ ブラウザー フォームでは使用できません)、PHPphp://input
ラッパー、およびストリーミング php ソケットの組み合わせです。これはいくつかの制限を回避します - PHP はphp://input
データの投稿を許可しませんが、PUT ファイルデータに関しては何もしません - 賢明です!
Apache でこれを試みる場合は、mod_actions
インストールして有効化する必要があります。また、virtualhost/.htaccessPUT
のディレクティブでスクリプトを指定する必要があります。Script
http://blog.haraldkraft.de/2009/08/invalid-command-script-in-apache-configuration/
これにより、1 つの URL エンドポイントに対してのみ put メソッドが許可されます。これは、ソケットを開き、そのデータを別の場所に転送するファイルです。以下の私の例では、これはちょうどindex.php
画像ファイルを含む put リクエストを送信するクライアントとして python requests モジュールを使用して、このボイラープレートの例を用意しました。を実行するremote_server.py
と、ポートをリッスンし、php から転送されたメッセージを待機するサービスが開きます。 put.py
実際の put リクエストを PHP に送信します。セットアップに応じて、ホストを設定し、仮想ホストで定義したホストput.py
に設定する必要があります。index.php
実行put.py
すると、含まれている画像ファイルが開かれ、php 仮想ホストに送信されます。これにより、ソケットが開かれ、受信したデータが python 疑似サービスにストリーミングされ、ターミナルの stdout に出力されます。ストリーミング PHP フォワーダー!
TCP ポートをリッスンするリモート サービスを同じ方法で、完全に別の言語で使用することを妨げるものは何もありません。クライアントは、PUT 要求を送信できる限り、同じ方法で書き直すことができます。
完全な例は次のとおりです。
https://github.com/DeaconDesperado/php-streamer
私は実際にこの問題をとても楽しんでいました。それがどのように機能するか教えてください。一緒にパッチを当てることができます.
元の回答を開始
ファイルが何らかの方法でディスクに状態を保存せずにリクエスト本文と一緒に来るため、ファイルを非同期的に渡すネイティブな方法は PHP にはありません。これは、サーバーのメモリ制限 (20MB) によってハード バインドされていることを意味します。リクエストが受信された後にスーパーグローバルが初期化される方法は、そのデータを tmp ディレクトリ$_FILES
に移行しようとするため、これに依存します。multipart
ソケットを使用して同様のことを達成できます。これは少なくとも HTTP プロトコルを回避しますが、ファイルが HTTP リクエストで渡された場合、php は何も実行する前にステートフルにメモリに保存しようとします。それと。そこまで到達する実際的な方法がない状態で、プロセスの最後を設定することになります。
Streamライブラリが近づいていますが、サーバー側のメモリからファイルを読み取ることにまだ依存しています - それはすでにそこにある必要があります。
特にリクエストの本文が非常に大きいため、説明しているのはHTTPプロトコルの少し外側です。HTTP は要求/応答ベースのメカニズムであり、一方は他方に依存します... 中間点でインプレースのストリーミング アップロードを達成することは非常に困難です。
これは PHP というよりも HTTP の制限であると主張する人もいるかもしれません。PHP は明示的に HTTP プロトコルを念頭に置いて設計されているため、その快適ゾーンの外を動き回っています。
このような展開は、他のスクリプト言語を使用して定期的に試みられており、高い成功を収めています (たとえば、Python の Twisted では、多くの人が NodeJS の並行設計パターンに乗り出しています。Ruby や Java には、私があまり知らない代替手段があります)。