MySQL连接操作

MySQL服务器允许的最大连接数16384

查看连接数

show processlist;

如果是root账户,则是所有用户的当前连接;如果是普通账户,则是自己占用的连接.

该命令只可以看到前100条记录,如果要查看所有的使用以下命令:

show full processlist;

查看连接

show status;
show status like '%下面变量%';
  • Aborted_clients 由于客户没有正确关闭连接已经死掉,已经放弃的连接数量。
  • Aborted_connects 尝试已经失败的MySQL服务器的连接的次数。
  • Connections 试图连接MySQL服务器的次数。
  • Created_tmp_tables 当执行语句时,已经被创造了的隐含临时表的数量。
  • Delayed_insert_threads 正在使用的延迟插入处理器线程的数量。
  • Delayed_writes 用INSERT DELAYED写入的行数。
  • Delayed_errors 用INSERT DELAYED写入的发生某些错误(可能重复键值)的行数。
  • Flush_commands 执行FLUSH命令的次数。
  • Handler_delete 请求从一张表中删除行的次数。
  • Handler_read_first 请求读入表中第一行的次数。
  • Handler_read_key 请求数字基于键读行。
  • Handler_read_next 请求读入基于一个键的一行的次数。
  • Handler_read_rnd 请求读入基于一个固定位置的一行的次数。
  • Handler_update 请求更新表中一行的次数。
  • Handler_write 请求向表中插入一行的次数。
  • Key_blocks_used 用于关键字缓存的块的数量。
  • Key_read_requests 请求从缓存读入一个键值的次数。
  • Key_reads 从磁盘物理读入一个键值的次数。
  • Key_write_requests 请求将一个关键字块写入缓存次数。
  • Key_writes 将一个键值块物理写入磁盘的次数。
  • Max_used_connections 同时使用的连接的最大数目。
  • Not_flushed_key_blocks 在键缓存中已经改变但是还没被清空到磁盘上的键块。
  • Not_flushed_delayed_rows 在INSERT DELAY队列中等待写入的行的数量。
  • Open_tables 打开表的数量。
  • Open_files 打开文件的数量。
  • Open_streams 打开流的数量(主要用于日志记载)
  • Opened_tables 已经打开的表的数量。
  • Questions 发往服务器的查询的数量。
  • Slow_queries 要花超过long_query_time时间的查询数量。
  • Threads_connected 当前打开的连接的数量。
  • Threads_running 不在睡眠的线程数量。
  • Uptime 服务器工作了多少秒。

清理连接

数据库在默认情况下,sleep超时时间一般会默认为8小时,8小时后mysql会把这些sleep连接从连接池中剔除,下次业务则需重连。

结束命令:kill '连接ID'

PHP清理脚本

<?php
define('MAX_SLEEP_TIME', 1000);

$hostname = "ip:port";
$username = "username";
$password = "password";

$connect = mysql_connect($hostname, $username, $password);
$result = mysql_query("SHOW PROCESSLIST", $connect);
while ($proc = mysql_fetch_assoc($result)) {
    if ($proc["Command"] == "Sleep" && $proc["Time"] > MAX_SLEEP_TIME) {
        @mysql_query("KILL " . $proc["Id"], $connect);
    }
}
mysql_close($connect);
?>

PHP微信退款异步通知aes-256-ecb解密

实现代码

/**
 * 对微信退款回调的加密数据进行解密
 *
 * @param string $encryptData 原始加密数据
 * @param string $key 加密key
 *
 * @return string 解密后的xml数据
 */
public function decryptData( $encryptData, $key = '' )
{
    //1. base64_decode
    $encryptData = base64_decode( $encryptData );

    //2. md5 original key
    $md5LowerKey = strtolower( md5( $key ) );

    //3. decrypt AES ECB
    $decrypted = openssl_decrypt( $encryptData, 'AES-256-ECB', $md5LowerKey, OPENSSL_RAW_DATA );

    return $decrypted;
}

遇到的坑

  1. openssl_decrypt第四个参数一定要使用OPENSSL_RAW_DATA
  2. 解密后的数据是XML格式,一定要注意

Centos中完全删除mysql的方法

yum方式安装的MySQL

$ yum remove mysql mysql-server mysql-libs compat-mysql51
$ rm -rf /var/lib/mysq
$ rm /etc/my.cnf

