php与mysql的连接有三种方式,mysql,mysqli,pdo。不管使用哪种方式进行连接,都有使用buffer和不使用buffer的区别。

什么叫使用buffer和不使用buffer呢?

客户端与mysql服务端进行查询操作,查询操作的时候如果获取的数据量比较大,那个这个查询结果放在哪里呢?
有两个地方可以放:客户端的缓冲区和服务端的缓冲区。
我们这里说的buffer指的是客户端的缓冲区,如果查询结果已经从服务端获取回来了,放置在了客户端的缓冲区,我们就称之为使用buffer。如果还是存放在服务端的缓冲区的话,我们就说没有使用buffer(unbuffer)。

使用buffer和不使用buffer有什么区别?

主要在内存方面,使用buffer会增加客户端的内存压力,当返回的数据结果特别大的时候可能会占用调用客户端(实际就是一个php进程)比较大的进程。不使用buffer自然对服务端(这里说的是提供mysql服务的服务器)压力更大。
具体可以参考:PHP查询MySQL大量数据的内存占用分析

php中三种模式是如何设置是否使用buffer的?

mysql默认的query是使用buffer的,而不使用buffer就需要使用mysql_unbuffer_query
mysqli默认的query是不使用buffer的,要使用buffer就需要设置MYSQLI_STORE_RESULT
// mysqli使用buffer
mysqli_query($db, $sql, MYSQLI_STORE_RESULT);
// mysqli不使用buffer
$result = mysqli_query($db, $sql);
pdo默认的quey是不使用buffer的,要使用buffer就需要设置MYSQL_ATTR_USE_BUFFERED_QUERY
// pdo不使用buffer
$stmt = $pdo->prepare($sql);
$stmt->execute();
$data = array();
$data = $stmt->fetchAll();

// pdo使用buffer
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
$stmt = $pdo->prepare($sql);
$stmt->execute();
$data = array();
$data = $stmt->fetchAll();

单机模式(standalone)

   单机模式是Hadoop的默认模式。当首次解压Hadoop的源码包时,Hadoop无法了解硬件安装环境,便保守地选择了最小配置。在这种默认模式下所有3个XML文件均为空。当配置文件为空时,Hadoop会完全运行在本地。因为不需要与其他节点交互,单机模式就不使用HDFS,也不加载任何Hadoop的守护进程。该模式主要用于开发调试MapReduce程序的应用逻辑。

评论:此程序一般不建议安装,网络上很少这方面资料

伪分布模式(Pseudo-Distributed Mode)

  伪分布模式在“单节点集群”上运行Hadoop,其中所有的守护进程都运行在同一台机器上。该模式在单机模式之上增加了代码调试功能,允许你检查内存使用情况,HDFS输入输出,以及其他的守护进程交互。

评论:比如namenode,datanode,secondarynamenode,jobtracer,tasktracer这5个进程
5进程的了解,详细可以查看hadoop详细了解5个进程的作用

全分布模式(Fully Distributed Mode)
Hadoop守护进程运行在一个集群上。

评论:意思是说master上看到namenode,jobtracer,secondarynamenode可以安装在master节点,也可以单独安装。
slave节点能看到datanode和tasktracer

(1)首先进入go/src 源码所在目录,执行如下命令创建目标平台所需的包和工具文件。

$ cd /usr/local/go/src
$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash

如果是 Windows 则修改 GOOS 即可。

$ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash

以上假定是64位架构,32位,修改GOARCH为386

mips架构的cpu

//下载go-mips32源 
git clone https://github.com/gomini/go-mips32.git 
cd go-mips32/src

//配置GO编译参数 
export GOOS=linux 
export GOARCH=mips32

//执行编译
./make.bash 

(2) 现在可以编译 Linux 和 Windows 平台所需的执行文件了。

$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
$ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
$ CGO_ENABLED=0 GOOS=linux  GOARCH=mips32  go build

一、安装Nginx和OpenSSL

yum install nginx openssl -y

二、SSL 服务器 / 客户端双向验证证书的生成

创建一个新的 CA 根证书,在 nginx 安装目录下新建 ca 文件夹,进入 ca,创建几个子文件夹

mkdir ca && cd ca  
mkdir newcerts private conf server

# newcerts 子目录将用于存放 CA 签署过的数字证书(证书备份目录);private 用于存放 CA 的私钥;conf 目录用于存放一些简化参数用的配置文件;server 存放服务器证书文件。

conf 目录新建 openssl.conf 文件

[ ca ] 
default_ca      = foo                   # The default ca section 

[ foo ] 
dir            = ./         # top dir  
database       = ./index.txt          # index file.  
new_certs_dir  = ./newcerts           # new certs dir 

certificate    = ./private/ca.crt         # The CA cert  
serial         = ./serial             # serial no file  
private_key    = ./private/ca.key  # CA private key  
RANDFILE       = ./private/.rand      # random number file 

default_days   = 3650                     # how long to certify for  
default_crl_days= 30                     # how long before next CRL  
default_md     = sha256                     # message digest method to use  
unique_subject = no                      # Set to 'no' to allow creation of  
                                         # several ctificates with same subject. 
policy         = policy_any              # default policy 

