configure: error: libevent >= 1.4.11 could not be found

编译php5.3.3的时候报错
编译选项

./configure --prefix=/usr/local/php-5.3.3 \
--with-config-file-path=/usr/local/php-5.3.3/etc \
--with-bz2 \
--with-curl \
--enable-ftp \
--enable-sockets \
--disable-ipv6 \
--with-gd \
--with-jpeg-dir=/usr/local \
--with-png-dir=/usr/local \
--with-freetype-dir=/usr/local \
--enable-gd-native-ttf \
--with-iconv-dir=/usr/local \
--enable-mbstring \
--enable-calendar \
--with-gettext \
--with-libxml-dir=/usr/local \
--with-zlib \
--with-pdo-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-mysql=mysqlnd \
--enable-dom \
--enable-xml \
--enable-fpm \
--enable-debug \
--with-libdir=lib64

错误信息

configure: error: libevent >= 1.4.11 could not be found

安装相关的包

yum -y install libevent

依然报错
还是失败了,继续google,发现有人在ubuntu里面也遇到这个问题,再安装libevent-dev这个包之后解决问题了,于是我依样画葫芦:

yum -y install libevent-dev

安装完成

php-fpm开启core dump

转载自:https://kn007.net/topics/php-fpm-how-to-core-dump/
首先一点,需要打开debug参数,如果编译的时候没有打开,需要重新编译,编译时添加参数:

--enable-debug

设置内核core dump出来的存放路径(注意目录要有权限给php写):

echo "/tmp/core.%e.%p.%t" > /proc/sys/kernel/core_pattern

设置core dump出来的文件大小不做限制:

ulimit -c unlimited

关闭core dump只需要将大小限制为0就不会输出了(获得调试信息后设置这个就关闭core dump了)

ulimit -c 0

测试core dump是否开启成功
创建c程序文件

vim a.c
#include <stdio.h>;
int func(int *p)
{
        *p = 0;
}
int main()
{
        func(NULL);
        return 0;
}
gcc -o main a.c#编译
./main#执行,然后就会出现这个文件了

获得core dump文件,用gdb进行调试,比如:

gdb ~/main core.main.5021.iZ23sw4oxfvZ.1477623334

mysql存储过程

存储过程

存储过程优点

1.存储过程只在创建时编译,以后每次执行都不需要重新编译,而一般得sql语句每次执行都需要重新编译,所以使用存储过程可以提高数据库执行效率。
2.当对表进行复杂操作时(如对多个表进行update,insert,query,delete时),可将这些复杂操作用存储过程封装起来与数据库提供的事务处理结合使用,这些操作,如果用程序来完成就变成了一条条的sql语句,可能需要多次连接数据库,而使用存储过程,只需要连接一次数据库就可以了。
3.存储过程可以重复使用,可以减少数据库开发人员的工作量
4.安全性高,可以设定只有某用户才具有对指定存储过程的使用权

存储过程缺点

1.可移植性很差,不同的数据库不兼容
2.对于很简单的sql语句,存储过程没什么优势
3.使用存储过程不一定会减少网络传输,(存储过程的sql语句并不多,而且sql语句执行比较快,sql语句执行的频率也不大)
4.如果只有一个用户使用数据库,那么存储过程对于安全也没有什么影响
5.团队开发需要统一标准,否则后期维护是个麻烦
6.在大并发访问量的情况下,不宜写过多的设计运算的存储过程
7.业务逻辑复杂时,特别是涉及到对很大的表进行操作时,不如在前端先简化业务逻辑

互联网企业并发较大,不合适使用存储过程,内部使用的项目,并发较小,可以使用存储过程

创建存储过程

存储过程的参数

in参数的例子

in参数的特点;读取外部变量值,且有效范围仅限于存储过程内部

delimiter //
create procedure `p1`(in p int)
begin
    select p;
    set p=2;
    select p;
end//
delimiter ;

执行结果

mysql> set @p=1;
Query OK, 0 rows affected (0.00 sec)

