PHP商品秒杀计时实现(解决大流量方案)

 更新时间:2016年11月25日 15:35  点击:1855
PHP商品秒杀功能我们多半以整点或时间点为例子,这样对于php来说处理不复杂,但有一个问题就是如果流量大要如何来处理,下面我们一起来看看解决办法。

要求要有小时分钟秒的实时倒计时的显示,用户端修改日期时间不会影响到倒计时的正常显示(也就是以服务器时间为准)。

其实这和很多的考试等系统的时间限制功能同样的要求。

总不能用ajax每秒都获取服务器时间吧,所以实时倒计时一定要用javascript实现。这很简单,网上一大把的例子。

现在问题是解决用户端修改日期时间对我们的显示的影响。

解决的办法是计算出用户端的时间和服务器的时间差,这样问题的完成解决了。

这样只需要运行一次php,实时倒计时的时间就和服务器的时间同步了。

理论是同步的,但实际测试会有1秒的误差。(具体原因就是和网速有关,网速越快,误差就越小),但这决不会影响到我们上面的要求了。

注:秒杀时间从早上点到晚上10点。

Code 如下:

<?php

//php的时间是以秒算。js的时间以毫秒算

date_default_timezone_set('PRC');
//date_default_timezone_set("Asia/Hong_Kong");//地区

//配置每天的活动时间段
$starttimestr = "08:00:00";
$endtimestr = "22:00:00";

$starttime = strtotime($starttimestr);
$endtime = strtotime($endtimestr);
$nowtime = time();
if ($nowtime<$starttime){
die("活动还没开始,活动时间是:{$starttimestr}至{$endtimestr}");
}
$lefttime = $endtime-$nowtime; //实际剩下的时间(秒)
?>

<script language="JavaScript">
<!-- //
var runtimes = 0;
function GetRTime(){
var nMS = <?=$lefttime?>*1000-runtimes*1000;
var nH=Math.floor(nMS/(1000*60*60))%24;
var nM=Math.floor(nMS/(1000*60)) % 60;
var nS=Math.floor(nMS/1000) % 60;
document.getElementById("RemainH").innerHTML=nH;
document.getElementById("RemainM").innerHTML=nM;
document.getElementById("RemainS").innerHTML=nS;
if(nMS>5*59*1000&&nMS<=5*60*1000)
{
alert("还有最后五分钟!");
}
runtimes++;
setTimeout("GetRTime()",1000);
}
window.onload=GetRTime;
// -->
</script>

<h4><strong id="RemainH">XX</strong>:<strong id="RemainM">XX</strong>:<strong id="RemainS">XX</strong></h4>


上面看上没有问题但碰到流量大会出现一些数量不对的问题,如 大流量并发入库导致的库存负数的问题

我们知道数据库处理sql是一条条处理的,假设购买商品的流程是这样的:

sql1:查询商品库存

if(库存数量 > 0)
{
  //生成订单...
  sql2:库存-1
}

当没有并发时,上面的流程看起来是如此完美,假设同时两个人下单,而库存只有1个了,在sql1阶段两个人查询到的库存都是>0的,于是最终都执行了sql2,库存最后变为-1,超售了,要么补库存,要么等用户投诉吧。

解决这个问题比较流行的思路:

1.用额外的单进程处理一个队列,下单请求放到队列里,一个个处理,就不会有并发的问题了,但是要额外的后台进程以及延迟问题,不予考虑。

2.数据库乐观锁,大致的意思是先查询库存,然后立马将库存+1,然后订单生成后,在更新库存前再查询一次库存,看看跟预期的库存数量是否保持一致,不一致就回滚,提示用户库存不足。

3.根据update结果来判断,我们可以在sql2的时候加一个判断条件update ... where 库存>0,如果返回false,则说明库存不足,并回滚事务。

4.借助文件排他锁,在处理下单请求的时候,用flock锁定一个文件,如果锁定失败说明有其他订单正在处理,此时要么等待要么直接提示用户"服务器繁忙"

本文要说的是第4种方案,大致代码如下:

阻塞(等待)模式

<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX))
{
  //..处理订单
  flock($fp,LOCK_UN);
}
fclose($fp);
?>

非阻塞模式

<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX | LOCK_NB))
{
  //..处理订单
  flock($fp,LOCK_UN);
}
else
{
  echo "系统繁忙,请稍后再试";
}
 
fclose($fp);
?>

PHPMyAdmin与wordpress博客一样会自动访问网站了,如果国外网站慢肯定就会出现访问慢的问题了,下面我们一起来看如何解决PHPMyAdmin打开和访问较慢问题
第一、屏蔽自动更新检测

 

默认情况下可能PHPMyAdmin在线升级的文件导致屏蔽,所以我们直接阻止升级检测。找到version_check.php文件,然后找到下面文件。

 

 代码如下 复制代码

$save = true;
$file = 'http://www.phpmyadmin.net/home_page/version.json';
if (ini_get('allow_url_fopen')) {
$response = file_get_contents($file);
} else if (function_exists('curl_init')) {
$curl_handle = curl_init($file);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($curl_handle);
}

 

