2010-10-27 69 views
0

我对表单使用验证码脚本。奇怪的是,图像经常无法渲染随机字符串的第一个字符。在重新建立预期行为之前,此模式将持续大约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); 
+1

你能提供代码摘录吗? – SW4 2010-10-27 14:22:20

+0

它们都是字符串中的标准字符吗? – tplaner 2010-10-27 14:28:34

+0

你好,是的 – xtian 2010-10-28 13:52:27

回答

0

我做了一些阅读在php.net我通常害怕进行故障排除在网站上的Cuz找到匹配的一个意想不到的结果是困难的。不过,我在注释中发现imagettftext()的角度参数在设置多行时遇到了麻烦。由于此功能的输出部分是放置值,因此可能是我缺少字符的原因。

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