龚哥哥 爱生活、做自己!
MySQL SELECT语句IN与OR的效率
发表于 2016-6-30 | 浏览(899) | 数据库

MySQL版本 5.7.13、SELECT语句IN与OR的效率比较,以下是数据查询量,表总数据量10万条。

100条数据
  字段为主键的情况
    in:0.04 sec
    or:0.06 sec

  添加索引的情况
    in:0.00 sec
    or:0.01 sec

  无索引的情况
    in:0.04 sec
    or:0.06 sec

1万条数据
  字段为主键的情况
    in:0.06 sec
    or:2 min 37.90 sec

  添加索引的情况
    in:0.08 sec
    or:2 min 39.22 sec

  无索引的情况
    in:0.07 sec
    or:2 min 39.73 sec

 10万条数据
  字段为主键的情况
    in:2.74 sec
    or:13 min 46.52 sec

  添加索引的情况
    in:2.94 sec
    or:14 min 13.72 sec

  无索引的情况
    in:4.35 sec
    or:15 min 19.39 sec

查询数据小的时候并无多大差异,随着查询数据量增大OR就显的越来越慢。

创建表

CREATE TABLE `test_in_or` (
	`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增id',
	`number` int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '编号',
	`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
	PRIMARY KEY (`id`)
) ENGINE=`InnoDB` AUTO_INCREMENT=1 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='测试or和in的效率' CHECKSUM=0 DELAY_KEY_WRITE=0;

添加索引

添加普通索引
  ALTER TABLE `test_in_or` ADD INDEX number(`number`);

删除普通索引
  ALTER TABLE `test_in_or` DROP INDEX `number`;

添加主键索引
  添加(PS在这里不需要):ALTER TABLE `test_in_or` ADD PRIMARY KEY (`number`);

  更新主键:ALTER TABLE `test_in_or` DROP PRIMARY KEY, ADD PRIMARY KEY (`id`, `number`);

PHP生成代码(语句太长,贴出来不容易)

数据写入sql语句
  $sql = 'INSERT INTO test_in_or (`number`) VALUES';
  $number = 100000;
  for($i=1; $i<=$number; $i++)
  {
    $sql .= ' ('.$i.'),';
  }
  echo substr($sql, 0, -1).';';

SELECT IN语句
  $number = 100000;
  $sql = 'SELECT * FROM test_in_or WHERE `number` IN (';
  for($i=1; $i<=$number; $i++)
  {
    $sql .= $i.', ';
  }
  echo substr($sql, 0, -2).');';

SELECT OR语句
  $number = 100000;
  $sql = 'SELECT * FROM test_in_or WHERE';
  for($i=1; $i<=$number; $i++)
  {
    $sql .= ' `number`='.$i.' OR';
  }
  echo substr($sql, 0, -3).';';

阅读全文

mac 10.11.5 安装 mysql-5.7.13
发表于 2016-6-25 | 浏览(685) | 数据库

下载地址

http://dev.mysql.com/downloads/mysql/
  Mac OS X 10.11 (x86, 64-bit), DMG Archive

5.7以后的mysql不再使用旧版本的默认密码 root,安装过程中会出现弹出一个提示,那里是一个临时密码,请复制出来保存,以后会需要用到它。如下:

2016-06-25T18:16:46.203256Z 1 [Note] A temporary password is generated for root@localhost: kF-dx_4aycye
If you lose this password, please consult the section How to Reset the Root Password in the MySQL reference manual.

进入终端 /usr/local/mysql/bin/目录

mysqladmin -u root -p password
输入临时密码 如上密码是:kF-dx_4aycye

然后输入你临时密码,成功以后会

New password:  
Confirm new password:
让你输入新密码

紧接着出现Since password will be sent to server in plain text, use ssl connection to ensure password safety.这只是一个提示,可以无视。

到这里密码设置完成,可以使用命令行或者第三方管理软件登录mysql了

阅读全文

PHP坐标圆周率计算
发表于 2016-6-16 | 浏览(731) | PHP
/**
 * [GetSquarePoint 坐标圆周率计算]
 *  $lng = '116.655540';
 *  $lat = '39.910980';
 *  $squares = GetSquarePoint($lng, $lat);
 *       
 *  print_r($squares);
 *  $info_sql = "select id,locateinfo,lat,lng from `lbs_info` where lat<>0 and lat>{$squares['right-bottom']['lat']} and lat<{$squares['left-top']['lat']} and lng>{$squares['left-top']['lng']} and lng<{$squares['right-bottom']['lng']} ";
 *  计算某个经纬度的周围某段距离的正方形的四个点
 *
 *  param lng float 经度
 *  param lat float 纬度
 *  param distance float 该点所在圆的半径,该圆与此正方形内切,默认值为0.5千米
 *  return array 正方形的四个点的经纬度坐标
 */
