嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

周梦康 发表于 2015-06-16 10478 次浏览 标签 : Nginx

场景: 例如用户访问 http://user.topit.me/static/user/1.jpg 该图片不存在时,那么就转发到 http://log.topit.me/static/user/creat.php 生成该图片.

在写 nginx 配置的时候遇到了点问题

#如果这样写,导致访问不存在的图片时,直接下载 php 文件了,php 文件无法解析
location  ^~/static/user/
{
    if (!-f $request_filename) {
        rewrite ^/(.*)$  /static/user/create.php last;
    }
}

location ~ .*\.(php|php5)?$
{
  fastcgi_pass  127.0.0.1:9000;
  fastcgi_index index.php;
  include fcgi.conf;
}
#如果这样写,访问不存在的图片时能生成图片,但是访问已经存在的图片时则无法访问
location ^~ /static/user/
{
	if (!-e $request_filename)
    {
    	rewrite ^/(.*)$ /static/user/create.php last;
    }
	fastcgi_pass  127.0.0.1:9000;
  	fastcgi_index index.php;
  	include fcgi.conf;
}

最后的配置如下 (把 create.php 文件从该目录移出去):

location  ^~/static/user/
{
    if (!-f $request_filename) {
        rewrite ^/(.*)$  /static/create.php last;
    }
}

location ~ .*\.(php|php5)?$
{
  fastcgi_pass  127.0.0.1:9000;
  fastcgi_index index.php;
  include fcgi.conf;
}

php 代码

<?php
@ob_start('ob_gzhandler');
$request_uri = $_SERVER['REQUEST_URI'];
if (!empty($request_uri)){
    if(preg_match("/favicon\.ico/",$request_uri)){
        exit;
    }
    if(preg_match("/default/",$request_uri)){
        exit;
    }   
}

header('Content-Type: image/jpeg');
$content = file_get_contents("http://f0.topitme.com/0/12/37/113278636933437120l.jpg");
file_put_contents("./1.jpg", $content);
header('Content-Length: '.filesize("1.jpg"));
echo $content;
exit;

但是有一个问题,在第一次生成图片的时候图片已经输出,但是连接似乎一直都在,浏览器上一直转圈圈.

记录一次 nginx 配置,某个目录下特定图片不存在的情况转发直接用 php 生成输出

我想执行 php 脚本到返回到客户端的时间应该就是上面这张图的时间(118ms),但是一直等到整个请求完毕则是1分钟,而这个1分钟应该是nginx.conf里面的keepalive_timeout 60

既然这样,那我就把这个 http 返回设置为不使用长连接.header('Connection: Close');但是再刷新发现请求还是Connection:keep-alive

转圈的问题找到原因了,原来是在输出的时候开启了压缩,最后实际输出的内容比我在 http 头里面声明的内容大小小,所以会导致导致客户端一直处于请求状态.把第一行的开启缓存给关闭就 OK 了.

嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表