ホームページ >バックエンド開発 >PHPチュートリアル >nginx は XSendfile モジュールを使用して、PHP ファイルのダウンロードを高速化します。

nginx は XSendfile モジュールを使用して、PHP ファイルのダウンロードを高速化します。

WBOY
WBOYオリジナル
2016-06-20 12:29:111346ブラウズ

nginx は XSendfile モジュールを使用して PHP ファイルのダウンロードを高速化します

https://www.markdream.com/technologies/programs/nginx-x-accel-redirect -php-practise.shtml?utm_source=tuicool&utm_medium=referral

はじめに

最近少し時間ができたので、[email protected]

PHP でファイルのダウンロードを高速化しましょう」を使用してください。実際のプロジェクトのシナリオでは、添付ファイルのダウンロード機能を最適化する必要があります。 Niao 兄弟の記事では主に、Apache に基づいた XSendfile の説明を紹介しています。私は少し強迫性障害を持っています。私の Web サーバーは nginx なので、XSendfile は nginx の公式 Web サイトに基づいています。 .

この変換メモについて説明します。

私の Webroot ディレクトリは /var/vhost/demo にあります。demo ディレクトリには、uploadfiles フォルダがあります。このフォルダには、ユーザーがアップロードしたファイルが保存されます。たとえば、ユーザーが hello.docx ファイルをアップロードする場合、直接パス「http://demo.markdream.com」を使用する場合、対応する物理パスは /var/vhost/demo/xsendfile/uploadfiles/hello.docx になります。 /xsendfile /uploadfiles/hello.docx" の場合、このファイルのダウンロード統計を実行したり、エンティティ パスを非表示にしたりする場合は、php readfile() メソッドを使用してファイルをメモリにロードし、クライアントに転送するしかありません。ファイルが大きすぎると、サーバーが非常にハングアップする可能性があります。したがって、PHP のダウンロード方法を改善する必要があります。これは、冒頭で説明したように、nginx の XSendfile メソッドを使用してクライアントにファイルを転送することです。nginx をインストールすると、「sendfile on;」と表示されます。 ", OK は、直接使用できることを意味します。Apache ほど複雑ではなく、コンポーネントの再読み込み、コンパイルなどを行う必要があります。さて、構成ファイルとコードを投稿します。

私の nginx 仮想ホスト構成ファイル

server {        listen 80;        server_name demo.markdream.com;        root /var/vhost/demo;        index  index.php;		# 这个是定义读取你的文件的目录的url开头  直接访问是不可以的 只能通过        location /protected {                internal;                alias   /var/vhost/demo/uploadfiles;        }        location ~ \.php$ {           fastcgi_pass   127.0.0.1:9000;           fastcgi_index  index.php;           fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;           include        fastcgi_params;        }}

簡単な php ダウンロード ファイル スクリプト、downloads.php

<?php//eg: http://demo.markdream.com/xsendfile/downloads.php?filename=hello.docx// 获取文件名$filename = $_GET["filename"];// 你可以在这里写下你的查询数据库等你所想的功能 ……header ( "Content-type: application/octet-stream" );// 处理中文文件名$ua = $_SERVER ["HTTP_USER_AGENT"];if (preg_match ( "/MSIE/", $ua )) { $encoded_filename = rawurlencode ( $filename ); header ( 'Content-Disposition: attachment; filename="' . $encoded_filename . '"' );} else if (preg_match ( "/Firefox/", $ua )) { header ( "Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"' );} else { header ( 'Content-Disposition: attachment; filename="' . $filename . '"' );}// 就这么简单一句话搞定 注意“protected”是和nginx配置文件的 protected要一致header("X-Accel-Redirect: /protected/" . $filename);?>

楽しいデモ

http: //demo.markdream.com/xsendfile/downloads.php?filename=hello.docx

リファレンス

  1. http://wiki.nginx.org/XSendfile
  2. http://www.laruence.com/2012/05/02/2613.html
  3. http://kovyrin.net/2006/11/01/nginx-x-accel-redirect-php -rails/

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。