我对表单使用验证码脚本。奇怪的是,图像经常无法渲染随机字符串的第一个字符。在重新建立预期行为之前,此模式将持续大约8-12次刷新页面。解决无法呈现完整随机字符串的PHP验证码脚本
我知道这个字符串包含了全部四个字符,因为我用一个打印语句调试了这个以显示上一个会话var:
1)图像加载时缺少第一个字符;
2)刷新页面上显示的最后四个字符串与打印;
3)comparrison确认第一个字符没有在最后的验证码图像中呈现;
此脚本使用会话。该脚本还从两个不重叠的值范围中设置背景的颜色和文本的颜色。这只发生在远程共享主机站点上,而不是我的本地测试站点。
我在想我的远程站点在某处添加延迟。或者用于生成图像的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);
你能提供代码摘录吗? – SW4 2010-10-27 14:22:20
它们都是字符串中的标准字符吗? – tplaner 2010-10-27 14:28:34
你好,是的 – xtian 2010-10-28 13:52:27