龚哥哥 爱生活、做自己!
Mac安装PHP Swoole扩展
发表于 2016-7-10 | 浏览(3263) | 服务器

系统软件版本

Swoole Version swoole-1.8.9
PHP    Version 5.6.30
MAC    Version 10.12.4

开始安装

wget http://pecl.php.net/get/swoole-1.8.9.tgz
tar -zxvf swoole-1.8.9.tgz
cd swoole-1.8.9
/usr/bin/phpize    # phpize(如果执行 phpize 出错的话,在博客中搜索 phpize 查看解决方案)
./configure --with-php-config=/usr/bin/php-config
make
sudo make install

在 /etc/php.ini 中添加扩展记录

extension=swoole.so

重启apache

sudo apachectl restart

make可能会报错

错误1
/usr/include/php/ext/pcre/php_pcre.h:29:10: fatal error: 'pcre.h' file not found #include "pcre.h"

排查问题 php -m 已经安装pcre扩展了,是本机未安装pcre服务
我们安装一下pcre服务
  brew install pcre
  sudo cp /usr/local/include/pcre.h /usr/include/php/ext/pcre/


错误2
./php_swoole.h:22:10: fatal error: 'php.h' file not found
sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include /usr/include

阅读全文

MySQL中MyISAM引擎表级锁
发表于 2016-7-6 | 浏览(2372) | 数据库

表名:lock_read

表类型:MyISAM(此引擎只支持表级锁,不支持行级锁,下面是测试表级锁)

锁类型:表锁

表结构:

