【问题标题】:Linux - PHP 7.0 and MSSQL (Microsoft SQL)Linux - PHP 7.0 和 MSSQL (Microsoft SQL)
【发布时间】:2016-03-26 10:40:32
【问题描述】:

是的,我知道 PHP 7.0 删除了连接到 MSSQL 所需的扩展。在 PHP 7.0 之前,FreeTDS 是我的选择,但现在对于仍然需要连接到 MSSQL 的用户来说,确实没有明显的升级途径。

愚蠢的问题,但鉴于 MSSQL 肯定在企业环境中得到很好的使用,我们应该如何连接到从 PHP 7.0 开始的那些数据库?

我是否忽略了一些显而易见的事情,还是 PHP 7 的发布基本上给了任何需要连接到 MSSQL 的人一记耳光?

为了清楚起见,我不是谈论从运行 PHP 的 Windows 服务器连接,我需要从 Linux 服务器连接到 MSSQL,因此需要 Linux ODBC 驱动程序。

有没有人可以免费或付费使用 MSSQL 2012 和 PHP 7.0?

我很奇怪,那里没有太多 PHP 7 和 MSSQL 信息。诚然 PHP 7 刚刚发布,但必须有更多的 MSSQL 商店(FWIW 我们两者都使用)。

【问题讨论】:

  • mssql 以及许多其他旧的、不受支持的扩展被开发人员投票排除在核心之外。我怀疑他们很快就会回来。最新版本的 FreeTDS 默认包含必要的驱动程序(UNIXODBC 选项)。以前您需要手动编译它。

标签: php sql-server linux odbc php-7


【解决方案1】:

我绝对同意你的看法。我在工作中主要使用 SQL Server,但不明白为什么它们没有在 PHP 中包含 SQL Server 的默认驱动程序。

对于 linux,我不太确定您之前使用的是什么,但我发现“dblib”驱动程序是连接 SQL Server 的最佳驱动程序。

但基本上对于 linux 机器,您只需运行这几个步骤即可安装 sql server 驱动程序。

apt-get install freetds-dev -y
vim /etc/freetds.conf

然后继续在那里添加您的连接并重新启动 apache,您应该一切顺利!

【讨论】:

  • 那么 FreeTDS 仍然适用于 PHP 7.0 吗?让它工作有什么秘诀吗,因为我已经尝试过了,但也许我在某个地方打了个嗝。
  • 我不太确定它是否适用于 PHP 7,因为我还没有更新。但我很肯定它会起作用,正如你自己所说,SQL Server 在商业环境中是非常受欢迎的。你能运行 php -i 吗? grep -i pdo 在您的 linux 框中并粘贴输出。
  • 给你@Jordan /etc/php5/cli/conf.d/10-pdo.ini, /etc/php5/cli/conf.d/20-pdo_dblib.ini, /etc/php5/cli/conf.d/20-pdo_mysql.ini, /etc/php5/cli/conf.d/20-pdo_odbc.ini, PDO PDO support => enabled PDO drivers => dblib, mysql, odbc pdo_dblib PDO Driver for FreeTDS/Sybase DB-lib => enabled pdo_mysql PDO Driver for MySQL => enabled pdo_mysql.default_socket => /var/run/mysqld/mysqld.sock => /var/run/mysqld/mysqld.sock PDO_ODBC PDO Driver for ODBC (unixODBC) => enabled
  • 是的,您可以使用 DBLIB 驱动程序和 pdo_dblib 访问 sql 服务器,就像这样。 $dbo = new PDO('dblib:host=IP;dbname=DB', 'user', 'pass');
【解决方案2】:

官方 MS 扩展有 PHP 7 的分支:

还有很多东西缺失,一些标记为计划中的(其中包括 Linux 支持),但它可能是未来的另一种解决方案。

编辑 (09-09-2016): 自 3 月以来发布的 Linux 版本已经很少,提供 CentOS/Ubuntu 特定的软件包和源代码。请记住,它们尚未标记为生产就绪。

【讨论】:

【解决方案3】:

PHP7 的sybase 包含pdo_dblib 模块。

sudo apt install php7.0-sybase

【讨论】:

  • 非常感谢,一切都在 cli 中 100% 正常工作,只是不是从 php 安装的,而且 php 能够正常连接。
  • 谢谢! sudo apt install php7.1-sybase 为我完成了这项工作。
【解决方案4】:

我修改了

yum install freetds-dev
vim /etc/freetds.conf

并修改freetds.conf,安装php mssql模块

yum install php-mssql.x86_64