mysql> select @p;
+------+
| @p   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> call p1(@p);
+------+
| p    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

+------+
| p    |
+------+
|    2 |
+------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> select @p;
+------+
| @p   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)
out参数

out参数的特点在于,不读取外部变量值,在存储过程中执行完毕后保留新值

delimiter //
create procedure `p2`(out p int)
begin
    select p;
    set p=2;
    select p;
end//
delimiter ;

执行结果

mysql> set @p=1;
Query OK, 0 rows affected (0.00 sec)

mysql> call p2(@p);
+------+
| p    |
+------+
| NULL |
+------+
1 row in set (0.00 sec)

+------+
| p    |
+------+
|    2 |
+------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> select @p;
+------+
| @p   |
+------+
|    2 |
+------+
1 row in set (0.00 sec)
inout参数

inout参数特点:读取外部变量值,在存储过程执行完毕之后保留新值

delimiter //
create procedure p3(inout p int)
begin
    select p;
    set p=2;
    select p;
end//
delimiter ;

例子

mysql> set @p=1;
Query OK, 0 rows affected (0.00 sec)

mysql> call p3(@p);
+------+
| p    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

+------+
| p    |
+------+
|    2 |
+------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> select @p;
+------+
| @p   |
+------+
|    2 |
+------+
1 row in set (0.00 sec)
不带参数类型
delimiter //
create procedure `p5`(p int)
begin
    set @x=0;
    repeat
        insert into `t5` value (@x);
        set @x=@x+1;
        until @x>p
    end repeat;
end//
delimiter ;

变量定义

mysql中使用declare进行变量定义,语法

declare variable_name[,variable_name....] datetype [default value];

其中datetype为mysql的数据类型,例如int,float,date,varchar(lenght),例如

declare i int unsigned default 1000;
declare n number(8,2) default 10.11;
declare d date default '2016-10-27';
declare t datetime default '2016-10-27 13:12:08';
declare c varchar(88) default 'default string';

变量赋值

mysql中使用set命令对变量赋值,语法
set variable_name=value[,variable_name=value....]
注意,变量赋值是可以在不同存储过程中继承的

mysql> create procedure p6() set @last='last';
Query OK, 0 rows affected (0.00 sec)

mysql> create procedure p7() select concat('Last string is',@last);
Query OK, 0 rows affected (0.00 sec)

mysql> call p7;
+--------------------------------+
| concat('Last string is',@last) |
+--------------------------------+
| NULL                           |
+--------------------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> call p6;
Query OK, 0 rows affected (0.00 sec)

mysql> call p7;
+--------------------------------+
| concat('Last string is',@last) |
+--------------------------------+
| Last string islast             |
+--------------------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

变量作用域

内部变量在其作用域内享有更高的优先权,当执行到end,内部变量消失时,此时已在其作用域外,变量不在可见了。因为在存储过程外再也找不到这个声明的变量,但是你可以通过out参数或者将其值指派给会话变量来保存其值

注释

"--" 单行注释
"/

...

/" 用于多行注释

循环语句以及流程控制语句

与触发器中的语法一致,可参考mysql触发器

查看存储过程状态

三种方式

mysql> show procedure status where Name='p7'\G;
*************************** 1. row ***************************
                  Db: test
                Name: p7
                Type: PROCEDURE
             Definer: root@%
            Modified: 2016-10-27 13:22:11
             Created: 2016-10-27 13:22:11
       Security_type: DEFINER
             Comment: 
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)

ERROR: 
No query specified

mysql> show create procedure p7\G;
*************************** 1. row ***************************
           Procedure: p7
            sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
    Create Procedure: CREATE DEFINER=`root`@`%` PROCEDURE `p7`()
select concat('Last string is',@last)
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)
mysql> select * from information_schema.Routines where ROUTINE_NAME='p1' and ROUTINE_TYPE='PROCEDURE'\G;
*************************** 1. row ***************************
           SPECIFIC_NAME: p1
         ROUTINE_CATALOG: def
          ROUTINE_SCHEMA: test
            ROUTINE_NAME: p1
            ROUTINE_TYPE: PROCEDURE
               DATA_TYPE: 