function GetSquarePoint($lng, $lat, $distance = 0.5)
{
	if(empty($lng) || empty($lat)) return '';

    /* 地球半径,平均半径为6371km */
    $radius = 6371;

    $d_lng =  2 * asin(sin($distance / (2 * $radius)) / cos(deg2rad($lat)));
    $d_lng = rad2deg($d_lng);

    $d_lat = $distance/$radius;
    $d_lat = rad2deg($d_lat);

    return array(
        'left-top'=>array('lat'=>$lat + $d_lat,'lng'=>$lng-$d_lng),
        'right-top'=>array('lat'=>$lat + $d_lat, 'lng'=>$lng + $d_lng),
        'left-bottom'=>array('lat'=>$lat - $d_lat, 'lng'=>$lng - $d_lng),
        'right-bottom'=>array('lat'=>$lat - $d_lat, 'lng'=>$lng + $d_lng)
    );
}

阅读全文

PHP TCP通信
发表于 2016-6-15 | 浏览(909) | PHP

创建文件 server.php 内容如下

<?php

$filename = '/data/www/devil/tcp/server.txt';
$myfile = fopen($filename, "a+");
set_time_limit( 0 );
ob_implicit_flush();
$socket = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
socket_bind( $socket, '192.168.1.94', 11109 );
socket_listen($socket);
$acpt=socket_accept($socket);
echo "Acpt!\n";
while ( $acpt ) {
    $words=fgets(STDIN);
    socket_write($acpt,$words);
    $hear=socket_read($acpt,1024);
    echo $hear;
    fwrite($myfile, $hear);
    if("bye\r\n"==$hear){
        socket_shutdown($acpt);
        break;
    }
    usleep( 5000 );
}
socket_close($socket);

fclose($myfile);
?>

创建文件 client.php 内容如下

<?php

$filename = '/data/www/devil/tcp/client.txt';
$myfile = fopen($filename, "a+");

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$con=socket_connect($socket,'192.168.1.94',11109);
if(!$con){socket_close($socket);exit;}
echo "Link\n";
while($con){
        $hear=socket_read($socket,1024);
        echo $hear;
        fwrite($myfile, $hear);
        $words=fgets(STDIN);
        socket_write($socket,$words);
        if($words=="bye\r\n"){break;}
        usleep( 5000 );
}
socket_shutdown($socket);
socket_close($sock);

fclose($myfile);
?>

文件创建好后,修改 $filename 变量相对应自己系统的地址,写测试数据

192.168.1.94 ip改成自己服务器的或者本机ip

php server.php
php client.php

在 server.php 窗口输入 hello
回到 client.php 窗口可以马上看见 hello
当然在 client.php 窗口输入的内容在 server.php 窗口也可以马上看见

阅读全文

PHP计算两个坐标之间的距离
发表于 2016-6-15 | 浏览(774) | PHP
/**
 * [GetDistance 计算两个进纬度之间的距离]
 * @param [float] $lat1 [纬度1]
 * @param [float] $lng1 [经度1]
 * @param [float] $lat2 [纬度2]
 * @param [float] $lng2 [经度2]
 * @return[float]       [两个坐标距离值]
 */
function GetDistance($lat1, $lng1, $lat2, $lng2)
{
    $pi = 3.1415926535898;
    $earth_radius = 6378.137;

    $radLat1 = $lat1 * ($pi / 180);
    $radLat2 = $lat2 * ($pi / 180);
   
    $a = $radLat1 - $radLat2; 
    $b = ($lng1 * ($pi / 180)) - ($lng2 * ($pi / 180)); 
   
    $s = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1)*cos($radLat2)*pow(sin($b/2),2))); 
    $s = $s * $earth_radius; 
    $s = round($s * 10000) / 10000; 
    return $s; 
}

阅读全文

Nginx支持htpasswd 访问需要用户和密码认证
发表于 2016-5-26 | 浏览(695) | 服务器

准备、创建脚本目录

/data/server/nginx/conf/htpasswd

一、创建文件 htpasswd.sh  内容如下

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