# 查看是否还有mysql软件:
$ rpm -qa|grep mysql

# 如果存在的话,继续删除即可,删除方式:yum remove + 【名字】。

rpm方式安装的mysql

查看系统中是否以rpm包安装的mysql:

[root@localhost opt]# rpm -qa | grep -i mysql
MySQL-server-5.6.17-1.el6.i686
MySQL-client-5.6.17-1.el6.i686

卸载mysql

[root@localhost local]# rpm -e MySQL-server-5.6.17-1.el6.i686
[root@localhost local]# rpm -e MySQL-client-5.6.17-1.el6.i686

删除mysql服务

[root@localhost local]# chkconfig --list | grep -i mysql
[root@localhost local]# chkconfig --del mysql

删除分散mysql文件夹

[root@localhost local]# whereis mysql
mysql: /usr/lib/mysql /usr/share/mysql

或者

[root@localhost local]# find / -name mysql
mysql: /usr/lib/mysql /usr/share/mysql

清空相关mysql的所有目录以及文件

rm -rf /usr/lib/mysql
rm -rf /usr/share/mysql
rm -rf /usr/my.cnf

查看程序端口占用情况,进程情况

命令:ps -aux | grep tomcat|java|pid ,查看Tomcat|java|8080端口 的进程

命令:netstat –apn 查看所有的进程和端口使用情况。发现下面的进程列表,其中最后一栏是PID/Program name

命令:netstat –apn | grep 8080 直接查看8080端口的占用情况

PHP curl

转自 http://www.phpchina.com/article-40161-1.html

1. 拿来先试试手

<?php 
    // create curl resource 
   $ch = curl_init(); 

   // set url 
   curl_setopt($ch, CURLOPT_URL, "baidu.com"); 

   //return the transfer as a string 
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

   // $output contains the output string 
   $output = curl_exec($ch); 

    //echo output
    echo $output;

   // close curl resource to free up system resources 
   curl_close($ch);      
?>

$ch = curl_init(),创建了一个curl会话资源,成功返回一个句柄;

curl_setopt($ch, CURLOPT_URL, "baidu.com"),设置URL;

上面两句可以合起来变一句$ch = curl_init("baidu.com");

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0)这是设置是否将响应结果存入变量,1是存入,0是直接echo出;

$output = curl_exec($ch)执行,然后将响应结果存入$output变量,供下面echo;

curl_close($ch)关闭这个curl会话资源。

总结一下:php中curl用法就是:创建curl会话 -> 配置参数 -> 执行 -> 关闭会话。

2. GET和POST请求以及HTTPS协议处理

2.1 GET请求

//通过curl进行GET请求的案例
<?php 
    // create curl resource 
   $ch = curl_init(); 

   // set url 
   curl_setopt($ch, CURLOPT_URL, "https://github.com/search?q=react"); 

   //return the transfer as a string 
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

   // $output contains the output string 
   $output = curl_exec($ch); 

   //echo output
   echo $output;

   // close curl resource to free up system resources 
   curl_close($ch);      
?>

其中需要注意,如果访问的地址是HTTPS且用了非法或者自制的证书,需要把CURLOPT_SSL_VERIFYPEER CURLOPT_SSL_VERIFYHOST 设置为 false 以避开证书检查。

2.2 POST请求

接收POST请求的脚本

//testRespond.php
<?php  
    $phpInput=file_get_contents('php://input');
    echo urldecode($phpInput);
?>

请求脚本

<?php 
    $data=array(
    "name" => "Lei",
    "msg" => "Are you OK?"
    );

    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL, "http://测试服务器的IP马赛克/testRespond.php"); 
    curl_setopt($ch, CURLOPT_POST, 1);
    //The number of seconds to wait while trying to connect. Use 0 to wait indefinitely.
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60); 
    curl_setopt($ch, CURLOPT_POSTFIELDS , http_build_query($data));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

    $output = curl_exec($ch); 

    echo $output;

    curl_close($ch);      
?>

结果

name=Lei&msg=Are you OK?

curl_setopt($ch, CURLOPT_POST, 1)表明是POST请求;

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60)设置一个*长的可忍受的连接时间,秒为单位;

curl_setopt($ch, CURLOPT_POSTFIELDS , http_build_query($data))设置POST的数据域,因为这里是数组数据形式的(等会来讲json格式),所以用http_build_query处理一下。

