私はこのウェブサイトを持っていますが、ユーザーがフォームを送信すると、PythonスクリプトはPHPページで実行され、Pythonスクリプトはzipファイルを生成してリンクからダウンロードできるようにユーザーに提供する必要があります。ファイルは容量が大きい場合があります(数GB)。
私は大学のサーバーで働いているので、そのサーバーのルールと機能に厳密に従います。問題はこれである:
ウェブサイトは/data/mywebsite
限られたディスク容量に保存されています。もちろん、www-data
これは主に私のApacheサーバーからアクセスされるので、このファイルは私の所有です。
/experimentdata/
たとえば、1人のユーザーだけがアクセスできる1TBのストレージスペースがありますtheuser
。これは、フォルダがSambaにマウントされており、単一の特定のユーザーIDでアクセスできるためです。
からファイルを生成するために/experimentdata
ユーザーとしてファイルを生成するコマンドを使用しますsudo -u theuser
。今私の質問は:Apacheダウンロードリンクを介してこのファイルをどのように提供できますか?/experimentdata/downloadme.zip
theuser
たとえば、私が入れたシンボリックリンクを使用しようとしました/data/mywebsite/download/downloadme.zip
。問題は、ユーザーがwww-data
ファイルを読み取る権限がないことです!
ユーザーに/experimentdata/downloadme.zip
ユーザーと一緒にファイルをダウンロードさせるにはどうすればよいですか?www-data
theuser
明らかに言いたいのは、sudo -u theuser
参加することが絶対に大丈夫だということです。しかし、私のウェブサイトのフォルダの外に接続する方法がわかりません。
PS:他の情報が必要な場合はお問い合わせください。
答え1
私の考えでは、データを直接インポートまたは返すことをお勧めしphp
ます。コードも同じことができます。私の経験では、これは他のディレクトリを開いたり、ファイル権限などを使用したり変更したりするよりもはるかに優れています。python
apache
apache
sudo
apache
プログラムがインターネット接続速度よりも速く大量のファイルを生成すると、プログラムが直接データをストリーミングできるため、それを管理するための追加のデータファイルとコード、およびそれを記憶するメカニズムが排除されます。
Stack Overflowに対するこの回答は、.NETでコードがどのように機能するかを示していますphp
。https://stackoverflow.com/a/4357904/5484716。
このように呼び出されたプログラムの場合は、すべてのstderr
ストリーム出力を削除し、Pythonプロセスの戻りコードがプロセスの成功または失敗を正確に反映していることを確認してください。
次の例は、popen()
上記のstackoverflowの例のシナリオで使用する呼び出しを示しています。exec 2>/dev/null;
シェルコマンドの前に追加しました。これにより、データがstderr
すべてから来るため、stdout
デッドロックの原因となる可能性があるシェル自体でも出力は標準エラーに移動しませんpopen()
。
ユーザーにディスクファイルをダウンロードするには:
$fp = popen('exec 2>/dev/null; sudo -u theuser cat yourfile.zip', 'r');
アクティブプロセスからデータをダウンロードするには:
$fp = popen('exec 2>/dev/null; sudo yourpythonscript arg argN', 'r');
このコマンドラインはいこれはシェルコマンドであり、シェルメタ文字について適切に引用する必要があります。
第2の方法では、サーバは即座にデータ転送を開始する。ユーザーがフォームを正常に送信すると、ブラウザに別名で保存ダイアログボックスがすぐに表示されます。ユーザーが出力ファイルを選択すると、php
スクリプトは有線でデータをリモートファイルに直接転送します。
スクリプトpython
を印刷する必要があります。ただzip データを標準出力として返し、zip プロセスの成功または失敗を正確に示す終了コードを返します。たとえば、python
スクリプトでは出力を作成する必要があります。sys.stdout
zf = ZipFile(sys.stdout, ...
pclose()
呼び出して戻り値を確認することが重要です。、これがzipが成功したかどうかを知る唯一の方法だからです。ゼロ以外の値が返された場合はpclose()
問題があります。
クライアントがファイルを処理する方法は、次の設定やresponse headers
その他の設定によって異なりますcontent-type:
。content-encoding:
content-disposition:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html、表示response-header
およびentity-header
情報。