CREATE TABLE `lock_read` (
	`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增id',
	`name` char(30) NOT NULL DEFAULT '' COMMENT '姓名',
	`age` tinyint(2) UNSIGNED NOT NULL DEFAULT '0' COMMENT '年龄',
	PRIMARY KEY (`id`)
) ENGINE=`MyISAM` AUTO_INCREMENT=1 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ROW_FORMAT=FIXED COMMENT='测试表级锁' CHECKSUM=0 DELAY_KEY_WRITE=0;

添加一条数据:INSERT INTO `lock_read` (`name`, `age`) VALUES ('小龚', 22);

终端一

1、查询本身数据
  SELECT * FROM lock_read;
  +----+--------+-----+
  | id | name   | age |
  +----+--------+-----+
  | 1  | 小龚   | 22  |
  +----+--------+-----+

2、加表锁
  LOCK TABLES lock_read READ;

3、更新数据
  UPDATE lock_read SET age=23 WHERE id=1;
  报错:Table 'lock_read' was locked with a READ lock and can't be updated
  解释:意思是表当前加锁中,不能被任何人更新(包括当前进程)

终端二

1、查询本身数据
  SELECT * FROM lock_read;
  +----+--------+-----+
  | id | name   | age |
  +----+--------+-----+
  | 1  | 小龚   | 22  |
  +----+--------+-----+

2、加表锁
  LOCK TABLES lock_read READ;

3、更新数据
  UPDATE lock_read SET age=24 WHERE id=1;
  报错:Table 'lock_read' was locked with a READ lock and can't be updated
  解释:意思是表当前加锁中,不能被任何人更新(包括当前进程)

  但是如果当前进程跳过步骤2,不对表进行加锁,那么是这样子的:
    前面进程已加锁了,那么当前进程就会进入阻塞状态,等到终端一的进程释放锁后,这条sql才能被执行成功

终端一

1、解锁
  UNLOCK TABLES;

2、更新数据
  UPDATE lock_read SET age=25 WHERE id=1;
  A、如果终端二加锁过了,那么当前进程就会进入阻塞状态,等待终端二的进程解锁后,这条sql才能被只成功
  B、如果终端二没有加锁,那么当前sql将执行成功

阅读全文

PHP中4种排序算法
发表于 2016-7-6 | 浏览(2777) | PHP
<?php

/**
 * PHP排序算法Demo
 */

/**
 * [bubble_sort 冒泡排序]
 * @param  [array] $data [需要排序的数据(相邻的数据进行比较调换位置)]
 * @return [array]       [排序好的数据]
 */
function bubble_sort($data)
{
	if(!empty($data) && is_array($data))
	{
		$len = count($data);
		for($i=0; $i<$len; $i++)
		{
			for($k=0; $k<$len-1; $k++)
			{
				if($data[$k] > $data[$i])
				{
					$data[$i] = $data[$i] ^ $data[$k];
					$data[$k] = $data[$i] ^ $data[$k];
					$data[$i] = $data[$i] ^ $data[$k];
				}
			}
		}
	}
	return $data;
}

/**
 * [select_sort 选择排序]
 * @param  [array] $data [需要排序的数据(选择最小的值与第一个调换位置)]
 * @return [array]       [排序好的数据]
 */
function select_sort($data)
{
	if(!empty($data) && is_array($data))
	{
		$len = count($data);
		for($i=0; $i<$len; $i++)
		{
			$t = $i;
			for($j=$i+1; $j<$len; $j++)
			{
				if($data[$t] > $data[$j])
				{
					$t = $j;
				}
			}
			if($t != $i)
			{
				$data[$i] = $data[$i] ^ $data[$t];
				$data[$t] = $data[$i] ^ $data[$t];
				$data[$i] = $data[$i] ^ $data[$t];
			}
		}
	}
	return $data;
}

/**
 * [insert_sort 插入排序]
 * @param  [array] $data [需要排序的数据(把第n个数插到前面的有序数组中,以此反复循环直到排序好)]
 * @return [array]       [排序好的数据]
 */
function insert_sort($data)
{
	if(!empty($data) && is_array($data))
	{
		$len = count($data);
		for($i=1; $i<$len; $i++)
		{
			$tmp = $data[$i];
			for($j=$i-1; $j>=0; $j--)
			{
				if($data[$j] > $tmp)
				{
					$data[$j+1] = $data[$j];
					$data[$j] 	= $tmp;
				} else {
					break;
				}
			}
		}
	}
	return $data;
}

/**
 * [quick_sort 快速排序]
 * @param  [array] $data [需要排序的数据(选择一个基准元素,将待排序分成小和打两罐部分,以此类推递归的排序划分两罐部分)]
 * @return [array]       [排序好的数据]
 */
function quick_sort($data)
{
	if(!empty($data) && is_array($data))
	{
		$len = count($data);
		if($len <= 1) return $data;

		$base = $data[0];
		$left_array = array();
		$right_array = array();
		for($i=1; $i<$len; $i++)
		{
			if($base > $data[$i])
			{
				$left_array[] = $data[$i];
			} else {
				$right_array[] = $data[$i];
			}
		}
		if(!empty($left_array)) $left_array = quick_sort($left_array);
		if(!empty($right_array)) $right_array = quick_sort($right_array);

		return array_merge($left_array, array($base), $right_array);
	}
}


/**
 * 测试
 */
$data = array(10, 3, 6, 1, 24, 18, 7, 8);
echo '<pre>';

// 冒泡排序
print_r(bubble_sort($data));

// 选择排序
print_r(select_sort($data));

// 插入排序
print_r(insert_sort($data));

// 快速排序
print_r(quick_sort($data));


// 以下是结果
Array
(
    [0] => 1
    [1] => 3
    [2] => 6
    [3] => 7
    [4] => 8
    [5] => 10
    [6] => 18
    [7] => 24
)
Array
(
    [0] => 1
    [1] => 3
    [2] => 6
    [3] => 7
    [4] => 8
    [5] => 10
    [6] => 18
    [7] => 24
)
Array
(
    [0] => 1
    [1] => 3
    [2] => 6
    [3] => 7
    [4] => 8
    [5] => 10
    [6] => 18
    [7] => 24
)
Array
(
    [0] => 1
    [1] => 3
    [2] => 6
    [3] => 7
    [4] => 8
    [5] => 10
    [6] => 18
    [7] => 24
)

?>

阅读全文

MySQL默认编码修改
发表于 2016-6-30 | 浏览(1861) | 数据库

mac下my.cnf默认位置

/usr/local/mysql/support-files
拷贝一份到/etc目录下 cp my-default.cnf /etc/my.cnf

mysql默认编码并不是utf-8,而是latin1(不支持中文,存储中文乱码)登录后使用 show variables 可以查看

1、vim /etc/my.cnf
  在 [mysqld] 下面添加默认编码
  character_set_server=utf8 
  init_connect='SET NAMES utf8'

2、重启mysql即可

阅读全文

MySQL SELECT语句IN与OR的效率
发表于 2016-6-30 | 浏览(2414) | 数据库

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 | 浏览(1974) | 数据库

下载地址

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 | 浏览(2342) | 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 | 浏览(2583) | 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 | 浏览(2444) | 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 | 浏览(1842) | 服务器

准备、创建脚本目录

/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

阅读全文

TOP