поиск и устранение неисправностей PHP-скрипта, который не может отобразить полную случайную строку - PullRequest
0 голосов
/ 27 октября 2010

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

Я знаю, что строка содержит полный набор из четырех символов, потому что я отладил это с помощью оператора печати, чтобы показать последнюю переменную сеанса:
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 голосов
/ 03 ноября 2010

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

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

...