在 CentOS 7 宝塔面板软件环境中安装unixODBC和FreeTDS - 使用php的 odbc_connect 函数 连接 SQL Server 2000

需求:在CentOS7 的宝塔面板软件环境中,已经安装有 nginx + php7.3。需要通过如 $connect = odbc_connect("DRIVER=FreeTDS; Server=192.168.97.65; Port=1433; TDS_Version=7.1; Database=master", 'sa', 'aqtest'); 的php文件连接到 SQL Server 2000

尝试:

  1. 下载 unixODBC-2.3.9 源码文件。再配置、编译和安装。如本例,是将unixODBC安装到/usr/local/unixODBC的路径,所以在配置时,是 ./configure --prefix=/usr/local/unixODBC
  2. 下载 freetds-1.3.4 源码文件。再配置、编译和安装。如本例,是将FreeTDS安装到/usr/local/freetds的路径,在配置时,除了要加上自定义的安装路径,还要加上unixODBC的参数,如 ./configure --with-tdsver=7.4 --prefix=/usr/local/freetds --enable-msdblib --with-unixodbc=/usr/local/unixODBC
  3. 如果宝塔环境中,安装的php版本是7.3.33的,请下载 php-7.3.33 源码文件。解压后,在原宝塔的php配置参数基础上加 '--with-unixODBC=/usr/local/unixODBC' ,如本例,再编译和安装

    [root@localhost php-7.3.31]# './configure'  '--prefix=/www/server/php/73' '--with-config-file-path=/www/server/php/73/etc' '--enable-fpm' '--with-fpm-user=www' '--with-fpm-group=www' '--enable-mysqlnd' '--with-mysqli=mysqlnd' '--with-pdo-mysql=mysqlnd' '--with-iconv-dir' '--with-freetype-dir=/usr/local/freetype' '--with-jpeg-dir' '--with-png-dir' '--with-zlib' '--with-libxml-dir=/usr' '--enable-xml' '--disable-rpath' '--enable-bcmath' '--enable-shmop' '--enable-sysvsem' '--enable-inline-optimization' '--with-curl=/usr/local/curl' '--enable-mbregex' '--enable-mbstring' '--enable-intl' '--enable-ftp' '--with-gd' '--with-openssl=/usr/local/openssl' '--with-mhash' '--enable-pcntl' '--enable-sockets' '--with-xmlrpc' '--enable-soap' '--with-gettext' '--disable-fileinfo' '--enable-opcache' '--with-sodium' '--with-webp' '--with-unixODBC=/usr/local/unixODBC'
  4. 如果顺利,那么新版本的文件会覆盖原宝塔安装的php文件
  5. 新版本的phpinfo信息输出中,应该有unixODBC的信息详情,如:

    ODBC Support => enabled
    ODBC library => unixODBC
    ODBCVER => 0x0380
    ODBC_INCLUDE => -I/usr/local/unixODBC/include
    ODBC_LFLAGS => -L/usr/local/unixODBC/lib
    ODBC_LIBS => -lodbc
  6. php命令行可返回结果,如

    #php -r "var_dump(odbc_connect('DRIVER={freetds};SERVER=192.168.97.115;PORT=1433;DATABASE=master','sa','aqtest'));"
    resource(4) of type (odbc link)
  7. 在web里测试,php使用 odbc_connect 函数 也正常,如:

    [root@localhost local.anqun.org]# curl http://192.168.97.65/5.php
    master 1
    tempdb 2
    model 3
    msdb 4
  8. 测试文件5.php的内容如下(SQLServer 2008 Express):

    <?php
    
    # connect to 192.168.97.115 with a user "sa" and password "aqtest"
    $connect = odbc_connect("DRIVER=freetds;SERVER=192.168.97.115;PORT=1433 DATABASE=master",'sa','aqtest');
    
    # query the users table for all fields
    $query = "select * from sysdatabases";
    
    # perform the query
    $result = odbc_exec($connect, $query);
    
    # fetch the data from the database
    while(odbc_fetch_row($result)) {
    $field1 = odbc_result($result, 1);
    $field2 = odbc_result($result, 2);
    print("$field1 $field2\n");
    }
    
    # close the connection
    odbc_close($connect);
    
    ?>

dn_bt-php-unixodbc-freetds-sqlserver-1.png

参考:

从 magento 1.x 升级到 magento 2.x - Data Migration Tool

需求:从现有的 magento 1.9.3.6 升级到当前的 magento 2.4.3-p1 。仅要商品、客户和订单数据,模块和模板可不要。

尝试:使用 magento 官方提供的 Data Migration Tool 来迁移数据。大概是先安装新版本的magento2,然后安装Data Migration Tool,再按照操作说明来迁移数据。大概可满足需求。

参考:

magento2 - 提交订单最后一步时出错 - Report ID: webapi - 可能是宝塔站点的“防跨站攻击(open_basedir)”问题

现象:magento2站点,测试时发现提交订单最后一步时报错,如:Details are available in Magento log file. Report ID: webapi-61c539eec7d0c 详细的日志如:

[2021-12-24 03:11:39] main.CRITICAL: Report ID: webapi-61c53a6b7b804; Message: Validate class not found from basename 'Magento\Framework\Validator\EmailAddress' {"exception":"[object] (Exception(code: 0): Report ID: webapi-61c53a6b7b804; Message: Validate class not found from basename 'Magento\Framework\Validator\EmailAddress' at /www/wwwroot/web1/vendor/magento/framework/Webapi/ErrorProcessor.php:208, Zend_Validate_Exception(code: 0): Validate class not found from basename 'Magento\Framework\Validator\EmailAddress' at /www/wwwroot/web1/vendor/magento/zendframework1/library/Zend/Validate.php:244)"} []
[2021-12-24 03:11:42] main.CRITICAL: Report ID: webapi-61c53a6eb6cea; Message: Validate class not found from basename 'Magento\Framework\Validator\EmailAddress' {"exception":"[object] (Exception(code: 0): Report ID: webapi-61c53a6eb6cea; Message: Validate class not found from basename 'Magento\Framework\Validator\EmailAddress' at /www/wwwroot/web1/vendor/magento/framework/Webapi/ErrorProcessor.php:208, Zend_Validate_Exception(code: 0): Validate class not found from basename 'Magento\Framework\Validator\EmailAddress' at /www/wwwroot/web1/vendor/magento/zendframework1/library/Zend/Validate.php:244)"} []
[2021-12-24 03:11:43] main.ERROR: Braintree\Configuration::merchantId needs to be set (or accessToken needs to be passed to Braintree\Gateway). [] []

尝试:在宝塔面板的站点管理,网站目录的属性中,不勾选 “防跨站攻击(open_basedir)” 的功能。

dn_magento2-bt-open_basedir.png

参考:https://github.com/magento/magento2/issues/12255

当 mysql 服务因内存不足被系统强制退出后,自动再启动

问题:有个VPS,站点在某些时间段可能被爬虫频繁访问导致mysql服务自动退出,隔天就要人工启动mysql服务,恢复站点可访问状态。

尝试:可以写个定时执行的任务,检测mysql服务是否运行,如没有运行,就启动之。

如脚本 /root/mysqlmon.sh 的内容:

#!/bin/bash

# Check if MySQL is running
/sbin/service mysqld status > /dev/null 2>&1

# Restart the MySQL service if it's not running.
if [ $? != 0 ]; then
    echo -e "MySQL Service was down. Restarting now...\n"
    /sbin/service mysqld restart
else
    echo -e "MySQL Service is running already. Nothing to do here.\n"
fi

定时任务内容(每隔15分钟检查服务状态):
*/15 * * * * /root/mysqlmon.sh > /dev/null 2>&1

在centos7中,可查看 /var/log/cron 日志内容,查看任务执行的历史记录。

参考:https://devanswers.co/how-to-auto-restart-a-crashed-mysql-service-with-cron/

在 drservers 的 Debian 11 机子上用 proxmox 创建 IPv6 的 LCX 小机

关键是在 Proxmox 上配置好网络,如以下是 Bridge 的 /etc/network/interfaces 文件配置内容:

source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback

iface eno1 inet manual

iface eno2 inet manual

auto vmbr0
iface vmbr0 inet static
        address 144.172.126.2/24
        gateway 144.172.126.1
        bridge-ports eno1
        bridge-stp off
        bridge-fd 0

也可以通过 proxmox 的 web 配置界面来设置,如:

drs_proxmox_debian11-bridge.png

参考:https://pve.proxmox.com/wiki/Network_Configuration