分类 服务器 下的文章

准备工作

创建相关目录和文件

mkdir -p ./CA/{private,newcerts} && cd ./CA
echo 01 > serial
touch index.txt index.txt.attr

OpenSSL配置文件

编辑openssl.cnf

vi openssl.cnf

将以下内容复制到openssl.cnf文件

[ ca ]
default_ca = CA_default

[ CA_default ]
# Directory and file locations.
dir             = ../CA                 # Where everything is kept
certs           = $dir/certs            # Where the issued certs are kept
crl_dir         = $dir/crl              # Where the issued crl are kept
new_certs_dir   = $dir/newcerts         # default place for new certs.
database        = $dir/index.txt        # database index file.
serial          = $dir/serial           # The current serial number
RANDFILE        = $dir/private/.rand    # private random number file
#unique_subject  = no                   # Set to 'no' to allow creation of
                                        # several ctificates with same subject.

# The root key and root certificate.
private_key     = $dir/private/cakey.pem# The private key
certificate     = $dir/cacert.pem       # The CA certificate

# For certificate revocation lists.
crlnumber         = $dir/crlnumber      # the current crl number
crl               = $dir/crl.pem        # The current CRL
crl_extensions    = crl_ext

# SHA-1 is deprecated, so use SHA-2 instead.
preserve          = no                  # keep passed DN ordering
default_md        = sha256              # use SHA-256 by default
default_days      = 365                 # how long to certify for
default_crl_days  = 30                  # how long before next CRL

# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)
policy            = policy_match

# For the CA policy
[ policy_match ]
countryName             = match
stateOrProvinceName     = match
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional
vi root.conf
[ req ]
default_bits        = 2048
default_keyfile     = r.pem
default_md          = sha256
string_mask         = nombstr
distinguished_name  = req_distinguished_name
req_extensions      = req_ext
x509_extensions     = x509_ext

[ req_distinguished_name ]
countryName                 = Country Name (2 letter code)
countryName_default         = CN
stateOrProvinceName         = State or Province Name (full name)
stateOrProvinceName_default = Guangdong
localityName                = Locality Name (eg, city)
localityName_default        = Shaoguan
organizationName            = Organization Name (eg, company)
organizationName_default    = jwj
commonName                  = Common Name (e.g. server FQDN or YOUR name)
commonName_max              = 64
commonName_default          = jwj

[ x509_ext ]
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints       = CA:TRUE,pathlen:3
keyUsage               = digitalSignature, keyEncipherment, keyCertSign, cRLSign

[ req_ext ]
subjectKeyIdentifier = hash
basicConstraints     = CA:TRUE
keyUsage             = digitalSignature, keyEncipherment, keyCertSign, cRLSign

参数含义:

字段 值
countryName 国家名缩写
stateOrProvinceName 州或省
localityName 地点,如城市
organizationName 组织名
commonName 商标(证书上显示的 CA 名称)

  • xxx_default 设置该字段默认值,这样等一下生成证书时就不用手动填写信息,直接回车使用默认值就行了。

生成 CA 根密钥:

openssl genrsa -out ./private/cakey.pem 2048
Generating RSA private key, 2048 bit long modulus
......................................+++
........................+++
e is 65537 (0x10001)

自签发 CA 根证书:

openssl req -new -x509 -key ./private/cakey.pem -out ./cacert.pem -days 7300 -config ./root.conf
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CN]:
State or Province Name (full name) [GuangDong]:
Locality Name (eg, city) [ShaoGuan]:
Organization Name (eg, company) [jwj]:
Common Name (e.g. server FQDN or YOUR name) [My CA]:

将 PEM 格式证书转为常用的 DER 格式:

openssl x509 -inform PEM -in ./cacert.pem -outform DER -out ./CA.cer

用 CA 证书签发 SSL 证书
创建文件夹方便管理:

mkdir ../i0w.cn && cd ../i0w.cn

创建用户证书配置文件:

vi server.conf
[ req ]
default_bits        = 2048
default_keyfile     = r.pem
default_md          = sha256
string_mask         = nombstr
distinguished_name  = req_distinguished_name
req_extensions      = req_ext
x509_extensions     = x509_ext

[ req_distinguished_name ]
countryName                 = Country Name (2 letter code)
countryName_default         = CN
stateOrProvinceName         = State or Province Name (full name)
stateOrProvinceName_default = Guangdong
localityName                = Locality Name (eg, city)
localityName_default        = Shaoguan
organizationName            = Organization Name (eg, company)
organizationName_default    = jwj
commonName                  = Common Name (e.g. server FQDN or YOUR name)
commonName_max              = 64
commonName_default          = localhost

[ x509_ext ]
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints       = CA:FALSE
keyUsage               = digitalSignature, keyEncipherment
subjectAltName         = @alt_names

[ req_ext ]
subjectKeyIdentifier = hash
basicConstraints     = CA:FALSE
keyUsage             = digitalSignature, keyEncipherment
subjectAltName       = @alt_names

[ alt_names ]
DNS.1   = localhost
DNS.2   = i0w.cn
DNS.3   = *.i0w.cn
IP.1    = 127.0.0.1
IP.2    = 192.168.0.111
IP.3    = 192.168.1.111