我们删除或者注释掉上面的脚本文件。

 

第二、修改本地化时间

 

找到libraries/Util.class.php文件,然后修改。

 

 代码如下 复制代码

# 查找
return strftime($date, $timestamp);

# 替换成如下代码:
if(extension_loaded('gettext'))
return strftime($date, $timestamp);

# 中国区这样设置.
date_default_timezone_set('UTC');
return gmdate('Y-m-d H:i:s', $timestamp + 28800);

 

按照网上其他网友的说法,是因为时间格式和我们本地不同,导致处理速度有一些问题,验证和返回数值的时候需要时间较长。
Imagick是一个可以供PHP调用ImageMagick功能的PHP扩展了,这个插件比gd库的功能还要强大了,我们下文来看使用Imagick绘图 文字换行 生成二维码例子,希望例子能够对各位有帮助。


二维码的生成使用的QRcode库: http://phpqrcode.sourceforge.net/

感觉最烦的就是文字的换行了, 处理函数来源于网络.

下面代码中的使用的函数不完整,完整代码上传 github 了 : https://github.com/zhoumengkang/imagick-demo
模板图和效果图如下:

Imagick 绘图 文字换行 生成二维码

function createUserCard($username,$num,$desc,$id,$url){
    //error_reporting(E_ALL);
    //ini_set("display_errors","On");
    // 新建一个空白图片用来做画布
    $canvas = new Imagick;
    $canvasWidth = 588;
    $canvasHeight = 684;
    $canvas->newimage($canvasWidth, $canvasHeight, 'white');
    $canvas->setImageFormat('jpg');
 
    $fontFile = FONT_PATH."/msyh.ttf";
    $fontSize = 20;
    // 封面
    $face = new Imagick();
    $face->readimageblob(curl_get($url)); // 读取 url 里面的图片
    $face->cropThumbnailImage(200, 200);
 
    // 读取图片
    $pic = new Imagick;
    $QRcodeFile = createQRcode($id,"m");
    $pic->readImage($QRcodeFile);
    $codeWith = 256;
    $pic->cropThumbnailImage($codeWith, $codeWith);
 
    // 背景图片
    $background = new Imagick;
    $background->readimage("/data0/logs/static/user/template.png");
 
    // 将图片合并到画布
    $canvas->compositeImage($face, Imagick::COMPOSITE_OVER, 194, 0);
    $canvas->compositeImage($pic, Imagick::COMPOSITE_OVER, ($canvasWidth-$codeWith)/2, $canvasHeight-$codeWith-31);
    $canvas->compositeImage($background, Imagick::COMPOSITE_OVER, 0, 0);
 
 
    $draw = new ImagickDraw;
    $draw->setFont($fontFile);
    $draw->setFontSize($fontSize);
    $draw->setFillColor(new ImagickPixel('#000000'));
    $draw->setTextAlignment(Imagick::ALIGN_CENTER);
    $canvas->annotateImage($draw,$canvasWidth/2, 230,0,$username);
 
 
    $desc = autowrap($fontSize,$fontFile,$desc,460);
    $draw->setFont($fontFile);
    $draw->setFontSize($fontSize);
    $draw->setFillColor(new ImagickPixel('#000000'));
    $draw->setTextAlignment(Imagick::ALIGN_CENTER);
    $canvas->annotateImage($draw,$canvasWidth/2, 310,0,$desc);
 
 
    $draw->setFont($fontFile);
    $draw->setFontSize($fontSize);
    $draw->setFillColor(new ImagickPixel('#E23B3B'));
    $draw->setTextAlignment(Imagick::ALIGN_LEFT);
    $canvas->annotateImage($draw,290, 275,0,$num);
 
    $draw->setFont($fontFile);
    $draw->setFontSize($fontSize);
    $draw->setFillColor(new ImagickPixel('#ffffff'));
    $draw->setTextAlignment(Imagick::ALIGN_CENTER);
    $canvas->annotateImage($draw,$canvasWidth/2, $canvasHeight-20,0,"来找我玩,先长按识别二维码");
 
    // 保存图片到另一目录
    $userCardPath = "/data0/logs/static/user";
    $canvas->writeimage($userCardPath ."/".$id.".jpg");
}
createUserCard("周梦康",6376,"JR 史密斯搞什么鬼最后一分钟才爆发, 要爆发你丫早点啊,总冠军送人了吧",2,"http://f10.topitme.com/l/201005/17/12740893805467.jpg");