CHARACTER_MAXIMUM_LENGTH: NULL
  CHARACTER_OCTET_LENGTH: NULL
       NUMERIC_PRECISION: NULL
           NUMERIC_SCALE: NULL
      DATETIME_PRECISION: NULL
      CHARACTER_SET_NAME: NULL
          COLLATION_NAME: NULL
          DTD_IDENTIFIER: NULL
            ROUTINE_BODY: SQL
      ROUTINE_DEFINITION: begin
    select p;
    set p=2;
    select p;
end
           EXTERNAL_NAME: NULL
       EXTERNAL_LANGUAGE: NULL
         PARAMETER_STYLE: SQL
        IS_DETERMINISTIC: NO
         SQL_DATA_ACCESS: CONTAINS SQL
                SQL_PATH: NULL
           SECURITY_TYPE: DEFINER
                 CREATED: 2016-10-27 11:34:14
            LAST_ALTERED: 2016-10-27 11:34:14
                SQL_MODE: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
         ROUTINE_COMMENT: 
                 DEFINER: root@%
    CHARACTER_SET_CLIENT: utf8
    COLLATION_CONNECTION: utf8_general_ci
      DATABASE_COLLATION: latin1_swedish_ci
1 row in set (0.00 sec)

修改存储过程

mysql不支持修改存储过程中的代码,就不记录了

删除存储

drop procedure `p1`;

mysql自定义函数

自定义函数

创建函数

delimiter //
create function `myfunc`(num1 int,num2 int)
returns varchar(20)
begin
    if num1>num2 then
            return "num1 > num2";
        elseif num1<num2 then
            return "num1 < num2";
        else
            return "num1 = num2";
    end if;
    end//
delimiter ;

查看函数信息

mysql> show create function myfunc\G;
*************************** 1. row ***************************
            Function: myfunc
            sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
     Create Function: CREATE DEFINER=`root`@`%` FUNCTION `myfunc`(num1 int,num2 int) RETURNS varchar(10) CHARSET latin1
begin
    if num1>num2 then
            return "num1 > num2";
        elseif num1<num2 then
            return "num1 < num2";
        else
            return "num1 = num2";
    end if;
    end
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci

mysql> show function status\G;
*************************** 1. row ***************************
                  Db: test
                Name: myfunc
                Type: FUNCTION
             Definer: root@%
            Modified: 2016-10-27 10:19:46
             Created: 2016-10-27 10:19:46
       Security_type: DEFINER
             Comment: 
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci

删除函数

drop function `myfunc`;

mysql流程函数

流程函数

IF(expr1,expr2,expr3)

如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。

mysql> select if(1>2,6,8)
    -> ;
+-------------+
| if(1>2,6,8) |
+-------------+
|           8 |
+-------------+
1 row in set (0.00 sec)

CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END

在第一个方案的返回结果中, value=compare-value。而第二个方案的返回结果是第一种情况的真实结果。如果没有匹配的结果值,则返回结果为ELSE后的结果,如果没有ELSE 部分,则返回值为 NULL。

mysql> select case 1
    -> when 2 then 'A'
    -> when 1 then 'B'
    -> else 'C'
    -> end;
+-----------------------------------------------------+
| case 1 when 2 then 'A' when 1 then 'B' else 'C' end |
+-----------------------------------------------------+
| B                                                   |
+-----------------------------------------------------+
1 row in set (0.00 sec)

mysql> select case 
    -> when 1=1 then 'A'
    -> when 2>1 then 'B'
    -> ELSE 'C'
    -> END;
+--------------------------------------------------------+
| case 
when 1=1 then 'A'
when 2>1 then 'B'
ELSE 'C'
END |
+--------------------------------------------------------+
| A                                                      |
+--------------------------------------------------------+
1 row in set (0.00 sec)