注意:

  1. 在 [ alt_names ] 下填写要签发证书的域名或 IP,支持通配符;
  2. Firefox 下出现 MOZILLA_PKIX_ERROR_CA_CERT_USED_AS_END_ENTITY,原因是 basicConstraints 被设置成了 CA:TRUE,改为 CA:FALSE 即可。

生成用户 RSA 密钥:

openssl genrsa -out ./server.key 2048
Generating RSA private key, 2048 bit long modulus
.......................................................................................+++
................+++
e is 65537 (0x10001)

生成用户证书请求:

openssl req -new -key ./server.key -out ./server.csr -config ./server.conf
Generating RSA private key, 2048 bit long modulus
.......................................................................................+++
................+++
e is 65537 (0x10001)
[root@huawei i0w.cn]# openssl req -new -key ./server.key -out ./server.csr -config ./server.conf
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CN]:
State or Province Name (full name) [GuangDong]:
Locality Name (eg, city) [ShaoGuang]:
Organization Name (eg, company) [jwj]:
Common Name (e.g. server FQDN or YOUR name) [*.i0w.cn]:

签发用户证书:

openssl ca -config ../CA/openssl.cnf -in ./server.csr -out ./server.crt -days 3650 -extensions x509_ext -extfile ./server.conf
Using configuration from ../CA/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'CN'
stateOrProvinceName   :PRINTABLE:'GuangDong'
localityName          :PRINTABLE:'ShaoGuang'
organizationName      :PRINTABLE:'jwj'
commonName            :T61STRING:'*.i0w.cn'
Certificate is to be certified until Jun 10 01:39:26 2030 GMT (3650 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

附上证书签发目录结构:

$ tree
.
├── demoCA
│   ├── CA.cer              # CA 证书(DER 格式)
│   ├── cacert.pem          # CA 证书(PEM 格式)
│   ├── index.txt           # 签发记录数据库
│   ├── index.txt.attr
│   ├── index.txt.old
│   ├── newcerts
│   │   └── 01.pem
│   ├── private
│   │   └── cakey.pem       # CA 私钥
│   ├── serial
│   └── serial.old
├── 2heng.xin
│   ├── 2heng.xin.crt       # 用户证书
│   ├── 2heng.xin.csr
│   └── 2heng.xin.key       # 用户证书私钥
├── root.conf               # CA 配置文件
└── server.conf             # 用户配置文件

参考来源:
https://2heng.xin/2018/12/16/your-own-ca-with-openssl/
https://blog.csdn.net/cuitone/article/details/87966042

下载:https://downloads.mysql.com/archives/community/
解压到:C:\Program Files目录
创建my.ini配置文件

[mysql]
port = 3306
default-character-set=utf8

[mysqld]
default_authentication_plugin=mysql_native_password
port = 3306
basedir="C:/Program Files/mysql-5.7.28-winx64"
datadir="C:/Program Files/mysql-5.7.28-winx64/data"
log-error="C:/Program Files/mysql-5.7.28-winx64/logs/mysql.log"
character-set-server=utf8
default-storage-engine=INNODB

C:/Program Files/mysql-5.7.28-winx64加入环境变量
初始化mysql

mysqld --initialize-insecure --user=root

初始化后,默认用户为root,密码为空
安装服务

mysqld --install

执行返回

Service successfully installed.

启动服务

因业务需要需要使用MQ,需要用到amqp,但现在所使用的PHP环境没有装这个扩展,参考segmentfault里的一篇教程进行安装,整理出了下面的教程。在这里,感谢@一个向往前端的后端工程师

安装rabbitmq-c

在安装amqp之前还需要安装另外一个通讯扩展rabbitmq-c。

下载源代码

最新源代码地址可以从github获取,这里用的是v0.10.0版本(发布本教程时最新版)

wget https://github.com/alanxz/rabbitmq-c/archive/v0.10.0.zip

解压源代码并转到源代码目录

unzip v0.10.0.zip && cd rabbitmq-c-0.10.0

让cmake根据CMakeList.txt创建Makefile文件

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/rabbitmq-c .

执行结果

-- The C compiler identification is GNU 4.8.5
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- CMAKE_BUILD_TYPE not specified. Creating Release build
-- Found C inline keyword: inline
-- Looking for getaddrinfo
-- Looking for getaddrinfo - found
-- Looking for socket
-- Looking for socket - found
-- Looking for poll
-- Looking for poll - found
-- Looking for clock_gettime in rt
-- Looking for clock_gettime in rt - found
-- Looking for posix_spawnp in rt
-- Looking for posix_spawnp in rt - found
-- Found OpenSSL: /usr/lib64/libssl.so;/usr/lib64/libcrypto.so (found suitable version "1.0.2k", minimum required is "0.9.8")
-- Looking for include file pthread.h
-- Looking for include file pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
-- Performing Test HAVE_GNU90
-- Performing Test HAVE_GNU90 - Success
-- Could NOT find POPT (missing:  POPT_INCLUDE_DIR POPT_LIBRARY)
-- Could NOT find XMLTO (missing:  XMLTO_EXECUTABLE)
-- Could NOT find Doxygen (missing:  DOXYGEN_EXECUTABLE)
-- Building rabbitmq as a shared library - yes
-- Building rabbitmq as a static library - yes
-- Configuring done
-- Generating done
-- Build files have been written to: /root/rabbitmq-c-0.10.0

开始编译rabbitmq-c库

cmake --build . --target install

执行结果

Scanning dependencies of target rabbitmq
[  1%] Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o
[  2%] Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o
[  4%] Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o
[  5%] Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o
[  7%] Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o
[  8%] Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o
[ 10%] Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o
[ 11%] Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o
[ 13%] Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.o
[ 14%] Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o
[ 15%] Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o
[ 17%] Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o
[ 18%] Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o
[ 20%] Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o
Linking C shared library librabbitmq.so
[ 20%] Built target rabbitmq
Scanning dependencies of target rabbitmq-static
[ 21%] Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o
[ 23%] Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o
[ 24%] Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o
[ 26%] Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o
[ 27%] Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o
[ 28%] Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o
[ 30%] Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o
[ 31%] Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o
[ 33%] Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.o
[ 34%] Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o
[ 36%] Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o
[ 37%] Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o
[ 39%] Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o
[ 40%] Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o
Linking C static library librabbitmq.a
[ 40%] Built target rabbitmq-static
Scanning dependencies of target amqp_bind
[ 42%] Building C object examples/CMakeFiles/amqp_bind.dir/amqp_bind.c.o
[ 43%] Building C object examples/CMakeFiles/amqp_bind.dir/utils.c.o
[ 44%] Building C object examples/CMakeFiles/amqp_bind.dir/unix/platform_utils.c.o
Linking C executable amqp_bind
[ 44%] Built target amqp_bind
Scanning dependencies of target amqp_connect_timeout
[ 46%] Building C object examples/CMakeFiles/amqp_connect_timeout.dir/amqp_connect_timeout.c.o
[ 47%] Building C object examples/CMakeFiles/amqp_connect_timeout.dir/utils.c.o
[ 49%] Building C object examples/CMakeFiles/amqp_connect_timeout.dir/unix/platform_utils.c.o
Linking C executable amqp_connect_timeout
[ 49%] Built target amqp_connect_timeout
Scanning dependencies of target amqp_consumer
[ 50%] Building C object examples/CMakeFiles/amqp_consumer.dir/amqp_consumer.c.o
[ 52%] Building C object examples/CMakeFiles/amqp_consumer.dir/utils.c.o
[ 53%] Building C object examples/CMakeFiles/amqp_consumer.dir/unix/platform_utils.c.o
Linking C executable amqp_consumer
[ 53%] Built target amqp_consumer
Scanning dependencies of target amqp_exchange_declare
[ 55%] Building C object examples/CMakeFiles/amqp_exchange_declare.dir/amqp_exchange_declare.c.o
[ 56%] Building C object examples/CMakeFiles/amqp_exchange_declare.dir/utils.c.o
[ 57%] Building C object examples/CMakeFiles/amqp_exchange_declare.dir/unix/platform_utils.c.o
Linking C executable amqp_exchange_declare
[ 57%] Built target amqp_exchange_declare
Scanning dependencies of target amqp_listen
[ 59%] Building C object examples/CMakeFiles/amqp_listen.dir/amqp_listen.c.o
[ 60%] Building C object examples/CMakeFiles/amqp_listen.dir/utils.c.o
[ 62%] Building C object examples/CMakeFiles/amqp_listen.dir/unix/platform_utils.c.o
Linking C executable amqp_listen
[ 62%] Built target amqp_listen
Scanning dependencies of target amqp_listenq
[ 63%] Building C object examples/CMakeFiles/amqp_listenq.dir/amqp_listenq.c.o
[ 65%] Building C object examples/CMakeFiles/amqp_listenq.dir/utils.c.o
[ 66%] Building C object examples/CMakeFiles/amqp_listenq.dir/unix/platform_utils.c.o
Linking C executable amqp_listenq
[ 66%] Built target amqp_listenq
Scanning dependencies of target amqp_producer
[ 68%] Building C object examples/CMakeFiles/amqp_producer.dir/amqp_producer.c.o
[ 69%] Building C object examples/CMakeFiles/amqp_producer.dir/utils.c.o
[ 71%] Building C object examples/CMakeFiles/amqp_producer.dir/unix/platform_utils.c.o
Linking C executable amqp_producer
[ 71%] Built target amqp_producer
Scanning dependencies of target amqp_rpc_sendstring_client
[ 72%] Building C object examples/CMakeFiles/amqp_rpc_sendstring_client.dir/amqp_rpc_sendstring_client.c.o
[ 73%] Building C object examples/CMakeFiles/amqp_rpc_sendstring_client.dir/utils.c.o
[ 75%] Building C object examples/CMakeFiles/amqp_rpc_sendstring_client.dir/unix/platform_utils.c.o
Linking C executable amqp_rpc_sendstring_client
[ 75%] Built target amqp_rpc_sendstring_client
Scanning dependencies of target amqp_sendstring
[ 76%] Building C object examples/CMakeFiles/amqp_sendstring.dir/amqp_sendstring.c.o
[ 78%] Building C object examples/CMakeFiles/amqp_sendstring.dir/utils.c.o
[ 79%] Building C object examples/CMakeFiles/amqp_sendstring.dir/unix/platform_utils.c.o
Linking C executable amqp_sendstring
[ 79%] Built target amqp_sendstring
Scanning dependencies of target amqp_ssl_connect
[ 81%] Building C object examples/CMakeFiles/amqp_ssl_connect.dir/amqp_ssl_connect.c.o
[ 82%] Building C object examples/CMakeFiles/amqp_ssl_connect.dir/utils.c.o
[ 84%] Building C object examples/CMakeFiles/amqp_ssl_connect.dir/unix/platform_utils.c.o
Linking C executable amqp_ssl_connect
[ 84%] Built target amqp_ssl_connect
Scanning dependencies of target amqp_unbind
[ 85%] Building C object examples/CMakeFiles/amqp_unbind.dir/amqp_unbind.c.o
[ 86%] Building C object examples/CMakeFiles/amqp_unbind.dir/utils.c.o
[ 88%] Building C object examples/CMakeFiles/amqp_unbind.dir/unix/platform_utils.c.o
Linking C executable amqp_unbind
[ 88%] Built target amqp_unbind
Scanning dependencies of target test_basic
[ 89%] Building C object tests/CMakeFiles/test_basic.dir/test_basic.c.o
Linking C executable test_basic
[ 89%] Built target test_basic
Scanning dependencies of target test_hostcheck
[ 91%] Building C object tests/CMakeFiles/test_hostcheck.dir/test_hostcheck.c.o
[ 92%] Building C object tests/CMakeFiles/test_hostcheck.dir/__/librabbitmq/amqp_hostcheck.c.o
Linking C executable test_hostcheck
[ 92%] Built target test_hostcheck
Scanning dependencies of target test_merge_capabilities
[ 94%] Building C object tests/CMakeFiles/test_merge_capabilities.dir/test_merge_capabilities.c.o
Linking C executable test_merge_capabilities
[ 94%] Built target test_merge_capabilities
Scanning dependencies of target test_parse_url
[ 95%] Building C object tests/CMakeFiles/test_parse_url.dir/test_parse_url.c.o
Linking C executable test_parse_url
[ 95%] Built target test_parse_url
Scanning dependencies of target test_sasl_mechanism
[ 97%] Building C object tests/CMakeFiles/test_sasl_mechanism.dir/test_sasl_mechanism.c.o
Linking C executable test_sasl_mechanism
[ 97%] Built target test_sasl_mechanism
Scanning dependencies of target test_status_enum
[ 98%] Building C object tests/CMakeFiles/test_status_enum.dir/test_status_enum.c.o
Linking C executable test_status_enum
[ 98%] Built target test_status_enum
Scanning dependencies of target test_tables
[100%] Building C object tests/CMakeFiles/test_tables.dir/test_tables.c.o
Linking C executable test_tables
[100%] Built target test_tables
Install the project...
-- Install configuration: "Release"
-- Installing: /usr/local/rabbitmq-c/lib64/pkgconfig/librabbitmq.pc
-- Installing: /usr/local/rabbitmq-c/lib64/librabbitmq.so.4.4.0
-- Installing: /usr/local/rabbitmq-c/lib64/librabbitmq.so.4
-- Installing: /usr/local/rabbitmq-c/lib64/librabbitmq.so
-- Installing: /usr/local/rabbitmq-c/lib64/librabbitmq.a
-- Installing: /usr/local/rabbitmq-c/include/amqp.h
-- Installing: /usr/local/rabbitmq-c/include/amqp_framing.h
-- Installing: /usr/local/rabbitmq-c/include/amqp_tcp_socket.h
-- Installing: /usr/local/rabbitmq-c/include/amqp_ssl_socket.h

到这里就已经安装完成了。不过这里有一个坑。

软链接

你可以看一下/usr/local/rabbitmq-c下的目录只有include和lib64。因为后面编译安装amqp扩展的时候系统会到/usr/local/rabbitmq-c/lib目录下搜索依赖库,导致错误。所以这里需要加一步

ln -s /usr/local/rabbitmq-c/lib64 /usr/local/rabbitmq-c/lib

安装amqp扩展

下载源代码

最新源代码地址可以从PHP Pecl获取,这里用的是v1.9.4版本(发布本教程时最新版)

wget http://pecl.php.net/get/amqp-1.9.4.tgz

解压源代码并转到源代码目录

tar zxvf amqp-1.9.4.tgz && cd amqp-1.9.4

phpize

phpize 命令是用来准备 PHP 扩展库的编译环境的,主要是根据系统信息生成对应的configure文件。
宝塔支持同时使用多个PHP版本,所以注意这里的路径(/www/server/php/73/bin/phpize),换成你要添加的PHP版本对应的路径。

/www/server/php/73/bin/phpize

配置编译参数

宝塔支持同时使用多个PHP版本,所以注意这里的路径,换成你要添加的PHP版本对应的路径(/www/server/php/73/bin/php-config)。

./configure --with-php-config=/www/server/php/73/bin/php-config --with-amqp --with-librabbitmq-dir=/usr/local/rabbitmq-c

执行结果

checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for a sed that does not truncate output... /usr/bin/sed
checking for cc... cc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether cc accepts -g... yes
checking for cc option to accept ISO C89... none needed
checking how to run the C preprocessor... cc -E
checking for icc... no
checking for suncc... no
checking whether cc understands -c and -o together... yes
checking for system library directory... lib
checking if compiler supports -R... no
checking if compiler supports -Wl,-rpath,... yes
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking target system type... x86_64-pc-linux-gnu
checking for PHP prefix... /www/server/php/73
checking for PHP includes... -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib
checking for PHP extension directory... /www/server/php/73/lib/php/extensions/no-debug-non-zts-20180731
checking for PHP installed headers prefix... /www/server/php/73/include/php
checking if debug is enabled... no
checking if zts is enabled... no
checking for re2c... no
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
checking for gawk... gawk
checking for amqp support... yes, shared
checking for amqp... yes, shared
checking for supported PHP versions... supported (7.3.13)
yes
checking for pkg-config... /usr/bin/pkg-config
checking for amqp files in default path... found in /usr/local/rabbitmq-c
checking for librabbitmq version... 0.10.0
checking for ld used by cc... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking for /usr/bin/ld option to reload object files... -r
checking for BSD-compatible nm... /usr/bin/nm -B
checking whether ln -s works... yes
checking how to recognize dependent libraries... pass_all
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking dlfcn.h usability... yes
checking dlfcn.h presence... yes
checking for dlfcn.h... yes
checking the maximum length of command line arguments... 1572864
checking command to parse /usr/bin/nm -B output from cc object... ok
checking for objdir... .libs
checking for ar... ar
checking for ranlib... ranlib
checking for strip... strip
checking if cc supports -fno-rtti -fno-exceptions... no
checking for cc option to produce PIC... -fPIC
checking if cc PIC flag -fPIC works... yes
checking if cc static flag -static works... no
checking if cc supports -c -o file.o... yes
checking whether the cc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes
checking whether -lc should be explicitly linked in... no
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... no

creating libtool
appending configuration tag "CXX" to libtool
configure: creating ./config.status
config.status: creating config.h

开始编译安装

make && make install

执行结果

/bin/sh /root/amqp-1.9.4/libtool --mode=compile cc  -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include  -DHAVE_CONFIG_H  -g -O2   -c /root/amqp-1.9.4/amqp.c -o amqp.lo
mkdir .libs
 cc -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include -DHAVE_CONFIG_H -g -O2 -c /root/amqp-1.9.4/amqp.c  -fPIC -DPIC -o .libs/amqp.o
/bin/sh /root/amqp-1.9.4/libtool --mode=compile cc  -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include  -DHAVE_CONFIG_H  -g -O2   -c /root/amqp-1.9.4/amqp_type.c -o amqp_type.lo
 cc -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include -DHAVE_CONFIG_H -g -O2 -c /root/amqp-1.9.4/amqp_type.c  -fPIC -DPIC -o .libs/amqp_type.o
/bin/sh /root/amqp-1.9.4/libtool --mode=compile cc  -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include  -DHAVE_CONFIG_H  -g -O2   -c /root/amqp-1.9.4/amqp_exchange.c -o amqp_exchange.lo
 cc -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include -DHAVE_CONFIG_H -g -O2 -c /root/amqp-1.9.4/amqp_exchange.c  -fPIC -DPIC -o .libs/amqp_exchange.o
/bin/sh /root/amqp-1.9.4/libtool --mode=compile cc  -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include  -DHAVE_CONFIG_H  -g -O2   -c /root/amqp-1.9.4/amqp_queue.c -o amqp_queue.lo
 cc -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include -DHAVE_CONFIG_H -g -O2 -c /root/amqp-1.9.4/amqp_queue.c  -fPIC -DPIC -o .libs/amqp_queue.o
/bin/sh /root/amqp-1.9.4/libtool --mode=compile cc  -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include  -DHAVE_CONFIG_H  -g -O2   -c /root/amqp-1.9.4/amqp_connection.c -o amqp_connection.lo
 cc -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include -DHAVE_CONFIG_H -g -O2 -c /root/amqp-1.9.4/amqp_connection.c  -fPIC -DPIC -o .libs/amqp_connection.o
/bin/sh /root/amqp-1.9.4/libtool --mode=compile cc  -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include  -DHAVE_CONFIG_H  -g -O2   -c /root/amqp-1.9.4/amqp_connection_resource.c -o amqp_connection_resource.lo
 cc -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include -DHAVE_CONFIG_H -g -O2 -c /root/amqp-1.9.4/amqp_connection_resource.c  -fPIC -DPIC -o .libs/amqp_connection_resource.o
/bin/sh /root/amqp-1.9.4/libtool --mode=compile cc  -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include  -DHAVE_CONFIG_H  -g -O2   -c /root/amqp-1.9.4/amqp_channel.c -o amqp_channel.lo
 cc -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include -DHAVE_CONFIG_H -g -O2 -c /root/amqp-1.9.4/amqp_channel.c  -fPIC -DPIC -o .libs/amqp_channel.o
/bin/sh /root/amqp-1.9.4/libtool --mode=compile cc  -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include  -DHAVE_CONFIG_H  -g -O2   -c /root/amqp-1.9.4/amqp_envelope.c -o amqp_envelope.lo
 cc -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include -DHAVE_CONFIG_H -g -O2 -c /root/amqp-1.9.4/amqp_envelope.c  -fPIC -DPIC -o .libs/amqp_envelope.o
/bin/sh /root/amqp-1.9.4/libtool --mode=compile cc  -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include  -DHAVE_CONFIG_H  -g -O2   -c /root/amqp-1.9.4/amqp_basic_properties.c -o amqp_basic_properties.lo
 cc -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include -DHAVE_CONFIG_H -g -O2 -c /root/amqp-1.9.4/amqp_basic_properties.c  -fPIC -DPIC -o .libs/amqp_basic_properties.o
/bin/sh /root/amqp-1.9.4/libtool --mode=compile cc  -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include  -DHAVE_CONFIG_H  -g -O2   -c /root/amqp-1.9.4/amqp_methods_handling.c -o amqp_methods_handling.lo
 cc -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include -DHAVE_CONFIG_H -g -O2 -c /root/amqp-1.9.4/amqp_methods_handling.c  -fPIC -DPIC -o .libs/amqp_methods_handling.o
/bin/sh /root/amqp-1.9.4/libtool --mode=compile cc  -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include  -DHAVE_CONFIG_H  -g -O2   -c /root/amqp-1.9.4/amqp_timestamp.c -o amqp_timestamp.lo
 cc -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include -DHAVE_CONFIG_H -g -O2 -c /root/amqp-1.9.4/amqp_timestamp.c  -fPIC -DPIC -o .libs/amqp_timestamp.o
/bin/sh /root/amqp-1.9.4/libtool --mode=compile cc  -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include  -DHAVE_CONFIG_H  -g -O2   -c /root/amqp-1.9.4/amqp_decimal.c -o amqp_decimal.lo
 cc -I. -I/root/amqp-1.9.4 -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include -DHAVE_CONFIG_H -g -O2 -c /root/amqp-1.9.4/amqp_decimal.c  -fPIC -DPIC -o .libs/amqp_decimal.o
/bin/sh /root/amqp-1.9.4/libtool --mode=link cc -DPHP_ATOM_INC -I/root/amqp-1.9.4/include -I/root/amqp-1.9.4/main -I/root/amqp-1.9.4 -I/www/server/php/73/include/php -I/www/server/php/73/include/php/main -I/www/server/php/73/include/php/TSRM -I/www/server/php/73/include/php/Zend -I/www/server/php/73/include/php/ext -I/www/server/php/73/include/php/ext/date/lib -I/usr/local/rabbitmq-c/include  -DHAVE_CONFIG_H  -g -O2    -o amqp.la -export-dynamic -avoid-version -prefer-pic -module -rpath /root/amqp-1.9.4/modules  amqp.lo amqp_type.lo amqp_exchange.lo amqp_queue.lo amqp_connection.lo amqp_connection_resource.lo amqp_channel.lo amqp_envelope.lo amqp_basic_properties.lo amqp_methods_handling.lo amqp_timestamp.lo amqp_decimal.lo -Wl,-rpath,/usr/local/rabbitmq-c/lib -L/usr/local/rabbitmq-c/lib -lrabbitmq
cc -shared  .libs/amqp.o .libs/amqp_type.o .libs/amqp_exchange.o .libs/amqp_queue.o .libs/amqp_connection.o .libs/amqp_connection_resource.o .libs/amqp_channel.o .libs/amqp_envelope.o .libs/amqp_basic_properties.o .libs/amqp_methods_handling.o .libs/amqp_timestamp.o .libs/amqp_decimal.o  -L/usr/local/rabbitmq-c/lib -lrabbitmq  -Wl,-rpath -Wl,/usr/local/rabbitmq-c/lib -Wl,-soname -Wl,amqp.so -o .libs/amqp.so
creating amqp.la
(cd .libs && rm -f amqp.la && ln -s ../amqp.la amqp.la)
/bin/sh /root/amqp-1.9.4/libtool --mode=install cp ./amqp.la /root/amqp-1.9.4/modules
cp ./.libs/amqp.so /root/amqp-1.9.4/modules/amqp.so
cp ./.libs/amqp.lai /root/amqp-1.9.4/modules/amqp.la
PATH="$PATH:/sbin" ldconfig -n /root/amqp-1.9.4/modules
----------------------------------------------------------------------
Libraries have been installed in:
   /root/amqp-1.9.4/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

Build complete.
Don't forget to run 'make test'.

Installing shared extensions:     /www/server/php/73/lib/php/extensions/no-debug-non-zts-20180731/

启用扩展

配置php.ini

大概在配置文件九百多行的位置新建一行,加入以下代码

extension=/www/server/php/73/lib/php/extensions/no-debug-non-zts-20180731/amqp.so

重启php

重启php-fpm或重载配置

查看phpinfo()

查看phpinfo(),搜索amqp.host,如果找到基本就是安装成功。

以下是参考官方文档安装ODBC驱动的过程,跟官方教程是一毛一样,只是加上了每行命令的说明。

添加安装源到本机

curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo

卸载部分包,避免冲突

yum remove unixODBC-utf16 unixODBC-utf16-devel

安装msodbcsql17

ACCEPT_EULA=Y yum install msodbcsql17

安装mssql-tools

ACCEPT_EULA=Y yum install mssql-tools

写入环境变量

echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile

写入环境变量

echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc

让刚刚写入的环境变量生效

source ~/.bashrc

安装unixODBC-devel

yum install unixODBC-devel

最后,查看/etc/odbcinst.ini文件内容

cat /etc/odbcinst.ini

可以看到最后面有[ODBC Driver 17 for SQL Server]的配置,恭喜你,驱动安装完成

[PostgreSQL]
Description=ODBC for PostgreSQL
Driver=/usr/lib/psqlodbcw.so
Setup=/usr/lib/libodbcpsqlS.so
Driver64=/usr/lib64/psqlodbcw.so
Setup64=/usr/lib64/libodbcpsqlS.so
FileUsage=1

[MySQL]
Description=ODBC for MySQL
Driver=/usr/lib/libmyodbc5.so
Setup=/usr/lib/libodbcmyS.so
Driver64=/usr/lib64/libmyodbc5.so
Setup64=/usr/lib64/libodbcmyS.so
FileUsage=1

[ODBC Driver 17 for SQL Server]
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.4.so.1.1
UsageCount=1

最后,在PHP里测试下是否能正常连接,如果输出Connected就是成功了
注意更换成自己对应的信息:127.0.0.1数据库地址、1433数据库端口、jwj数据库名、sa数据库用户名、password数据库密码

<?php
try {
    $conn = new PDO('odbc:Driver={ODBC Driver 17 for SQL Server};Server=127.0.0.1,1433;Database=jwj;', 'sa', 'password');
} catch (PDOException $e) {
    exit('Error:' . $e->getMessage());
}
exit('Connected');

因业务需要,需要连接其它系统所使用的Microsoft SQL Server数据库,然后要使用PDO ODBC才能连接,但现在所使用的PHP环境没有装这个扩展,经过一系列踩坑,整理出了下面的教程。

安装unixODBC

unixODBC是一个数据库连接组件,安装pdo_odbc前需要安装这个,否则安装pdo_odbc时会出现Cannot find header file(s) for pdo_odbc错误

yum install unixODBC unixODBC-devel libtool-ltdl libtool-ltdl-devel

转到pdo_odbc源代码目录

从PHP5.1开始,PDO_ODBC包含在PHP源代码中。可以使用configure命令将PDO_ODBC扩展编译为静态或共享模块。
所以我们只需要转到pdo_odbc源代码目录进行编译,而不用再去另外下载了。

cd /www/server/php/56/src/ext/pdo_odbc

make clean

如果你在尝试这篇教程直接,尝试过其它网上的方法,先执行下以下命令清除缓存,否则加载扩展时可能会出现PHP Warning: PHP Startup: Invalid library (maybe not a PHP library) '/www/server/php/56/lib/php/extensions/no-debug-non-zts-20131226/pdo_odbc.so' in Unknown on line 0

make clean

phpize

phpize 命令是用来准备 PHP 扩展库的编译环境的,主要是根据系统信息生成对应的configure文件。

/www/server/php/56/bin/phpize

configure

./configure --with-php-config=/www/server/php/56/bin/php-config  --with-pdo-odbc=unixODBC,/usr/

执行结果

checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for a sed that does not truncate output... /usr/bin/sed
checking for cc... cc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether cc accepts -g... yes
checking for cc option to accept ISO C89... none needed
checking how to run the C preprocessor... cc -E
checking for icc... no
checking for suncc... no
checking whether cc understands -c and -o together... yes
checking for system library directory... lib
checking if compiler supports -R... no
checking if compiler supports -Wl,-rpath,... yes
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking target system type... x86_64-unknown-linux-gnu
checking for PHP prefix... /www/server/php/56
checking for PHP includes... -I/www/server/php/56/include/php -I/www/server/php/56/include/php/main -I/www/server/php/56/include/php/TSRM -I/www/server/php/56/include/php/Zend -I/www/server/php/56/include/php/ext -I/www/server/php/56/include/php/ext/date/lib
checking for PHP extension directory... /www/server/php/56/lib/php/extensions/no-debug-non-zts-20131226
checking for PHP installed headers prefix... /www/server/php/56/include/php
checking if debug is enabled... no
checking if zts is enabled... no
checking for re2c... no
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
checking for gawk... gawk
checking for ODBC v3 support for PDO... yes, shared
checking for PDO includes... checking for PDO includes... /www/server/php/56/include/php/ext
checking for selected PDO ODBC flavour... unixODBC
          libs       /usr//lib,
          headers    /usr//include
checking for odbc.h in /usr//include... no
checking for odbcsdk.h in /usr//include... no
checking for iodbc.h in /usr//include... no
checking for sqlunix.h in /usr//include... no
checking for sqltypes.h in /usr//include... yes
checking for sqlucode.h in /usr//include... yes
checking for sql.h in /usr//include... yes
checking for isql.h in /usr//include... no
checking for sqlext.h in /usr//include... yes
checking for isqlext.h in /usr//include... no
checking for udbcext.h in /usr//include... no
checking for sqlcli1.h in /usr//include... no
checking for LibraryManager.h in /usr//include... no
checking for cli0core.h in /usr//include... no
checking for cli0ext.h in /usr//include... no
checking for cli0cli.h in /usr//include... no
checking for cli0defs.h in /usr//include... no
checking for cli0env.h in /usr//include... no
checking for SQLBindCol in -lodbc... yes
checking for SQLAllocHandle in -lodbc... yes
checking for ld used by cc... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking for /usr/bin/ld option to reload object files... -r
checking for BSD-compatible nm... /usr/bin/nm -B
checking whether ln -s works... yes
checking how to recognize dependent libraries... pass_all
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking dlfcn.h usability... yes
checking dlfcn.h presence... yes
checking for dlfcn.h... yes
checking the maximum length of command line arguments... 1572864
checking command to parse /usr/bin/nm -B output from cc object... ok
checking for objdir... .libs
checking for ar... ar
checking for ranlib... ranlib
checking for strip... strip
checking if cc supports -fno-rtti -fno-exceptions... no
checking for cc option to produce PIC... -fPIC
checking if cc PIC flag -fPIC works... yes
checking if cc static flag -static works... no
checking if cc supports -c -o file.o... yes
checking whether the cc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes
checking whether -lc should be explicitly linked in... no
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... no

creating libtool
appending configuration tag "CXX" to libtool
configure: creating ./config.status
config.status: creating config.h

make

make && make install

执行结果

/bin/sh /www/server/php/56/src/ext/pdo_odbc/libtool --mode=link cc -DPHP_ATOM_INC -I/www/server/php/56/src/ext/pdo_odbc/include -I/www/server/php/56/src/ext/pdo_odbc/main -I/www/server/php/56/src/ext/pdo_odbc -I/www/server/php/56/include/php -I/www/server/php/56/include/php/main -I/www/server/php/56/include/php/TSRM -I/www/server/php/56/include/php/Zend -I/www/server/php/56/include/php/ext -I/www/server/php/56/include/php/ext/date/lib  -DHAVE_CONFIG_H  -g -O2   -o pdo_odbc.la -export-dynamic -avoid-version -prefer-pic -module -rpath /www/server/php/56/src/ext/pdo_odbc/modules  pdo_odbc.lo odbc_driver.lo odbc_stmt.lo -Wl,-rpath,/usr//lib -L/usr//lib -lodbc
cc -shared  .libs/pdo_odbc.o .libs/odbc_driver.o .libs/odbc_stmt.o  -L/usr//lib -lodbc  -Wl,-rpath -Wl,/usr//lib -Wl,-soname -Wl,pdo_odbc.so -o .libs/pdo_odbc.so
creating pdo_odbc.la
(cd .libs && rm -f pdo_odbc.la && ln -s ../pdo_odbc.la pdo_odbc.la)
/bin/sh /www/server/php/56/src/ext/pdo_odbc/libtool --mode=install cp ./pdo_odbc.la /www/server/php/56/src/ext/pdo_odbc/modules
cp ./.libs/pdo_odbc.so /www/server/php/56/src/ext/pdo_odbc/modules/pdo_odbc.so
cp ./.libs/pdo_odbc.lai /www/server/php/56/src/ext/pdo_odbc/modules/pdo_odbc.la
PATH="$PATH:/sbin" ldconfig -n /www/server/php/56/src/ext/pdo_odbc/modules
----------------------------------------------------------------------
Libraries have been installed in:
   /www/server/php/56/src/ext/pdo_odbc/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

Build complete.
Don't forget to run 'make test'.

Installing shared extensions:     /www/server/php/56/lib/php/extensions/no-debug-non-zts-20131226/

查看so文件是否生成

ls -lh /www/server/php/56/lib/php/extensions/no-debug-non-zts-20131226/
total 2.1M
-rwxr-xr-x 1 root root 1.3M Sep  3 15:13 opcache.a
-rwxr-xr-x 1 root root 610K Sep  3 15:13 opcache.so
-rwxr-xr-x 1 root root 126K Sep  3 15:13 pdo_odbc.so

配置php.ini

大概在配置文件九百多行的位置新建一行,加入以下代码

extension=/www/server/php/56/lib/php/extensions/no-debug-non-zts-20131226/pdo_odbc.so

重启php和httpd环境

重启php-fpm和nginx等

查看phpinfo()

查看phpinfo(),搜索PDO_ODBC,如果找到基本就是安装成功。

安装了扩展,还要在服务器安装数据库连接驱动才能连接SQL Server数据库,可以看我的下一篇文章。