例子2

 $towidth = '500';
 $toheight = '700'; //设置图片调整大小时允许的最大宽度和高度
 $sourcefile = './b.jpg'; //定义一个图像文件路径
 //$image->writeImage('./b.jpg.bak'); //可以备份这个图片
 $myimage = new Imagick( $sourcefile ); //读入该图像文件
 $exifobject = my_exif( $myimage ); //自写函数,读取exif信息(拍摄数据),按自己的要求排列exif信息,返回对象
 //$myimage->setImageFormat('jpeg'); //把图片转为jpg格式
 $myimage->setCompressionQuality( 100 ); //设置jpg压缩质量,1 - 100
 $myimage->enhanceImage(); //去噪点
 $sourcewidth = $myimage->getImageWidth(); //获取读入图像原始大小
 if ( $sourcewidth > $towidth )
 {
   $myimage->scaleImage( $towidth, $toheight, true ); //调整图片大小
 }
 $myimage->raiseImage( 8, 8, 0, 0, 1 ); //加半透明边框
 $resizewidth = $myimage->getImageWidth(); //读出调整之后的图片大小
 $resizeheight = $myimage->getImageHeight();
 $drawback = new ImagickDraw(); //实例化一个绘画对象,绘制半透明黑色背景给exif信息用
 $drawback->setFillColor( new ImagickPixel('#000000') ); //设置填充颜色为黑色
 $drawback->setFillOpacity( 0.6 ); //填充透明度为0.6,参数0.1-1,1为不透明
 $drawback->rectangle( $resizewidth / 2 - 190, $resizeheight - 50, $resizewidth / 2 + 190, $resizeheight - 12 ); //绘制矩形参数,分别为左上角x、y,右下角x、y
 $myimage->drawImage( $drawback ); //确认到image中绘制该矩形框
 $draw = new ImagickDraw(); //实例化一个绘画对象,绘制exif文本信息嵌入图片中
 $draw->setFont( './xianhei.ttf' ); //设置文本字体,要求ttf或者ttc字体,可以绝对或者相对路径
 $draw->setFontSize( 11 ); //设置字号
 $draw->setTextAlignment( 2 ); //文字对齐方式,2为居中
 $draw->setFillColor( '#FFFFFF' ); //文字填充颜色
 $myimage->annotateImage( $draw, $resizewidth / 2, $resizeheight - 39, 0, $exifobject->row1 ); //绘制第一行文本,居中
 $myimage->annotateImage( $draw, $resizewidth / 2, $resizeheight - 27, 0, $exifobject->row2 ); //绘制第二行文本,居中
 $myimage->annotateImage( $draw, $resizewidth / 2, $resizeheight - 15, 0, $exifobject->row3 ); //绘制第三行文本,居中
 /* Output the image with headers */
 header( 'Content-type: image/jpeg' ); //php文件输出mime类型为jpeg图片
 echo $myimage; //在当前php页面输出图片
 //$image->writeImage('./b.new.jpg'); //如果图片不需要在当前php程序中输出,使用写入图片到磁盘函数,上面的设置header也可以去除
 $myimage->clear();
 $myimage->destroy(); //释放资源
 //自写函数,读取exif信息,返回对象
 function my_exif( $myimage )
 {
   $exifArray = array( 'exif:Model' => '未知', 'exif:DateTimeOriginal' => '未知', 'exif:ExposureProgram' => '未知', 'exif:FNumber' => '0/10', 'exif:ExposureTime' => '0/10', 'exif:ISOSpeedRatings' => '未知',
     'exif:MeteringMode' => '未知', 'exif:Flash' => '关闭闪光灯', 'exif:FocalLength' => '未知', 'exif:ExifImageWidth' => '未知', 'exif:ExifImageLength' => '未知' ); //初始化部分信息,防止无法读取照片exif信息时运算发生错误
   $exifArray = $myimage->getImageProperties( "exif:*" ); //读取图片的exif信息,存入$exifArray数组
   //如果需要显示原数组可以使用print_r($exifArray);
   $r->row1 = '相机:' . $exifArray['exif:Model'];
   $r->row1 = $r->row1 . ' 拍摄时间:' . $exifArray['exif:DateTimeOriginal'];
   switch ( $exifArray['exif:ExposureProgram'] )
   {
     case 1:
       $exifArray['exif:ExposureProgram'] = "手动(M)";
       break; //Manual Control
     case 2:
       $exifArray['exif:ExposureProgram'] = "程序自动(P)";
       break; //Program Normal
     case 3:
       $exifArray['exif:ExposureProgram'] = "光圈优先(A,Av)";
       break; //Aperture Priority
     case 4:
       $exifArray['exif:ExposureProgram'] = "快门优先(S,Tv)";
       break; //Shutter Priority
     case 5:
       $exifArray['exif:ExposureProgram'] = "慢速快门";
       break; //Program Creative (Slow Program)
     case 6:
       $exifArray['exif:ExposureProgram'] = "运动模式";
       break; //Program Action(High-Speed Program)
     case 7:
       $exifArray['exif:ExposureProgram'] = "人像";
       break; //Portrait
     case 8:
       $exifArray['exif:ExposureProgram'] = "风景";
       break; //Landscape
     default:
       $exifArray['exif:ExposureProgram'] = "其它";
   }
   $r->row1 = $r->row1 . ' 模式:' . $exifArray['exif:ExposureProgram'];
   $exifArray['exif:FNumber'] = explode( '/', $exifArray['exif:FNumber'] );
   $exifArray['exif:FNumber'] = $exifArray['exif:FNumber'][0] / $exifArray['exif:FNumber'][1];
   $r->row2 = '光圈:F/' . $exifArray['exif:FNumber'];
   $exifArray['exif:ExposureTime'] = explode( '/', $exifArray['exif:ExposureTime'] );
   if ( ($exifArray['exif:ExposureTime'][0] / $exifArray['exif:ExposureTime'][1]) >= 1 )
   {
     $exifArray['exif:ExposureTime'] = sprintf( "%.1fs", (float)$exifArray['exif:ExposureTime'][0] / $exifArray['exif:ExposureTime'][1] );
   } else
   {
     $exifArray['exif:ExposureTime'] = sprintf( "1/%ds", $exifArray['exif:ExposureTime'][1] / $exifArray['exif:ExposureTime'][0] );
   }
   $r->row2 = $r->row2 . ' 快门:' . $exifArray['exif:ExposureTime'];
   $r->row2 = $r->row2 . ' ISO:' . $exifArray['exif:ISOSpeedRatings'];
   $exifArray['exif:ExposureBiasValue'] = explode( "/", $exifArray['exif:ExposureBiasValue'] );
   $exifArray['exif:ExposureBiasValue'] = sprintf( "%1.1feV", ((float)$exifArray['exif:ExposureBiasValue'][0] / $exifArray['exif:ExposureBiasValue'][1] * 100) / 100 );
   if ( (float)$exifArray['exif:ExposureBiasValue'] > 0 )
   {
     $exifArray['exif:ExposureBiasValue'] = "+" . $exifArray['exif:ExposureBiasValue'];
   }
   $r->row2 = $r->row2 . ' 补偿:' . $exifArray['exif:ExposureBiasValue'];
   switch ( $exifArray['exif:MeteringMode'] )
   {
     case 0:
       $exifArray['exif:MeteringMode'] = "未知";
       break;
     case 1:
       $exifArray['exif:MeteringMode'] = "矩阵";
       break;
     case 2:
       $exifArray['exif:MeteringMode'] = "中央重点平均";
       break;
     case 3:
       $exifArray['exif:MeteringMode'] = "点测光";
       break;
     case 4:
       $exifArray['exif:MeteringMode'] = "多点测光";
       break;
     default:
       $exifArray['exif:MeteringMode'] = "其它";
   }
   $r->row2 = $r->row2 . ' 测光:' . $exifArray['exif:MeteringMode'];
   switch ( $exifArray['exif:Flash'] )
   {
     case 1:
       $exifArray['exif:Flash'] = "开启闪光灯";
       break;
   }
   $r->row2 = $r->row2 . ' ' . $exifArray['exif:Flash'];
   if ( $exifArray['exif:FocalLengthIn35mmFilm'] )
   {
     $r->row3 = '等效焦距:' . $exifArray['exif:FocalLengthIn35mmFilm'] . "mm";
   } else
   {
     $exifArray['exif:FocalLength'] = explode( "/", $exifArray['exif:FocalLength'] );
     $exifArray['exif:FocalLength'] = sprintf( "%4.1fmm", (double)$exifArray['exif:FocalLength'][0] / $exifArray['exif:FocalLength'][1] );
     $r->row3 = '焦距:' . $exifArray['exif:FocalLength'];
   }
   $r->row3 = $r->row3 . ' 原始像素:' . $exifArray['exif:ExifImageWidth'] . 'x' . $exifArray['exif:ExifImageLength'] . 'px';
   if ( $exifArray['exif:Software'] )
   {
     $r->row3 = $r->row3 . ' 后期:' . $exifArray['exif:Software'];
   }
   return $r;
 }

