在前面加 ob_clean();

    /**
     * thinkphp3 生成验证码
     */
    public function verify() {
        ob_clean();
        // header("Content-Type: image/png");

//        error_reporting(E_ALL);
//        ini_set('display_errors', 1);
        $config = array(
            'fontSize'    =>    30,    // 验证码字体大小
            'length'      =>    3,     // 验证码位数
            'useNoise'    =>    false, // 关闭验证码杂点
            'fontttf'     =>    '5.ttf'
        );
        $v = new Verify($config);
        $v->entry();
    }

ThinkPHP/Library/Think/Verify.class.php

查看这个方法

        header('Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate');
        header('Cache-Control: post-check=0, pre-check=0', false);
        header('Pragma: no-cache');
        header("content-type: image/png");

        // 输出图像
        imagepng($this->_image);
        imagedestroy($this->_image);

最后输出图像的方法 所以不需要再设置Header  Content-Type字段

 

1. ob_clean这个函数的作用:
用来丢弃输出缓冲区中的内容,如果你的网站有许多生成的图片类文件,那么想要访问正确,就要经常清除缓冲区

控制台报错: Unchecked runtime.lastError: The message port closed before a response was received.


2. 在出现问题的页面查看源代码,发现在页面尾部出现了一堆其他代码(原因不明)

3. 这是UTF-8的BOM问题,一般是入口文件或controller文件保存格式带了 BOM 标签。

 

图片hexdump结果:

 hexdump verify.png
0000000 ef bb bf 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49
0000010 48 44 52 00 00 00 b4 00 00 00 4b 04 03 00 00 00
0000020 2b 27 b0 cd 00 00 00 1b 50 4c 54 45 f3 fb fe 07
0000030 2e 3e 9a ae b6 5f 7a 86 42 61 6e 7d 94 9e b8 c7
0000040 ce 24 47 56 d5 e1 e6 30 63 61 6a 00 00 00 09 70
0000050 48 59 73 00 00 0e c4 00 00 0e c4 01 95 2b 0e 1b
0000060 00 00 02 97 49 44 41 54 58 85 ed 96 4d 6b db 40
0000070 10 86 77 9c 5a d6 51 1b a9 71 8e 76 0b ee 35 a2
0000080 0d f4 58 61 88 af 8d d3 d2 1e 95 b4 05 1f eb 92
0000090 40 8f 2a 85 e0 9f 5d cd 8e 64 ad f6 43 da 28 e8
00000a0 50 d8 21 10 98 9d 7d 76 f4 be a3 95 19 f3 e1 c3
00000b0 87 0f 1f 3e 7c f8 f8 1f a2 18 8d fc ed e7 58 e4
00000c0 ef fc e3 48 e4 37 9c 17 a3 91 13 2d b9 be dc ae
00000d0 0e cf 04 87 5f 38 e7 a7 5a 7a 59 66 f9 82 fd 2d
00000e0 4f d8 0d 25 5f 23 43 77 11 30 9d 33 5c 8d 07 92
00000f0 d3 04 19 ba 8b d8 f5 9c b1 bd f1 91 5c 22 c8 e2
0000100 1d a2 0b 6d 25 2d b3 2f 59 80 8b d1 10 72 98 c5
0000110 c5 09 37 b9 c8 90 79 c6 70 91 7f 18 82 66 77 05
0000120 9b 19 1f 79 42 0e cc c8 4c a7 98 bc bb 5c b5 33
0000130 4b a3 8b 27 e4 c0 2d fe d3 29 60 d0 28 40 5b e6
0000140 eb 55 d1 a4 32 a3 8b 40 0e a4 96 01 31 9c f7 87
0000150 57 b1 5e 54 99 d0 ec 62 35 20 dc 32 20 a0 9b 8b
0000160 5d f0 c3 8f b2 f7 79 85 9b 0a 17 c3 f4 4a eb b9
0000170 73 40 b4 bc 68 31 a6 69 bd a0 94 70 31 c8 e6 0b
0000180 79 5f 24 d0 e7 a4 f8 85 09 0d aa 09 53 da 31 91
0000190 46 0a 8d 3a cd 92 5c 26 03 a7 b6 23 b0 0f 08 57
00001a0 1e 68 46 cc 99 f4 02 0a 89 14 72 c4 63 de 84 91
00001b0 ac b1 97 74 31 2c 9b 1d 24 51 a1 90 41 22 5b 6f
00001c0 10 68 1d bc 27 df 33 e1 91 88 a9 4a 06 24 47 12
00001d0 ba e3 06 91 d8 c2 f0 64 17 90 e2 22 4a 6d 1e 64
00001e0 32 8b 04 39 15 4c b0 0e 88 cc 16 05 c2 f0 f5 66
00001f0 2f 99 73 cb 1f da c5 00 b5 20 e7 ec 85 75 40 8e
0000200 cf 58 b3 27 f4 7a 3c be de dc 7f ad d6 d2 5f ed
0000210 52 88 44 db d7 65 e1 6f 7a c1 f2 2e 74 23 0a 3e
0000220 e7 b6 55 7b d5 2e 44 6e 89 a7 29 e5 ea 80 75 b1
0000230 83 4f 28 c6 fd d6 f6 49 12 dc 08 61 c1 ab cf 6f
0000240 51 b9 24 ef 65 1f 45 b9 bb 11 f4 dc 58 44 72 34
0000250 89 f0 50 94 3b 7b d0 f2 14 3e de 6c de 1b 6b 6a
0000260 39 94 9d fd 5f 99 3e e5 a0 91 43 d9 d8 8b 66 9d
0000270 ef 2d 94 77 92 22 47 b3 d4 cf 06 3b 1c 2f 3b 30
0000280 c9 41 8b ce 6c b5 14 04 96 da 36 ee 73 68 bb 16
0000290 45 a6 e3 07 03 ff a8 6d 4b 4b 4e bf 17 e4 4b 8d
00002a0 ce e0 c8 ac db b6 75 e4 f6 5b 44 65 cb 6d db 1b
00002b0 72 42 ab 8d 1f db ee de e3 c6 56 e0 55 db dd 5b
00002c0 a4 c1 ea 3b 45 69 db a5 9b 7a a7 55 36 03 bd bf
00002d0 b4 aa 16 47 b8 8d cb 93 a2 7e c4 c8 55 76 f7 80
00002e0 da 19 07 41 86 b1 ed c3 ff 7c b6 f3 1c 3e 9d 3d
00002f0 82 d6 47 f8 38 64 1f 3e 5c e2 1f bd 1e 5d 17 ce
0000300 61 3f 1b 00 00 00 00 49 45 4e 44 ae 42 60 82   
000030f

验证验证码:

use Think\Verify;

$v = new Verify();

// 图形验证码正确?
$data = $v->check($code); // true, false