ホームページ >バックエンド開発 >PHPチュートリアル >nginx は XSendfile モジュールを使用して、PHP ファイルのダウンロードを高速化します。
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 ほど複雑ではなく、コンポーネントの再読み込み、コンパイルなどを行う必要があります。さて、構成ファイルとコードを投稿します。
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//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