例子3


<?php
//获取水印图片
$logo = new Imagick("logo.png");
$logo->setImageResolution(0.01,0.03);

//创建一个Imagick对象,同时获取要处理的源图
$im = new Imagick( "old_large_img_2.jpg" );

//获取源图片宽和高
$srcWH = $im->getImageGeometry();

//图片等比例缩放宽和高设置
if($srcWH['width']>710){
$srcW['width'] = 710;
$srcH['height'] = $srcW['width']/$srcWH['width']*$srcWH['height'];
}else{
$srcW['width'] = $srcWH['width'];
$srcH['height'] = $srcWH['height'];
}

//按照比例进行缩放
$im->thumbnailImage( $srcW['width'], $srcH['height'], true );

// 按照缩略图大小创建一个有颜色的图片
$canvas = new Imagick();
$canvas->newImage( $srcW['width'], $srcH['height'], 'black', 'jpg' ); //pink,black

//添加水印
$im->compositeImage($logo,Imagick::COMPOSITE_OVER,$srcW['width']-280,$srcH['height']-77);
$canvas->setcompressionquality(91);
//合并图片
$canvas->compositeImage( $im, imagick::COMPOSITE_OVER, 0, 0);

//输出图片
header( "Content-Type: image/jpg" );
echo $canvas;  

//生成图片
$canvas->writeImage( "test_img/old_large_img_2_96.jpg" );
?>

imagick是一个功能强大的图像处理库。