echo "========================================"
echo "# A tool like htpasswd for Nginx       #"
echo "#--------------------------------------#"
echo "# Author:Devil http://gongfuxiang.com  #"
echo "========================================"

# file path
dir=$(pwd);
user="user.conf";
userfile="${dir}/${user}"

#set username
    username=""
    read -p "Please input username:" username
    if [ "$username" = "" ]; then
            echo "Error:username can't be NULL!"
            exit 1
    fi
    echo "==========================="
    echo "username was: $username"
    echo "==========================="


#set password
    unpassword=""
    read -p "Please input the Password:" unpassword
    if [ "$unpassword" = "" ]; then
            echo "Error:Password can't be NULL!"
            exit 1
    fi
    echo "==========================="
    echo "Password was: $unpassword"
    echo "==========================="
    password=$(perl -e 'print crypt($ARGV[0], "pwdsalt")' $unpassword)

# create file
if [ ! -f ${userfile} ]; then
  touch ${userfile} 

  echo "Create Auth file......"
fi

# delete original user
for file in $userfile;
do         
    sed -i "/^$MON[\t ]*$username/d" $file  
done

# add user
echo $username:$password >> $userfile
if [ $? == 0 ]; then
    echo $username:$password;
    echo "user add success, Auth file  path:${userfile}."
else
        echo "error"
        exit 1
fi

二、修改虚拟机配置文件 server 中添加以下配置信息

auth_basic "Authorized users only";
auth_basic_user_file /data/server/nginx/conf/htpasswd/user.conf;

三、添加授权用户(根据提示输入用户名和密码)

sh htpasswd.sh

阅读全文

PHP图片上传(简约版)
发表于 2016-5-5 | 浏览(1022) | PHP
<?php

/**
 * 图片处理类
 * @author  Devil
 * @version v_0.0.1
 */
class Images
{
	private $path;
	private $zoom;

	/**
	 * [__construct 构造方法]
	 * @param [string]  $path [图片存储路径]
	 * @param [int]	 	$zoom [压缩程度]
	 */
	public function __construct($path = '', $zoom = 60)
	{
		// 参数校验
		if(empty($path)) exit('param path no');

		// 属性赋值
		$this->path = $path;
		$this->zoom = $zoom;
	}

	/**
	 * [ImagesReturn 数据返回]
	 * @param [mixed]  	$msg  [错误信息/数据]
	 * @param [int] 	$code [状态]
	 * @return[array]         [返回数据]
	 */
	private function ImagesReturn($msg = '', $code = 0)
	{
		return array('msg'=>$msg, 'code'=>$code);
	}

	/**
	 * [FormSave form图片资源存储]
	 * @param [string] $resources 	[图片临时资源]
	 * @param [string] 	$name   	[图片名称(可空)]
	 * @param [string] 	$path   	[自定义图片路径(可空)]
	 * @return[array]               [图片名称]
	 */
	public function FormSave($resources, $name = '', $path = '')
	{
		// 参数校验
		if(empty($resources['tmp_name']) || empty($resources['type'])) return $this->ImagesReturn('参数错误', -1);

		// 文件名生成
		$file_name = empty($name) ? $this->FileNewName() : $name;

		// 图片后缀名
		$suffix = $this->GetSuffix($resources['type']);
		if(empty($suffix)) $this->ImagesReturn('图片后缀名有误', -2);

		// 图片存储
		$file_name = $file_name.'.'.$suffix;
		$path = empty($path) ? $this->path : $path;
		if(move_uploaded_file($resources['tmp_name'], $path.$file_name)) return $this->ImagesReturn($file_name);

		// 返回错误
		return $this->ImagesReturn('图片存储失败', -100);
	}

	/**
	 * [GetSuffix 获取图片的后缀名]
	 * @param [string] $type [图片资源类型]
	 * @return[string]       [后缀名]
	 */
	private function GetSuffix($type)
	{
		$img_all = array(
			'jpg' => 'image/jpeg',
			'png' => 'image/png',
			'gif' => 'image/gif');

		$key = array_search($type, $img_all);
		if($key === false) return '';
		return $key;
	}

	/**
	 * [FileNewName 生成文件名]
	 */
	private function FileNewName()
	{
		$name = date('YmdHis');
		for($i=0; $i<6; $i++) $name .= rand(0, 9);
		return $name;
	}