对于json数据进行POST请求

<?php 
    $data='{"name":"Lei","msg":"Are you OK?"}';

    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL, "http://测试服务器的IP马赛克/testRespond.php"); 
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length:' . strlen($data)));
    curl_setopt($ch, CURLOPT_POSTFIELDS , $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

    $output = curl_exec($ch); 

    echo $output;

    curl_close($ch);      
?>

浏览器执行,显示:

{"name":"Lei","msg":"Are you OK?"}

3. 上传和下载文件

3.1 POST上传文件

远程服务器端先传好一个接收脚本,接收图片并且保存到本地,注意文件和文件夹权限问题,需要有写入权限:

<?php
    if($_FILES){
        $filename = $_FILES['upload']['name'];
          $tmpname = $_FILES['upload']['tmp_name'];
          //保存图片到当前脚本所在目录
          if(move_uploaded_file($tmpname,dirname(__FILE__).'/'.$filename)){
            echo ('上传成功');
          }
    }
?>

本地服务器的php curl部分:

// PHP 5.3版本及以前用@符号
<?php 
    $data = array('name'=>'boy', "upload"=>"@boy.png");

    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL, "http://远程服务器地址马赛克/testRespond.php"); 
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60); 
    curl_setopt($ch, CURLOPT_POSTFIELDS , $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

    $output = curl_exec($ch); 

    echo $output;

    curl_close($ch);         
?>
// PHP5.6及以后版本的上传方式
<?php 
    $data = array('name'=>'boy', "upload"=>"");
    $ch = curl_init(); 

    $data['upload']=new CURLFile(realpath(getcwd().'/boy.png'));

    curl_setopt($ch, CURLOPT_URL, "http://115.29.247.189/test/testRespond.php");
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60); 
    curl_setopt($ch, CURLOPT_POSTFIELDS , $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

    $output = curl_exec($ch); 

    echo $output;

    curl_close($ch);         
?>

3.2 抓取图片

<?php 
    $ch = curl_init(); 

    $fp=fopen('./girl.jpg', 'w');

    curl_setopt($ch, CURLOPT_URL, "http://远程服务器地址马赛克/girl.jpg"); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60); 
    curl_setopt($ch, CURLOPT_FILE, $fp); 

    $output = curl_exec($ch); 
    $info = curl_getinfo($ch);

    fclose($fp);

    $size = filesize("./girl.jpg");
    if ($size != $info['size_download']) {
        echo "下载的数据不完整,请重新下载";
    } else {
        echo "下载数据完整";
    }

    curl_close($ch);    
?>

curl_getinfo 是获取本次请求相关信息的方法。

4. HTTP认证怎么搞

function curl_auth($url,$user,$passwd){
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_USERPWD => $user.':'.$passwd,
        CURLOPT_URL     => $url,
        CURLOPT_RETURNTRANSFER => true
    ]);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

$authurl = 'http://要请求HTTP认证的地址';

echo curl_auth($authurl,'vace','passwd');

curl_setopt_array 这个方法可以通过数组一次性地设置多个参数,防止有些需要多处设置的出现密密麻麻的curl_setopt方法。

5. 利用cookie模拟登陆

这个事情分两步,一是去登陆界面通过账号密码登陆,然后获取cookie,二是去利用cookie模拟登陆到信息页面获取信息,大致的框架是这样的。

<?php 
  //设置post的数据  
  $post = array ( 
    'email' => '账户', 
    'pwd' => '密码'
  ); 
  //登录地址  
  $url = "登陆地址";  
  //设置cookie保存路径  
  $cookie = dirname(__FILE__) . '/cookie.txt';  
  //登录后要获取信息的地址  
  $url2 = "登陆后要获取信息的地址";  
  //模拟登录 
  login_post($url, $cookie, $post);  
  //获取登录页的信息  
  $content = get_content($url2, $cookie);  
  //删除cookie文件 
  @ unlink($cookie);
     
  var_dump($content);    
?>
//模拟登录  
function login_post($url, $cookie, $post) { 
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0);
    curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie);
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));
    curl_exec($curl); 
    curl_close($curl);
} 

//登录成功后获取数据  
function get_content($url, $cookie) { 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); 
    $rs = curl_exec($ch); 
    curl_close($ch); 
    return $rs; 
}