说是翻译 其实就是简要介绍imagick 的主要功能的或者说是我觉得比较实用的功能函数的介绍 以及使用的例子。

因为本人的英语水平有限,所以采用比较通俗或者说比较贴近应用化的语言来描述。

先欣赏一组炫丽的效果:

偏置图像:

例子:

<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$image->rollImage(20,39);
echo $image;
?>

 

thumbnailImage($width,$height) 改变图片大小
例子:
<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$image->thumbnailImage(100,0);
echo $image;
?>

addNoiseImage(int $noise_type [, int $channel= Imagick::CHANNEL_ALL ]);
功能:
Adds random noise to the image
添加干扰素

Noise constants ( $noise_type 类型)
imagick::NOISE_UNIFORM (integer)
imagick::NOISE_GAUSSIAN (integer)
imagick::NOISE_MULTIPLICATIVEGAUSSIAN (integer)
imagick::NOISE_IMPULSE (integer)
imagick::NOISE_LAPLACIAN (integer)
imagick::NOISE_POISSON (integer)
Channel constants ( $channel 类型)
imagick::CHANNEL_UNDEFINED (integer)
imagick::CHANNEL_RED (integer)
imagick::CHANNEL_GRAY (integer)
imagick::CHANNEL_CYAN (integer)
imagick::CHANNEL_GREEN (integer)
imagick::CHANNEL_MAGENTA (integer)
imagick::CHANNEL_BLUE (integer)
imagick::CHANNEL_YELLOW (integer)
imagick::CHANNEL_ALPHA (integer)
imagick::CHANNEL_OPACITY (integer)
imagick::CHANNEL_MATTE (integer)
imagick::CHANNEL_BLACK (integer)
imagick::CHANNEL_INDEX (integer)
imagick::CHANNEL_ALL (integer)
例子:
<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$image->thumbnailImage(100,0);
$image->addNoiseImage(imagick::NOISE_POISSON,imagick::CHANNEL_OPACITY);
echo $image;
?>

 

annotateImage 创建文本图像
例子:
<?php
$image = new Imagick();
$draw = new ImagickDraw();
$pixel = new ImagickPixel( 'gray' );
$image->newImage(800, 75, $pixel);
$pixel->setColor('black');
$draw->setFont('Bookman-DemiItalic');
$draw->setFontSize( 30 );
$image->annotateImage($draw, 10, 45, 0, 'The quick brown fox jumps over the lazy dog');
$image->setImageFormat('png');
header('Content-type: image/png');
echo $image;
?>

blurImage(float $radius , float $sigma [, int $channel ])
Adds blur filter to image 图像模糊度处理
参数:
int $channel :
imagick::CHANNEL_UNDEFINED (integer)
imagick::CHANNEL_RED (integer)
imagick::CHANNEL_GRAY (integer)
imagick::CHANNEL_CYAN (integer)
imagick::CHANNEL_GREEN (integer)
imagick::CHANNEL_MAGENTA (integer)
imagick::CHANNEL_BLUE (integer)
imagick::CHANNEL_YELLOW (integer)
imagick::CHANNEL_ALPHA (integer)
imagick::CHANNEL_OPACITY (integer)
imagick::CHANNEL_MATTE (integer)
imagick::CHANNEL_BLACK (integer)
imagick::CHANNEL_INDEX (integer)
imagick::CHANNEL_ALL (integer)

<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$image->blurImage(5,3);
echo $image;
?>


borderImage ( mixed $bordercolor , int $width , int $height ) 图片边框处理
例子:
<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$color=new ImagickPixel();
$color->setColor("rgb(220,220,220)");
$image->borderImage($color,5,4);

$image->blurImage(5,5,imagick::CHANNEL_GREEN);
echo $image;
?>

 

charcoalImage ( float $radius , float $sigma ) 图像素描处理
参数说明:
$radius :越小越薄。
$sigma: 越大 墨越深 反之。
例子:
<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$color=new ImagickPixel();
$color->setColor("rgb(220,220,220)");
$image->borderImage($color,5,4);
$image->charcoalImage(0.0001,0.001);
//$image->blurImage(5,5,imagick::CHANNEL_GREEN);
echo $image;
?>

chopImage ( int $width , int $height , int $x , int $y )
参数说明:删除一定范围的图像区域
就不做参数说明,一看便知.

colorizeImage( mixed $colorize , mixed $opacity )混合填充颜色
$colorize 颜色
$opacit 透明度
例子:
<?php
/*
胶卷底片效果
*/
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$image->negateImage(false);
$image->colorizeImage('#000',1.0);
echo $image;
?>

embossImage ( float $radius , float $sigma )
功能: 返回一个灰度级3D图像 不太好。
例子:
<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$image->embossImage(1,1);
echo $image;
?>

(两张效果图)

flipImage(void)
功能: 创建图像倒影(垂直翻转)
例子:
<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$image->flipImage();
echo $image;
?>

flopImage ( void )
功能: 图像水平横向翻转
<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$image->flopImage();
echo $image;
?>

