对无法呈现完整随机字符串的PHP验证码脚本进行故障排除

时间:2010-10-27 14:19:56

标签: php image-processing performance shared-hosting

我正在为表单使用验证码。奇怪的是,图像经常无法呈现随机字符串的第一个字符。在重新建立预期行为之前,此模式将持续约8-12个刷新页面。

我知道该字符串包含完整的四个字符集,因为我使用print语句对其进行了调试,以显示最后一个会话var:
1)图像加载缺少第一个字符;
2)刷新最后四个字符串在页面上显示打印;
3)比较确认第一个字符没有在最后一个验证码图像中呈现;

此脚本使用会话。该脚本还从两个非重叠值范围设置文本的背景颜色和颜色。这仅发生在远程共享主机站点上,而不是我的本地测试站点上。

我认为我的远程站点正在某处添加延迟。或许用于生成图像的PHP标签(imagecolorallocate(),imagecreate(),imagepng(),imagettftext(),imagettfbbox())都有一些内置的延迟我没有考虑到。也许有办法调整php.ini或.htaccess文件?

UPDATE =

测试结果......代码:

01  --------------------------------------
02  test     $_SESSION VAR     IMG VALUE
03  --------------------------------------
04  0                                  2UV
05  1            Q2UV             UMV
06  2            CUMV             KON
07  3            5KON             D93
08  4            MD93             4GH
09  5            T4GH             8BH
10  6            V8BH             UBJ
11  7            WUBJ             AMN9
12  8            AMN9 ...Next 50+ are OK

你可以看到它永远是第一个角色。

PHP代码:

13        $char_spacing = 200 / 4; 
14        $font_list = array("arial.ttf", "castelar.ttf", "gibli.ttf", "lfaxi.ttf");
15        /* toggle for speed test $font_list = array("arial.ttf", "arial.ttf", "arial.ttf", "arial.ttf"); */
16        //start image creation 
17        if (!function_exists('imagecreate') || !function_exists("imagepng") || !function_exists("imagecolorallocate") || !function_exists("imagettftext") || !function_exists("imagettfbbox") || !function_exists("imagedestroy")) 
18        { 
19            return false; 
20        } 
21        $image = @imagecreate(200, 50); 
22        if(!$image){ 
23            return false; 
24        } 
25        $background_color = imagecolorallocate($image, rand(150,255), rand(150,255), rand(150,255));    
26        //draw in some noise 
27        for($i = 0; $i < 15; $i++){ 
28            $rand_colour = imagecolorallocate($image, rand(120, 250), rand(120, 250), rand(120, 250)); 
29            imageline($image, rand(0, 200), rand(0, 50), rand(0, 200), rand(0, 50), $rand_colour); 
30        } 
31     
32        //generate random string 
33        for ($s = '', 
34            $i = 0, 
35            $z = strlen( 
36                "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789" 
37            )-1; 
38            $i != 4; 
39            $x = rand(0,$z), 
40            $s .= "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"{ 
41                $x 
42            }, 
43            $i++ 
44        ); 
45        $_SESSION[$captcha_det['session_id']] = $s; 
46        for($i = 0; $i < strlen($s); $i++){ 
47            $font = $font_list[array_rand($font_list)]; 
48            $colour = imagecolorallocate($image, rand(0, 100), rand(0, 100), rand(0, 100)); 
49            $font_size = rand(16, 22); 
50            $angle = rand(-30, 30); 
51            $char_dets = imagettfbbox($font_size, $angle, $font, $s[$i]); 
52            $x = ($char_spacing / 4) + ($i * $char_spacing); 
53            $y = (50 / 2) + (($char_dets[2] - $char_dets[4]) / 4) + rand(5, 10); 
54            imagettftext($image, $font_size, $angle, $x, $y, $colour, $font, $s[$i]); 
55        } 
56        imagepng($image); 

1 个答案:

答案 0 :(得分:0)

我在php.net上做了一些阅读我一般都害怕在网站上进行故障排除因为找到意外结果的匹配很困难。但是,我在评论中发现,在设置多行时,imagettftext()的angle参数给某些人带来了麻烦。由于此函数的输出部分是放置值,因此可能导致我缺少字符。

我删除了第一个字符的随机值。到目前为止,我的问题已解决。克里斯