устранение неполадок скрипта PHP captcha, который не может отобразить полную случайную строку

Я использую сценарий капчи для формы. Как ни странно, изображение часто не может отобразить первый символ строки случайных символов. Этот шаблон будет длиться около 8-12 обновленных страниц, прежде чем ожидаемое поведение будет восстановлено.

Я знаю, что строка содержит полный набор из четырех символов, потому что я отладил это с помощью оператора печати, чтобы показать последнюю переменную сеанса:
1) изображение загружается без первого символа;
2) при обновлении последний на странице с печатью выявляется четырехсимвольная строка;
3) сравнение подтверждает, что первый символ не отрисовывался в последнем изображении капчи;

Этот скрипт использует сеансы. Скрипт также задает цвет фона и цвет текста из двух непересекающихся диапазонов значений. Это происходит только на удаленном общем хост-сайте, а не на моем локальном тестовом сайте.

Я думаю, что мой удаленный сайт где-то добавляет задержку. Или, может быть, теги PHP, используемые для создания изображения (imagecolorallocate(), imagecreate(), imagepng(), imagettftext(), imagettfbbox()), имеют некоторую встроенную задержку, которую я не учел. Может быть, есть способ настроить файлы php.ini или .htaccess?

ОБНОВЛЕНИЕ =

Результаты испытаний ...Код:

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); 

person xtian    schedule 27.10.2010    source источник
comment
Можете ли вы предоставить выдержку из кода?   -  person SW4    schedule 27.10.2010
comment
Являются ли они всеми стандартными символами в строке?   -  person tplaner    schedule 27.10.2010


Ответы (1)


Я кое-что почитал на php.net. Я обычно опасаюсь устранения неполадок на сайте, потому что найти совпадение с неожиданным результатом сложно. Однако я обнаружил в комментариях, что параметр угла для imagettftext() создавал проблемы для некоторых при установке нескольких строк. Поскольку вывод этой функции частично является значением размещения, это было возможной причиной отсутствия моего символа.

Я исключил случайное значение для первого символа. Пока моя проблема решена. Крис

person xtian    schedule 03.11.2010