frameImage(mixed $matte_color,int $width, int $height,int $inner_bevel, int $outer_bevel)
功能:创建3D图像边框
参数说明:
$matte_color:颜色
$inner_bevel:边框内部倾斜度
$outer_bevel:外部边框倾斜度
例子:
<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$color=new ImagickPixel();
$color->setColor("rgb(220,220,220)");
$image->frameImage($color,11,11,1,10);
echo $image;
?>


注意事项:
$width(宽度)不能小于$inner_bevel(边框内部倾斜度)

Imagick::gammaImage (float $gamma [,int $channel= Imagick::CHANNEL_ALL])
功能:调整图像灰度系数
参数说明:
float $gamma :灰度系数值
$channel 默认为 Imagick::CHANNEL_ALL
Imagick::CHANNEL_ALL
例子 1:
<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$image->gammaImage(30);
echo $image;
?>

 

例子 2:
<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$image->gammaImage(30);
echo $image;
?>

 

gaussianBlurImage ( float $radius , float $sigma [, int $channel= Imagick::CHANNEL_ALL ] )
功能:高斯模糊处理 类似于photo的高斯模糊
参数说明:
float $radius:高斯模糊的半径,像素,不包括中心象素。
float $sigma :高斯的标准偏差,以像素为单位。我觉得这个参数最重要。
int $channel :图像颜色模式。
<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$image->gaussianBlurImage(30,3);
echo $image;
?>

 

levelImage ( float $blackPoint , float $gamma , float $whitePoint [, int $channel= Imagick::CHANNEL_ALL ] )
功能: 调整图像的色阶(Adjusts the levels of an image)
参数说明

<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$image->levelImage(4,4,4);
echo $image;
?>

 

例子2:

<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$image->levelImage(200,200,200,imagick::CHANNEL_GREEN);
echo $image;
?>

magnifyImage( void )
功能说明:简便的图像等比例放大2倍(Is a convenience method that scales an image proportionally to twice its original size. )
例子:
<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$image->magnifyImage ();
echo $image;
?>

medianFilterImage ( float $radius )
功能:特是的滤镜 有点像photoshop 调色刀滤镜
<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$color=new ImagickPixel();
$color->setColor("rgb(220,220,220)");
$image->medianFilterImage(5);
echo $image;
?>

minifyImage(void)

功能:图小缩小一倍(Scales an image proportionally to half its size)
例子:
<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$image->minifyImage();
echo $image;
?>

modulateImage ( float $brightness , float $saturation , float $hue )
功能:控制调整图像的 亮度、饱和度、色调。
参数说明:
float $brightness: 亮度
float $saturation :饱和度
float $hue 色调
例子1:
<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$image->modulateImage(100,1,100);
echo $image;
?>

 

例子2:
<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$image->modulateImage(250,1,250);
echo $image;
?>

motionBlurImagemotionBlurImage ( float $radius , float $sigma , float $angle [, int $channel= Imagick::CHANNEL_DEFAULT ] )
功能:模拟运动模糊(Simulates motion blur) ,类似photoshop的动感模糊滤镜功能
参数说明:
float $radius: 高斯 半径,不包过中心像素。
float $sigma:标准偏差的高斯,以像素为单位。【重要参数】
float $angle:模糊角度。
int $channel:图像颜色模式。默认为 Imagick::CHANNEL_DEFAULT
例子1:
<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$color=new ImagickPixel();
$color->setColor("rgb(220,220,220)");
$image->motionBlurImage (61,10,10);
echo $image;
?>

 

例子2:

<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$color=new ImagickPixel();
$color->setColor("rgb(220,220,220)");
$image->motionBlurImage (201,10,100);
echo $image;
?>

 

oilPaintImage ( float $radius ):
功能说明: 模拟油画滤镜(Simulates an oil painting)
例子:
<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$color=new ImagickPixel();
$color->setColor("rgb(220,220,220)");
$image->oilPaintImage(1);
echo $image;
?>

 

radialBlurImage ( float $angle [, int $channel= Imagick::CHANNEL_ALL ] )
功能: 径向模糊(Radial blurs an image)
<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$color=new ImagickPixel();
$color->setColor("rgb(220,220,220)");
$image->radialBlurImage(30);
echo $image;
?>

 

raiseImage ( int $width , int $height , int $x , int $y , bool $raise )
功能说明:创建3D图像按钮(Creates a simulated 3d button-like effect)
<?php
ini_set('display_errors',1);
header('Content-type: image/jpeg');
$image = new Imagick('1.jpg');
$color=new ImagickPixel();
$color->setColor("rgb(220,220,220)");
$image->raiseImage(10,10,3,5,6);
echo $image;
?>

本教程我们用PHP实例来讲解冒泡排序法,快速排序法,选择排序法,插入排序法等四大基础排序算法,我们的重点是给出算法思路,这种思路同样适用于其他编程语言。

四大基本排序算法分别是:冒泡排序法,快速排序法,选择排序法,插入排序法,本文我们用 PHP 实例讲解这四大基本排序。

  1. 冒泡排序

  思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

  代码实现:

$arr=array(1,43,54,62,21,66,32,78,36,76,39);  
function bubbleSort($arr)
{  
  $len=count($arr);
  //该层循环控制 需要冒泡的轮数
  for($i=1;$i<$len;$i++)
  { //该层循环用来控制每轮 冒出一个数 需要比较的次数
    for($k=0;$k<$len-$i;$k++)
    {
       if($arr[$k]>$arr[$k+1])
        {
            $tmp=$arr[$k+1];
            $arr[$k+1]=$arr[$k];
            $arr[$k]=$tmp;
        }
    }
  }
  return $arr;
}
  2. 选择排序

  代码实现:

function selectSort($arr) {
//双重循环完成,外层控制轮数,内层控制比较次数
 $len=count($arr);
    for($i=0; $i<$len-1; $i++) {
        //先假设最小的值的位置
        $p = $i;
         
        for($j=$i+1; $j<$len; $j++) {
            //$arr[$p] 是当前已知的最小值
            if($arr[$p] > $arr[$j]) {
            //比较,发现更小的,记录下最小值的位置;并且在下次比较时采用已知的最小值进行比较。
                $p = $j;
            }
        }
        //已经确定了当前的最小值的位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。
        if($p != $i) {
            $tmp = $arr[$p];
            $arr[$p] = $arr[$i];
            $arr[$i] = $tmp;
        }
    }
    //返回最终结果
    return $arr;
}
  3.插入排序

  思路分析:在要排序的一组数中,假设前面的数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。

  代码实现:

function insertSort($arr) {
    $len=count($arr);
    for($i=1, $i<$len; $i++) {
        $tmp = $arr[$i];
        //内层循环控制,比较并插入
        for($j=$i-1;$j>=0;$j--) {
            if($tmp < $arr[$j]) {
                //发现插入的元素要小,交换位置,将后边的元素与前面的元素互换
                $arr[$j+1] = $arr[$j];
                $arr[$j] = $tmp;
            } else {
                //如果碰到不需要移动的元素,由于是已经排序好是数组,则前面的就不需要再次比较了。
                break;
            }
        }
    }
    return $arr;
}
  4.快速排序

  思路分析:选择一个基准元素,通常选择第一个元素或者最后一个元素。通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素。此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

 代码实现:

function quickSort($arr) {
    //先判断是否需要继续进行
    $length = count($arr);
    if($length <= 1) {
        return $arr;
    }
    //选择第一个元素作为基准
    $base_num = $arr[0];
    //遍历除了标尺外的所有元素,按照大小关系放入两个数组内
    //初始化两个数组
    $left_array = array();  //小于基准的
    $right_array = array();  //大于基准的
    for($i=1; $i<$length; $i++) {
        if($base_num > $arr[$i]) {
            //放入左边数组
            $left_array[] = $arr[$i];
        } else {
            //放入右边
            $right_array[] = $arr[$i];
        }
    }
    //再分别对左边和右边的数组进行相同的排序处理方式递归调用这个函数
    $left_array = quick_sort($left_array);
    $right_array = quick_sort($right_array);
    //合并
    return array_merge($left_array, array($base_num), $right_array);
}

下面我们来看看关于给PHP安装配置Opcache缓存的一个功能,这样可以让你的php运行速度大增了,具体操作如下。


本文针对PHP5.5等高级版本,编译时需要加上--enable-opcache参数

编译PHP请参考编译PHP5.6

编译安装完成后,我们开始配置Opcache

[Opcache]
zend_extension = opcache.so
opcache.enable=1
opcache.memory_consumption = 64
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 4000
opcache.revalidate_freq = 60
opcache.fast_shutdown = 1
opcache.enable_cli = 1

修改后重启PHP-FPM

service php-fpm restart

最后上个图

PHP安装配置Opcache加速你的网站 配置成功!

[!--infotagslink--]

