php调用sql server过程记录

  1. 更新微软源,需要安装微软的底层库
curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssqlrelease.repo
  1. 安装依赖底层库
yum install -y msodbcsql mssql-tools unixODBC-devel
  1. 根据php版本选择对应的pdo_sqlsrv扩展版本,查询地址为http://pecl.php.net/package/pdo_sqlsrv 对于7.4版本可以用5.10.1的版本
  2. 下载对应版本的pdo_sqlsrv
wget http://pecl.php.net/package/pdo_sqlsrv wget http://pecl.php.net/get/pdo_sqlsrv-5.10.1.tgz
  1. 编译安装,代码语句一行一行执行
tar -zxvf pdo_sqlsrv-5.10.1.tgz 
cd pdo_sqlsrv-5.10.1
/www/server/php/74/bin/phpize
./configure --with-php-config=/www/server/php/74/bin/php-config
make && make install
echo "extension = pdo_sqlsrv.so" >> /www/server/php/74/etc/php.ini
echo "extension = pdo_sqlsrv.so" >> /www/server/php/74/etc/php-cli.ini
/etc/init.d/php-fpm-74 reload

需要把相关路径替换为自己的实际路径
6. 检查是否安装成功

/www/server/php/74/bin/php -m|grep -i sqlsrv
  1. 连接数据库并测试
<?php
$host = "155.254.244.31";
$dbname = "AionWorld_110";
$user = "urygdc17463_SQLLogin_1_d6octrr7tr";
$pass = "urygdc17463_SQLLogin_1_d6octrr7tr";

try {
    // 创建数据库连接
    $dbh = new PDO("sqlsrv:Server=$host;Database=$dbname", $user, $pass);

    // 创建表格
    $createTableQuery = "CREATE TABLE MyTable (
        id INT PRIMARY KEY,
        name VARCHAR(100)
    )";
    $dbh->exec($createTableQuery);
    echo "表格创建成功!\n";

    // 插入数据
    $insertDataQuery = "INSERT INTO MyTable (id, name) VALUES (1, 'John'), (2, 'Jane'), (3, 'Mike')";
    $dbh->exec($insertDataQuery);
    echo "数据插入成功!\n";

    // 读取数据
    $selectDataQuery = "SELECT * FROM MyTable";
    $stmt = $dbh->query($selectDataQuery);
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    foreach ($result as $row) {
        echo "ID: " . $row['id'] . ", Name: " . $row['name'] . "\n";
    }

    // 关闭数据库连接
    $dbh = null;
} catch (PDOException $e) {
    echo "连接数据库失败: " . $e->getMessage();
}
?>
  1. 不出意外的话,遇到了意外,执行代码后抛出segmentfault,
    换装其他版本php同样问题,凭感觉,应该是ssl出问题了。
    1、 更换了3个php版本,都会报错,可以判断是系统问题,和php版本无关
    2、 挂gdb测试最简单的连接代码,打印堆栈,搜索答案无果
    3、 经过仔细观察发现openssl存在不同版本混合调用问题,根据文件创建日期判断同一天的新建文件,判断出pm2和node.js有问题,卸载后openssl指定版本确实也被卸载了,问题解决

挂上gdb调试后打印部分堆栈如下:

#0  0x00007ffff2786ec6 in __strcmp_sse42 () from /lib64/libc.so.6
#1  0x00007ffff645dc65 in lh_insert () from /usr/local/openssl/lib/libcrypto.so.1.0.0
#2  0x00007ffff63ac37f in OBJ_NAME_add () from /usr/local/openssl/lib/libcrypto.so.1.0.0
#3  0x00007fffe8449c18 in ossl_init_ssl_base_ossl_ () from /lib64/libssl.so.1.1
#4  0x00007ffff222f20b in __pthread_once_slow () from /lib64/libpthread.so.0
#5  0x00007fffe811cd29 in CRYPTO_THREAD_run_once () from /lib64/libcrypto.so.1.1
#6  0x00007fffe8449e63 in OPENSSL_init_ssl () from /lib64/libssl.so.1.1

image

posted @ 2024-02-12 22:37  张扬86  阅读(14)  评论(0编辑  收藏  举报
baidu