【讨论】:

    【解决方案5】:

    Microsoft 在 PECL 上为 SQL Server 提供 PHP 7 及更高版本的 PHP Linux 驱动程序。这些已准备好生产。要下载它们,请按以下步骤操作:

    Ubuntu 16.04:

    sudo su 
    curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
    curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
    exit
    sudo apt-get update
    sudo ACCEPT_EULA=Y apt-get install -y msodbcsql mssql-tools unixodbc-dev
    sudo pecl install sqlsrv
    sudo pecl install pdo_sqlsrv
    echo "extension=sqlsrv" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`
    echo "extension=pdo_sqlsrv" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`
    

    CentOS 7:

    sudo su
    curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo
    exit
    sudo yum update
    sudo ACCEPT_EULA=Y yum install -y msodbcsql mssql-tools unixODBC-devel 
    sudo yum groupinstall "Development Tools"
    sudo pecl install sqlsrv
    sudo pecl install pdo_sqlsrv
    echo "extension=sqlsrv" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`
    echo "extension=pdo_sqlsrv" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`
    

    这将安装 PHP SQL Server 驱动程序并将它们注册到 php.ini 文件夹中。

    使用以下示例验证它是否有效

    <?php
    $serverName = "localhost";
    $connectionOptions = array(
        "Database" => "SampleDB",
        "Uid" => "sa",
        "PWD" => "your_password"
    );
    //Establishes the connection
    $conn = sqlsrv_connect($serverName, $connectionOptions);
    if($conn)
        echo "Connected!"
    ?>
    

    参考链接:

    【讨论】:

    • 脚本的最后两行有问题。我收到以下错误:PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/20160303/sqlsrv' - /usr/lib/php/20160303/sqlsrv: cannot open shared object file: No such file or directory in Unknown on line 0 PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/20160303/pdo_sqlsrv' - /usr/lib/php/20160303/pdo_sqlsrv: cannot open shared object file: No such file or directory in Unknown on line 0 我正在使用 php7.1,所以我不确定这是否会改变很多。
    • 不应该。 pecl 是否为您安装了 sqlsrv 工作文件?您的 sqlsrv.so 文件很可能存储在不同的位置。很高兴知道您的扩展目录在哪里:pecl config-show
    • 这对我有用。我正在使用 laravel5.4 并已成功连接 MSSQL 远程数据库。非常感谢。
    • 如果您收到错误“无法加载动态库 '/usr/lib/php/20160303/pdo_sqlsrv'”,您可能在 /usr/lib//usr/lib/php 中有多个 php 目录这可能在升级到更新版本的 php 期间发生。否则,请检查您的文件权限。希望这会有所帮助。
    • 我发现在安装 PECL 模块(Ubuntu 16.04,全新安装)之前还需要两个额外的命令:sudo apt-get install php-pearsudo apt-get install php7.0-dev(除了在 php 中的扩展文件名中添加 .so .ini)
    【解决方案6】:

    根据上面的答案 - 这些步骤输出一个共享对象 (*.so),因此 php.ini 文件也需要文件扩展名。

    echo "extension=sqlsrv.so" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`
    echo "extension=pdo_sqlsrv.so" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`
    

    【讨论】:

    • 如果我收到-bash: `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`: Permission denied 怎么办?
    【解决方案7】:

    Debian 人的简短转储:

    # Install MSSQL Client for PHP7 on Debian 9
    apt update && apt install curl apt-transport-https
    curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
    curl https://packages.microsoft.com/config/debian/9/prod.list > /etc/apt/sources.list.d/mssql-release.list
    apt update
    ACCEPT_EULA=Y apt install msodbcsql17 mssql-tools unixodbc-dev php-pear php7.0-dev
    pecl install sqlsrv
    pecl install pdo_sqlsrv
    # if previous pecl cmds fails to download files at it's own - try the following ones:
    #wget http://pecl.php.net/get/sqlsrv-5.2.0.tgz
    #wget http://pecl.php.net/get/pdo_sqlsrv-5.2.0.tgz
    #pecl install sqlsrv-5.2.0.tgz
    #pecl install pdo_sqlsrv-5.2.0.tgz
    
    cat <<EOF > /etc/php/7.0/cli/conf.d/99-sqlsrv.ini  
    extension=sqlsrv.so
    extension=pdo_sqlsrv.so
    EOF
    cat <<EOF > /etc/php/7.0/apache2/conf.d/99-sqlsrv.ini  
    extension=sqlsrv.so
    extension=pdo_sqlsrv.so
    EOF
    
    service apache2 restart
    

    【讨论】:

      【解决方案8】:

      tldr; sqlsrv 和 pdo_sqlsrv php 扩展对于带有大量参数的大型查询非常慢,但是安装和使用 pdo-dblib 为我解决了这个问题。

      在 Ubunutu 16.04 上运行 php 框架 laravel 5.1 和 5.6(在 php 7.1 和 7.2 上)。我发现 sqlsrv 和 pdo_sqlsrv 包不适用于大型查询。我有一个包含 30 个绑定变量的大型查询。 Sql Server 2008 将所有绑定变量转换为 nvarchar(4000) 导致 db 执行大量强制转换。

      然后我禁用 sqlsrv.so 和 pdo_sqlsrv.so 扩展并安装 pdo-dblib 扩展:

      sudo apt-get install php7.2-pdo-dblib
      

      然后查询处理得更快。

      更多信息:

      在底层,laravel 使用这样的 PDOStatement:

      $conn = new PDO( "dblib:host=$host:1433;dbname=$db;", $uid, $pwd);
      $stmt = $conn->prepare( $query );
      $stmt->execute($param);
      

      像哪里直接查询

      $conn = new PDO( "dblib:host=$host:1433;dbname=$db;", $uid, $pwd);
      $results = $conn->query( $query_with_parameter_already_bound );
      

      可以正常工作。

      【讨论】:

        【解决方案9】:
        sudo apt-get install php7.2-pdo-dblib
        

        这在 PHP 7.0 上对我有用,但仍然需要在

        上添加扩展

        /etc/php/7.0/apache2/php.ini

        还有

        /etc/php/7.0/cli/php.ini

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-01-09
          • 2018-02-28
          • 2013-08-18
          • 1970-01-01
          • 2012-04-15
          • 1970-01-01
          • 2019-09-02
          相关资源
          最近更新 更多