[ policy_any ] 
countryName = match  
stateOrProvinceName = match  
organizationName = match  
organizationalUnitName = match  
localityName            = optional  
commonName              = supplied  
emailAddress            = optional  

生成私钥 key 文件

openssl genrsa -out private/ca.key 2048  
输出
Generating RSA private key, 2048 bit long modulus  
.......+++
.........................+++
e is 65537 (0x10001)  
private 目录下有 ca.key 文件生成。 

生成证书请求 csr 文件

openssl req -new -key private/ca.key -out private/ca.csr  

生成凭证 crt 文件

openssl x509 -req -days 365 -in private/ca.csr -signkey private/ca.key -out private/ca.crt  

private 目录下有 ca.crt 文件生成。

为我们的 key 设置起始序列号和创建 CA 键库

echo FACE > serial  
#可以是任意四个字符
touch index.txt  

为 "用户证书" 的移除创建一个证书撤销列表

openssl ca -gencrl -out ./private/ca.crl -crldays 7 -config "./conf/openssl.conf"  
# 输出
Using configuration from ./conf/openssl.conf  
private 目录下有 ca.crl 文件生成。  

三、服务器证书的生成

创建一个 key

openssl genrsa -out server/server.key 2048  
为我们的 key 创建一个证书签名请求 csr 文件
openssl req -new -key server/server.key -out server/server.csr  
使用我们私有的 CA key 为刚才的 key 签名
openssl ca -in server/server.csr -cert private/ca.crt -keyfile private/ca.key -out     server/server.crt -config "./conf/openssl.conf"  
# 输出
Using configuration from ./conf/openssl.conf  
Check that the request matches the signature  
Signature ok  
The Subject's Distinguished Name is as follows  
countryName           :PRINTABLE:'CN'  
stateOrProvinceName   :ASN.1 12:'GuangDong'  
localityName          :ASN.1 12:'XX'  
organizationName      :ASN.1 12:'****'  
organizationalUnitName:ASN.1 12:'**'  
commonName            :ASN.1 12:'**'  
emailAddress          :IA5STRING:'****'  
Certificate is to be certified until Mar 19 07:37:02 2017 GMT (365 days)  
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y  
Write out database with 1 new entries  
Data Base Updated  

注:签名信息每次必须输入一致
四、客户端证书的生成 * 创建存放 key 的目录 users

mkdir users  

* 为用户创建一个 key

openssl genrsa -des3 -out ./users/client.key 2048  
输出:
Enter pass phrase for ./users/client.key:123  
Verifying - Enter pass phrase for ./users/client.key:123  
#要求输入 pass phrase,这个是当前 key 的口令,以防止本密钥泄漏后被人盗用。两次输入同一个密码(比如我这里输入     123),users 目录下有 client.key 文件生成。
为 key 创建一个证书签名请求 csr 文件
openssl req -new -key ./users/client.key -out ./users/client.csr  
#users 目录下有 client.csr 文件生成。

使用我们私有的 CA key 为刚才的 key 签名

openssl ca -in ./users/client.csr -cert ./private/ca.crt -keyfile ./private/ca.key -out    ./users/client.crt -config "./conf/openssl.conf"  

将证书转换为大多数浏览器都能识别的 PKCS12 文件

openssl pkcs12 -export -clcerts -in ./users/client.crt -inkey ./users/client.key -out ./users/client.p12  

输出

Enter pass phrase for ./users/client.key:  
Enter Export Password:  
Verifying - Enter Export Password:  

输入密码后,users 目录下有 client.p12 文件生成。
五、Nginx配置

vhosts.xxx.conf 在 server { }段输入如下代码

    listen       443; 
    server_name  localhost; 
    ssi on; 
    ssi_silent_errors on; 
    ssi_types text/shtml; 

    ssl                  on; 
    ssl_certificate      /usr/local/nginx/ca/server/server.crt; 
    ssl_certificate_key  /usr/local/nginx/ca/server/server.key; 
    ssl_client_certificate /usr/local/nginx/ca/private/ca.crt; 

    ssl_session_timeout  5m; 
    ssl_verify_client on;  #开户客户端证书验证 
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDH:AES:HIGH:!aNULL:!MD5:!ADH:!DH;
    ssl_prefer_server_ciphers   on; 

重新启动Nginx

nginx -t
nginx -s reload

上面教程from https://blog.imdst.com/nginx-ssl-shuang-xiang-ren-zheng-key-sheng-cheng-he-pei-zhi/
php使用
把p12格式转换为pem格式(假设你的p12文件名为:client.p12):

openssl pkcs12 -in client.p12 -out client.pem -nokeys       #客户端个人证书的公钥  
openssl pkcs12 -in client.p12 -out private.pem -nocerts -nodes #客户端个人证书的私钥  

也可以转换为公钥与私钥合二为一的文件;

openssl pkcs12 -in client.p12 -out all.pem -nodes #客户端公钥与私钥,一起存在all.pem中  

在执行过程中,可能需要你输入导出证书时设置的密码。执行成功后,我们就有了这些文件:client.pem——客户端公钥,key.pem——客户端私钥,或者二合一的all.pem。

//公钥
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT, 'client.pem');
//私钥
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY, 'private.pem');