相关文章

  • php语言实现redis的客户端

    php语言实现redis的客户端与服务端有一些区别了因为前面介绍过服务端了这里我们来介绍客户端吧,希望文章对各位有帮助。 为了更好的了解redis协议,我们用php来实现...2016-11-25
  • jQuery+jRange实现滑动选取数值范围特效

    有时我们在页面上需要选择数值范围,如购物时选取价格区间,购买主机时自主选取CPU,内存大小配置等,使用直观的滑块条直接选取想要的数值大小即可,无需手动输入数值,操作简单又方便。HTML首先载入jQuery库文件以及jRange相关...2015-03-15
  • JS实现的简洁纵向滑动菜单(滑动门)效果

    本文实例讲述了JS实现的简洁纵向滑动菜单(滑动门)效果。分享给大家供大家参考,具体如下:这是一款纵向布局的CSS+JavaScript滑动门代码,相当简洁的手法来实现,如果对颜色不满意,你可以试着自己修改CSS代码,这个滑动门将每一...2015-10-21
  • jQuery+slidereveal实现的面板滑动侧边展出效果

    我们借助一款jQuery插件:slidereveal.js,可以使用它控制面板左右侧滑出与隐藏等效果,项目地址:https://github.com/nnattawat/slideReveal。如何使用首先在页面中加载jquery库文件和slidereveal.js插件。复制代码 代码如...2015-03-15
  • PHP+jQuery翻板抽奖功能实现

    翻板抽奖的实现流程:前端页面提供6个方块,用数字1-6依次表示6个不同的方块,当抽奖者点击6个方块中的某一块时,方块翻转到背面,显示抽奖中奖信息。看似简单的一个操作过程,却包含着WEB技术的很多知识面,所以本文的读者应该熟...2015-10-21
  • SQLMAP结合Meterpreter实现注入渗透返回shell

    sqlmap 是一个自动SQL 射入工具。它是可胜任执行一个广泛的数据库管理系统后端指印, 检索遥远的DBMS 数据库等,下面我们来看一个学习例子。 自己搭建一个PHP+MYSQ...2016-11-25
  • PHP实现今天是星期几的几种写法

    复制代码 代码如下: // 第一种写法 $da = date("w"); if( $da == "1" ){ echo "今天是星期一"; }else if( $da == "2" ){ echo "今天是星期二"; }else if( $da == "3" ){ echo "今天是星期三"; }else if( $da == "4"...2013-10-04
  • 原生js实现fadein 和 fadeout淡入淡出效果

    js里面设置DOM节点透明度的函数属性:filter= "alpha(opacity=" + value+ ")"(兼容ie)和opacity=value/100(兼容FF和GG)。 先来看看设置透明度的兼容性代码: 复制代码 代码如下: function setOpacity(ele, opacity) { if (...2014-06-07
  • Android中用HttpClient实现Http请求通信

    本文我们需要解决的问题是如何实现Http请求来实现通信,解决Android 2.3 版本以后无法使用Http请求问题,下面请看正文。 Android开发中使用HttpClient来开发Http程序...2016-09-20
  • mysql存储过程实现split示例

    复制代码 代码如下:call PROCEDURE_split('分享,代码,片段',',');select * from splittable;复制代码 代码如下:drop PROCEDURE if exists procedure_split;CREATE PROCEDURE `procedure_split`( inputstring varc...2014-05-31
  • css实现文字发光效果方法汇总

    文字发光效果我们可以直接使用css来实现了今天我们来看一篇关于文字发光效果的例子,希望这篇文章能够帮助到各位朋友哦。 前言 我录制的慕课网视频一直没有上线,慕...2016-09-14
  • PHP+Mysql+Ajax+JS实现省市区三级联动

    基本思想就是:在JS动态创建select控件的option,通过Ajax获取在PHP从SQL数据库获取的省市区信息,代码有点长,但很多都是类似的,例如JS中省、市、区获取方法类似,PHP中通过参数不同执行不同的select语句。index.html代码:复制...2014-05-31
  • JS实现程序暂停与继续功能代码解读

    下面代码用JS实现了程序的暂停与继续 复制代码 代码如下: <script type="text/javascript"> /*Javascript中暂停功能的实现 Javascript本身没有暂停功能(sleep不能使用)同时 vbscript也不能使用doEvents,故编写此函数实...2013-10-13
  • PHPCMS实现自动推送URL到百度站长平台

    我们一起来看一篇关于PHPCMS实现自动推送URL到百度站长平台,希望此教程能够帮助到各位朋友。 百度站长平台开放url推送接口,可以使用调用接口的形式主动及时推送u...2016-11-25
  • CSS+JS实现苹果cover flow效果示例

    cover flow效果就一个超级漂亮的图片切换效果了,下面我们来看看CSS+JS实现苹果cover flow效果示例吧,具体的操作步骤细节如下文介绍。 废话不多说, 直接上最终效果...2016-10-02
  • 兼容ie和firefox css alpha实现透明效果

    文章介绍了利用了css hack来实现兼容ie和firefox 的div透明效果,有需要的朋友可以参考一下,好了费话不说多了。 为了实现一些特殊效果,需要将页面元素变透明,本文介...2017-07-06
  • 基于PHP实现假装商品限时抢购繁忙的效果

    最近要做一个项目,有关商品显示抢购的功能。比如我们的网站很带流量,那么成千上万的用户在几秒内同时点你的商品,确实会出现“抢购人数过多,会提示,系统繁忙。 但是呢,大部分网站然而并没有这么牛叉。为了让用户感受到商...2015-10-21
  • Nginx防止流量攻击的配置详解

    这篇文章主要给大家分享了Nginx防止流量攻击的配置方法,文中给出了详细的介绍和配置示例代码,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。...2017-07-06
  • php防止伪造跨站请求实现程序

    CSRF站外类型的漏洞其实就是传统意义上的外部提交数据问题,一般程序员会考虑给一些留言评论等的表单加上水印以防止SPAM问题,但是为了用户的体验性,一些操作可能没有做任...2016-11-25
  • apache中如何实现301转向

    编辑.htaccess的方法。 注意:在设置301重定向之前务必备份相应目录下的.htaccess文件。 1.重定向111cn.net到www.111cn.net 这种重定向旨在使域名唯一,是网站seo教程必...2016-01-28