	/**
	 * [Compression 图片缩放存储]
	 * @param [string]  $images [图片资源]
	 * @param [string] 	$name   [图片名称(可空)]
	 * @param [string] 	$path   [自定义图片路径(可空)]
	 * @param [int] 	$w      [宽度(可空)]
	 * @param [int] 	$h      [高度(默认原始尺寸或以宽度自动计算)]
	 * @param [int] 	$zoom   [压缩值(默认60)]
	 * @return[array] 			[图片信息]
	 */
	public function Compression($images, $name = '', $path = '', $w = 0, $h = 0, $zoom = 0)
	{
		// 参数校验
		if(empty($images)) return $this->ImagesReturn('参数错误', -1);

		// 获取图片信息
		$info = @getimagesize($images);
		if($info == false) return $this->ImagesReturn('图片有误', -2);

		// 文件名生成
		$file_name = empty($name) ? $this->FileNewName() : $name;

		// 图片后缀名
		//$suffix = $this->GetSuffix($info['mime']);
		$suffix = strrchr($images, '.'); 
		if(empty($suffix)) return $this->ImagesReturn('图片后缀名有误', -3);
		
		// 取得尺寸的比例值
		$proportion = empty($w) ? 0 : $w/$info[0];

		// 新的宽度
		$new_width = empty($w) ? $info[0] : $w;

		// 如果没有自定义高度则根据宽度计算高度
		$new_height = empty($h) ? (($w < $info[0] && !empty($proportion)) ? intval($proportion*$info[1]) : (($w > $info[0] && !empty($proportion)) ? intval($proportion*$info[1]) : $info[1])) : $h;

		// 新建一个彩色图像
		$new_img = imagecreatetruecolor($new_width, $new_height);

		// 图片资源
		$img = $this->ImageFrom($images, $new_img, $info['mime']);
		if(!$img) return $this->ImagesReturn('图片资源获取失败', -4);

		// 缩放图片
		imagecopyresampled($new_img, $img, 0, 0, 0, 0, $new_width, $new_height, $info[0], $info[1]);

		// 缩放程度
		$zoom = empty($zoom) ? (empty($this->zoom) ? 100 : $this->zoom) : $zoom;

		// 存储图片
		$file_name = $file_name.$suffix;
		$path = empty($path) ? $this->path : $path;
		switch($info['mime'])
		{
			case 'image/png':
				$state = imagepng($new_img, $path.$file_name);
				break;

			case 'image/gif':
				$state = imagegif($new_img, $path.$file_name);
				break;

			default:
				$state = imagejpeg($new_img, $path.$file_name, $zoom);
		}

		// 释放内容
		imagedestroy($img);
		imagedestroy($new_img);

		// 返回
		if($state) return $this->ImagesReturn($file_name);
		return $this->ImagesReturn($file_name);
		$this->ImagesReturn('文件储存失败', -100);
	}

	/**
	 * [ImageFrom 图片资源获取]
	 * @param [string] $images [原图片资源]
	 * @param [string] $new_img[新的图片资源]
	 * @param [string] $type   [图片类型]
	 * @return[mixed]          [成功返回图象资源,失败返回 false]
	 */
	private function ImageFrom($images, $new_img, $type)
	{
		// 参数校验
		if(empty($images) || empty($type)) return false;

		// 图片资源获取
		switch($type)
		{
			case 'image/png':
				$img = imagecreatefrompng($images);

				// png保留透明背景
				imagealphablending($new_img, false);
				imagesavealpha($new_img, true);
				imagesavealpha($img, true);
				break;

			case 'image/gif':
				$img = imagecreatefromgif($images);
				break;

			default:
				case 'image/jpeg':
				$img = imagecreatefromjpeg($images);
		}
		return $img;
	}
}
?>

阅读全文

mac下Apache环境配置
发表于 2016-5-5 | 浏览(667) | 服务器

Host配置、添加域名

vim etc/hosts
  127.0.0.1    default.com

开启PHP

1、vim /etc/apache2/httpd.conf 查找 php5_module
  LoadModule php5_module libexec/apache2/libphp5.so
  把前面的#号去掉

2、按esc键输入 查找 DocumentRoot
  DocumentRoot 和 Directory 的值改成 /data/www

