龚哥哥 - 山里男儿 爱生活、做自己!
Mac phpize错误解决方案
发表于 2016-7-10 | 浏览(6223) | 服务器
grep: /usr/include/php/main/php.h: No such file or directory
grep: /usr/include/php/Zend/zend_modules.h: No such file or directory
grep: /usr/include/php/Zend/zend_extensions.h: No such file or directory
Configuring for:
PHP Api Version:        
Zend Module Api No:     
Zend Extension Api No:  

解决方案
  sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include /usr/include

  MacOSX10.11.sdk 是当前系统下的文件,系统不同版本对应不同的文件名称,可以使用ls先看一下SDK文件名称做相应的修改再执行命令
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.

解决方案
  brew install autoconf

阅读全文

Mac安装PHP Swoole扩展
发表于 2016-7-10 | 浏览(7812) | 服务器

系统软件版本

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

表名: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 | 浏览(7659) | 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 | 浏览(5838) | 数据库

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

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

下载地址

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-15 | 浏览(7454) | 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 | 浏览(7180) | 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 | 浏览(7304) | 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; 
}

阅读全文

TOP