验证码只会更新一次会话变量吗?

时间:2015-11-25 19:34:45

标签: php session

我有一些代码生成CAPTCHA作为图像文件,我在 myForm.php 中请求CAPTCHA如下:

...
    <div class="form-group img">
        <img src="../path/to/my/captcha.php?form=myForm">
    </div>
...

captcha.php 代码如下:

<?php
error_reporting(E_ALL & ~E_NOTICE);
session_start();
include('captcha-gen.php');
$captcha = new captcha();
$_SESSION[$_GET['form']]['captcha_keystring'] = $captcha->getKeyString();

会话仅在生成的图像中第一次使用CAPTCHA代码进行更新。如果我刷新页面,则会生成新的CAPTCHA图像,但$_SESSION[$_GET['form']]永远不会再次更新。

同样的CAPTCHA在localhost上工作得很好,但是当我发布网站时遇到了这个问题,请指出可能出现的问题。

  

更新

我对此进行了大量调查,验证码似乎在两个案例的会话中发生了变化:

  1. 第一次加载
  2. 如果文件 captcha.php
  3. 中的任何代码发生了变化

    我认为这是一个缓存问题,虽然我尝试了各种通过PHP标头或html <meta http-equiv清除缓存....但它从未起作用......

    以下是完整的文件列表:

    验证码-config.php中

    <?php
    $use_symbols = "012345679"; 
    $use_symbols_len=strlen($use_symbols);
    
    $amplitude_min=10;
    $amplitude_max=20; 
    
    $font_width=25; 
    
    $rand_bsimb_min=3; 
    $rand_bsimb_max=5; 
    
    $margin_left=10;
    $margin_top=50; 
    
    $font_size=40;
    
    $jpeg_quality = 90; 
    $back_count = 1; 
    $length = 6; 
    
    ?>
    

    验证码-gen.php

    <?php
    require_once(dirname(__FILE__).'/captcha-config.php');
    
    class captcha
    {
        function captcha()
        {
            require(dirname(__FILE__).'/captcha-config.php');
    
            $this->keystring='';
    
            for($i=0;$i<$length;$i++)
                $this->keystring.=$use_symbols{mt_rand(0,$use_symbols_len-1)};
    
            //echo $this->keystring . '<br />';
    
            $im=imagecreatefromgif(dirname(__FILE__)."/back.gif");
            $width = imagesx($im);
            $height = imagesy($im);
            $rc=mt_rand(120,140);
            $font_color = imagecolorresolve($im, $rc, $rc,$rc);
            $px =$margin_left;
    
    
            For($i=0;$i<$length;$i++)
            {
                imagettftext($im,$font_size,0,$px, $margin_top,$font_color,dirname(__FILE__)."/CARTOON8.TTF",$this->keystring[$i]);
                $px+=$font_width+mt_rand($rand_bsimb_min,$rand_bsimb_max); 
            }
    
            $h_y=mt_rand(0,$height);
            $h_y1=mt_rand(0,$height);
            imageline($im,mt_rand(0,20),$h_y,mt_rand($width-20,$width),$h_y1,$font_color);
            imageline($im,mt_rand(0,20),$h_y,mt_rand($width-20,$width),$h_y1,$font_color);
            $h_y=mt_rand(0,$height);
            $h_y1=mt_rand(0,$height);
            imageline($im,mt_rand(0,20),$h_y,mt_rand($width-20,$width),$h_y1,$font_color);
            imageline($im,mt_rand(0,20),$h_y,mt_rand($width-20,$width),$h_y1,$font_color);
            image_make_pomexi($im,50,80);
    
            $rand=mt_rand(0,1);
            if ($rand)$rand=-1; else $rand=1;
            wave_region($im,0,0,$width,$height,$rand*mt_rand($amplitude_min,$amplitude_max),mt_rand(30,40));
            header('Expires: Sat, 17 May 2008 05:00:00 GMT'); 
            header('Cache-Control: no-store, no-cache, must-revalidate'); 
            header('Cache-Control: post-check=0, pre-check=0', FALSE); 
            header('Pragma: no-cache');
            if(function_exists("imagejpeg"))
            {
                header("Content-Type: image/jpeg");
                imagejpeg($im, null, $jpeg_quality);
            }else if(function_exists("imagegif"))
            {
                header("Content-Type: image/gif");
                imagegif($im);
            }else if(function_exists("imagepng"))
            {
                header("Content-Type: image/x-png");
                imagepng($im);
            }
        }
    
    
        function getKeyString(){
            return $this->keystring;
        }
    }
    
    function wave_region($img, $x, $y, $width, $height,$amplitude = 4.5,$period = 30)
    {
        $mult = 2;
        $img2 = imagecreatetruecolor($width * $mult, $height * $mult);
    
        imagecopyresampled ($img2,$img,0,0,$x,$y,$width * $mult,$height * $mult,$width, $height);
    
        for ($i = 0;$i < ($width * $mult);$i += 2)
           imagecopy($img2,$img2,$x + $i - 2,$y + sin($i / $period) * $amplitude,$x + $i,$y, 2,($height * $mult));
    
        imagecopyresampled($img,$img2,$x,$y,0,0,$width, $height,$width * $mult,$height * $mult);
        imagedestroy($img2);
     }
    
    function image_make_pomexi(&$im,$size,$colch)
    {
       $max_x=imagesx($im);
       $max_y=imagesy($im);
       for ($i=0;$i<=$colch;$i++)
       {
            $size=mt_rand(10,$size);
            $px1=mt_rand(0,$max_x);
            $py1=mt_rand(0,$max_y);
            $col=imagecolorresolve($im, 255, 255, 255); 
            $pk1=mt_rand(-1,1);
            $pk2=mt_rand(-1,1);
            imageline($im,$px1,$py1,$px1+$size*$pk1,$py1+$size*$pk2,$col);
        }   
    }
    

    请建议,这让我大吃一惊......

1 个答案:

答案 0 :(得分:1)

如果会话大小很大,则可能会分配共享主机允许的整个内存限制,并阻止其更新。

由于这是在localhost上运行的,因此内存开放到你硬件的大小,所以你不会遇到这样的问题。

检查会话数据并尝试减少会话中的数据量。