3、查找 hosts
  Include的值修改成 /private/etc/apache2/vhost/*.conf

4、按esc键输入 /Options
  修改两个参数
    AllowOverride All 		会去找.htacess文件
    Options Indexes 		目录可见指定
  保存退出

5、配置虚拟机和项目路径
  创建虚拟机路径:mkdir vhost
  在vhost目录下创建default.conf ,内容:
    <VirtualHost *:80>
      ServerAdmin email@email.com
      DocumentRoot "/data/www"
      ServerName default.com
      ErrorLog "/data/log/default.com-error_log"
      CustomLog "/data/log/default.com-access_log"   common
    </VirtualHost>
    保存退出

  创建日志路径:mkdir –p /data/log
  创建项目路径:mkdir –p /data/www

  在 /data/www 目录下创建 phpinfo.php 文件,内容:
  <?php
    echo phpinfo();
  ?>

6、重启apache,在终端输入 apachectl restart

7、浏览器访问 default.com 可以看见php的的配置信息就OK了。

PHP安装扩展

下载扩展包:https://yunpan.cn/cdp5SALnsiZK8 (提取码:d68c)

解压后的文件放到 /usr/lib/php/extensions/no-debug-non-zts-20121212 目录中

创建php.ini文件
  cd /etc
  cp php.ini.default php.ini
  vim php.ini 按esc键搜索 extension

添加以下扩展记录后保存退出
  extension=redis.so
  extension=mongo.so
  extension=memcache.so
  extension=memcached.so
  extension=mcrypt.so

重启apache,在终端输入 apachectl restar

环境安装完成~

阅读全文

PHP图片验证码生成
发表于 2016-5-5 | 浏览(613) | PHP
<?php

/**
 * 验证码驱动
 * @author  Devil
 * @version v_1.0.0
 */
class VerifyLibrary
{
	private $rand_string;
	private $img;

	/**
	 * [__construct 构造方法]
	 */
	public function __construct()
	{
		/* 验证码生成 */
		$this->rand_string = $this->GetRandString();
	}

	/**
	 * [GetVerify 获取当前验证码]
	 */
	public function GetVerify()
	{
		return $this->rand_string;
	}

	/**
	 * [GetVerifyImg 验证码生成]
	 * @return [string] [验证码]
	 */
	public function GetVerifyImg() {
		$this->img = imagecreatetruecolor(63, 22); //创建一个画布(真色彩)

		// 画背景
		$back_color = imagecolorallocate($this->img, 235, 236, 237); 
        imagefilledrectangle($this->img,0,0,63,22,$back_color);

		//加入干扰,画出多条线
		$this->InterferenceLine();
		
		//加入干扰,画出点    
		$this->InterferencePoint();

		//将生成好的字符串写入图像
		$fgcolor = imagecolorallocate($this->img, rand(0,200), rand(0,255), rand(0,255));
		imagestring($this->img, 5, 5, 5, strtoupper($this->rand_string), $fgcolor);

		//输出图像
		header('Content-Type: image/gif');
		imagegif($this->img);

		//销毁图像
		imagedestroy($this->img);
	}

	/**
	 * [InterferencePoint 加入干扰,画点]
	 */
	private function InterferencePoint()
	{
		for($i=0; $i<200; $i++){ 
			$bgcolor = imagecolorallocate($this->img, rand(0,255), rand(0,255), rand(0,255));  //产生随机的颜色
			imagesetpixel($this->img, rand()%90, rand()%30, $bgcolor); 
		}
	}

	/**
	 * [InterferenceLine 加入干扰,画出多条线]
	 */
	private function InterferenceLine()
	{
		for($i=0; $i<5; $i++)
		{
			$bgcolor=imagecolorallocate($this->img, rand(0,255), rand(0,255), rand(0,255));  //产生随机的颜色
			imageline($this->img, rand(10,90), 0, rand(10,90), 20, $bgcolor);
		}
	}

	/**
	 * [GetRandString 生成随机数值]
	 * @param [int] 	$number [随机数位数]
	 * @return[string] 			[返回小写的随机数值]
	 */
	private function GetRandString($number = 6)
	{
		$origstr = '3456789abxdefghijkmnprstuvwxy';
		$verifystring = '';
		$len = strlen($origstr);
		for($i=0; $i<$number; $i++) {
			$index = mt_rand(0, $len-1);
			$char = $origstr[$index];
			$verifystring .= $char;
		}
		return $verifystring;
	}

}
?>

阅读全文

mac PhotoshopCS6破解版
发表于 2016-4-29 | 浏览(612) | 资源

360云盘下载

https://yunpan.cn/cPPSLkE4Hv8dt (提取码:3a28)

阅读全文

TOP