关于对CI验证码辅助函数的思考与建议
CI的验证码函数是存放在helper内,使用的是PHPGD库。工作流程是:1引入helper。2,配置所需的验证码参数。2,creat_captcha函数,将生成的验证码图片存入硬盘上某目录。然而对于一些服务器(如阿里云),磁盘IO缓慢,而验证码的属性又决定了不会被重复使用。因此选择文件形式存储验证码并不是很好的选择。
我对于验证码的想出的比较理想的解决方案是:
新建一个Controller,该crontroller返回的是header(图片头), 具体数据为生成的二维码的二进制数据,这样一些数据都是在内存中处理,就解决了二维码存储时消耗磁盘时间的问题。
或者是说CI内置这种方法了么?至少我没有看到,希望有了解的同学告知一二,谢谢。
本帖最后由 Closer 于 2015-9-19 17:10 编辑
Closer 发表于 2015-9-19 16:12
在這邊提議用處不大
CI 是外國人開發的
也許該去國外論壇留言
OK,你说的对。另外我自己改了一下captcha_helper,供以后遇到相同问题的朋友参考下列:my_captcha_helper.php
在自己的controller内引入后,配置好参数,header('Content-Type: image/jpeg'); 就可以告知浏览器是图片了
my_captcha_helper.php :
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
if ( ! function_exists('create_captcha'))
{
/**
* Create CAPTCHA
*
* @param array $data data for the CAPTCHA
* @return bin_data header:图片形式
*/
function create_captcha($data = '')
{
$defaults = array(
'word' => '',
'img_width' => '150',
'img_height' => '30',
'font_path' => '',
'word_length' => 8,
'font_size' => 16,
'img_id' => '',
'pool' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
'colors' => array(
'background' => array(255,255,255),
'border' => array(153,102,102),
'text' => array(204,153,153),
'grid' => array(255,182,182)
)
);
foreach ($defaults as $key => $val)
{
if ( ! is_array($data) && empty($$key))
{
$$key = $val;
}
else
{
$$key = isset($data[$key]) ? $data[$key] : $val;
}
}
if (! extension_loaded('gd'))
{
//GD library not loaded
return FALSE;
}
// -----------------------------------
// Do we have a "word" yet?
// -----------------------------------
if (empty($word))
{
$word = '';
for ($i = 0, $mt_rand_max = strlen($pool) - 1; $i < $word_length; $i++)
{
$word .= $pool;
}
}
elseif ( ! is_string($word))
{
$word = (string) $word;
}
// -----------------------------------
// Determine angle and position
// -----------------------------------
$length = strlen($word);
$angle = ($length >= 6) ? mt_rand(-($length-6), ($length-6)) : 0;
$x_axis = mt_rand(6, (360/$length)-16);
$y_axis = ($angle >= 0) ? mt_rand($img_height, $img_width) : mt_rand(6, $img_height);
// Create image
// PHP.net recommends imagecreatetruecolor(), but it isn't always available
$im = function_exists('imagecreatetruecolor')
? imagecreatetruecolor($img_width, $img_height)
: imagecreate($img_width, $img_height);
// -----------------------------------
//Assign colors
// ----------------------------------
is_array($colors) OR $colors = $defaults['colors'];
foreach (array_keys($defaults['colors']) as $key)
{
// Check for a possible missing value
is_array($colors[$key]) OR $colors[$key] = $defaults['colors'][$key];
$colors[$key] = imagecolorallocate($im, $colors[$key], $colors[$key], $colors[$key]);
}
// Create the rectangle
ImageFilledRectangle($im, 0, 0, $img_width, $img_height, $colors['background']);
// -----------------------------------
//Create the spiral pattern
// -----------------------------------
$theta = 1;
$thetac = 7;
$radius = 16;
$circles = 20;
$points = 32;
for ($i = 0, $cp = ($circles * $points) - 1; $i < $cp; $i++)
{
$theta += $thetac;
$rad = $radius * ($i / $points);
$x = ($rad * cos($theta)) + $x_axis;
$y = ($rad * sin($theta)) + $y_axis;
$theta += $thetac;
$rad1 = $radius * (($i + 1) / $points);
$x1 = ($rad1 * cos($theta)) + $x_axis;
$y1 = ($rad1 * sin($theta)) + $y_axis;
imageline($im, $x, $y, $x1, $y1, $colors['grid']);
$theta -= $thetac;
}
// -----------------------------------
//Write the text
// -----------------------------------
$use_font = ($font_path !== '' && file_exists($font_path) && function_exists('imagettftext'));
if ($use_font === FALSE)
{
($font_size > 5) && $font_size = 5;
$x = mt_rand(0, $img_width / ($length / 3));
$y = 0;
}
else
{
($font_size > 30) && $font_size = 30;
$x = mt_rand(0, $img_width / ($length / 1.5));
$y = $font_size + 2;
}
for ($i = 0; $i < $length; $i++)
{
if ($use_font === FALSE)
{
$y = mt_rand(0 , $img_height / 2);
imagestring($im, $font_size, $x, $y, $word[$i], $colors['text']);
$x += ($font_size * 2);
}
else
{
$y = mt_rand($img_height / 2, $img_height - 3);
imagettftext($im, $font_size, $angle, $x, $y, $colors['text'], $font_path, $word[$i]);
$x += $font_size;
}
}
// Create the border
imagerectangle($im, 0, 0, $img_width - 1, $img_height - 1, $colors['border']);
// -----------------------------------
//Generate the image
// -----------------------------------
if (function_exists('imagejpeg'))
{
$result = imagejpeg($im);
}
else
{
return FALSE;
}
ImageDestroy($im);
return $result;
}
}
在這邊提議用處不大
CI 是外國人開發的
也許該去國外論壇留言 有没有可能存在内存缓存里面? :victory: 用第三方的!
点触,极验证码都不错,轻量级的免费使用,重量级就收费了 自己写个验证码类即可,国内有加载自己类的也有扩展该类的视频教程.
页:
[1]