PHP接口

1.概述

本手册描述了PHP在Linux环境下连接UXDB数据库。

2.PHP安装

  1. 安装依赖 在安装PHP,需要先安装libsqlite3x和oniguruma依赖。

    yum install libsqlite3x-devel -y
    yum install oniguruma-devel -y
    
  2. 安装PHP a. 在/usr/local路径下,下载官网的PHP包:

    wget https://www.php.net/distributions/php-7.4.8.tar.gz
    

    b. 解压安装包:

    tar -zxvf php-7.4.8.tar.gz
    

    c.在php-7.4.8路径下,执行如下命令:

    ./configure --prefix=/usr/local/php7 --with-config-file-path=/usr/local/php7 --enable-bcmath --enable-fpm --with-fpm-user=www --with-fpm-group=www --enable-mbstring --enable-phpdbg --enable-shmop --enable-sockets --enable-sysvmsg --enable-sysvsem --enable-sysvshm --with-zlib --with-curl  --with-pear --with-openssl --enable-pcntl
    

    d. 编译并安装php:

    make
    make install
    
  3. 配置环境变量

    在/etc/profile文件里面添加相关的PHP配置。

    sudo vim /etc/profile
    
    export GIT SSL NO VERIFY=true
    export VALGRIND HOME=/usr/local/valgrind
    export JAVA HOME=/usr/local/java/jdk1.8.0 161
    export PHP HOME=/usr/local/php7
    PATH=SPATH:SJAVA HOME/bin:SVALGRIND HOME/bin:$PHP HOME/bin
    export PATH
    

    执行如下命令使配置生效:

    source /etc/profile
    

3.uxsql和pdo_uxsql扩展安装

  1. 获取动态库

    下载驱动

  2. 安装动态库

    在PHP扩展安装路径下,解压安装包,得到两个so文件pdo_uxsql.so 和 uxsql.so。

    cd  /usr/local/php7/lib/php/extensions/no-debug-non-zts-20190902
    tar -xvf uxdb-php-linux.tar
    

4.相关配置

  1. php.ini

    a. 将源码路径下的php.ini文件拷贝至/usr/local/php7路径下。

    cp /usr/local/php-7.4.8/php.ini-development /usr/local/php7/php.ini
    

    b. 修改配置文件php.ini,如下:

    vim /usr/local/php7/php.ini
    

    在文件中找到cgi.fix_pathinfo配置项,去掉注释并设置为0,这主要是为了当文件不存在时,阻止Nginx将请求发送到后端的PHP-FPM模块,从而避免恶意脚本注入的攻击。

    ; A setting of zero causes PHP to behave as before.
    ; Default is 1.
    ; http://php.net/cgi.fix-pathinfo
    cgi.fix_pathinfo=0
    
    ; If cgi.discard_path is enabled, the PHP CGI binary can safely be placed outside
    ; of the web tree and people will not be able to circumvent .htaccess security.
    ; http://php.net/cgi.discard-path
    cgi.discard_path=1
    

    新增扩展pdo_uxsql和uxsql:

    extension=pdo_uxsql
    extension=uxsql
    
  2. 关于php命令

    修改完php.ini配置文件后,通过php --ini命令查看ini文件加载情况,如图为已加载:

    [root@ux215 php7]# php --ini
    Configuration File (php.ini) Path: /usr/local/php7
    Loaded Configuration File:         /usr/local/php7/php.ini
    Scan for additional .ini files in: (none)
    Additional .ini files parsed:      (none)
    [root@ux215 php7]#     
    

    注意

    php.ini应该放在安装目录下,而不是安装目录的/etc/下,否则php可能找不到配置文件。

    假设安装目录为/usr/local/php7/,那么php.ini应该放在这个目录下,而不是在/usr/local/php7/etc/下。

    通过如下命令查看扩展包,确认包含pdo_uxsql和uxsql。

    php -m
    
  3. 创建用户

    创建分组 www:

    groupadd www
    

    创建用户www:

    useradd -g www www
    
  4. php-fpm.conf和www.conf

    php-fpm.conf和www.conf这两个文档不做任何修改,只需要拷贝至特定目录下:

    cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf
    cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf
    

5.php脚本连接使用uxdb

  1. 启动uxdb

    进入uxdb安装目录的bin目录下:

    cd  /home/uxdb/uxdbinstall/dbsql/bin
    

    初始化集群:

    ./initdb -W -D test
    

    启动数据库:

    ./ux_ctl -D test start
    
  2. 启动php

    执行如下命令启动php:

    /usr/local/php7/sbin/php-fpm
    

    查看进程:

    ps aux | grep php-fpm
    netstat -tln | grep 9000
    
    [root@ux215 php7]# /usr/local/php7/sbin/php-fpm
    [root@ux215 php7]# ps aux | grep php-fpm
    root     104595  0.0  0.2  218152  4284 ?        Ss   16:49   0:00 php-fpm: master process (/usr/local/php7/etc/php-fpm.conf)
    www      104596  0.0  0.2  220236  4204 ?        S    16:49   0:00 php-fpm: pool www
    www      104597  0.0  0.2  220236  4208 ?        S    16:49   0:00 php-fpm: pool www
    root     104624  0.0  0.0  112712   968 pts/2    S+   16:49   0:00 grep --color=auto php-fpm
    
    [root@ux215 php7]# netstat -tln | grep 9000
    tcp        0      0 127.0.0.1:9000          0.0.0.0:* LISTEN
    
  3. 脚本连接

    在/usr/local/php7/bin目录下创建test.php脚本文件,文件内容如下:

    <?php
    $host        = "host=127.0.0.1";
    $port        = "port=5432";
    $dbname      = "dbname=UXDB";
    $credentials = "user=UXDB password=1";
    
    $db = ux_connect( "$host $port $dbname $credentials"  );
    if(!$db){
      echo "Error : Unable to open database\n";
    } else {
      echo "Opened database successfully\n";
    }
    
    $sql =<<<EOF
      CREATE TABLE COMPANY
      (ID INT PRIMARY KEY     NOT NULL,
      NAME           TEXT    NOT NULL,
      AGE            INT     NOT NULL,
      ADDRESS        CHAR(50),
      SALARY         REAL);
    EOF;
    
      $ret = ux_query($db, $sql);
      if(!$ret){
          echo ux_last_error($db);
      } else {
          echo "Table created successfully\n";
      }
    
      $sql =<<<EOF
          INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
          VALUES (1, 'Paul', 32, 'California', 20000.00 );
    
          INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
          VALUES (2, 'Allen', 25, 'Texas', 15000.00 );
    
          INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
          VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );
    
          INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
          VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );
    EOF;
    
      $ret = ux_query($db, $sql);
      if(!$ret){
          echo ux_last_error($db);
      } else {
          echo "Records created successfully\n";
      }
    
        $sql =<<<EOF
          SELECT * from COMPANY;
    EOF;
    
      $ret = ux_query($db, $sql);
      if(!$ret){
          echo ux_last_error($db);
          exit;
      } 
      while($row = ux_fetch_row($ret)){
          echo "ID = ". $row[0] . "\n";
          echo "NAME = ". $row[1] ."\n";
          echo "ADDRESS = ". $row[3] ."\n";
          echo "SALARY =  ".$row[4] ."\n\n";
      }
      echo "Operation done successfully\n";
    
      ux_close($db);
    ?> 
    

    执行如下命令,查看结果:

    php test.php
    
    [uxdb@ux215 ~]$ php test.php
    Opened database successfully
    Table created successfully
    Records created successfully
    
    ID = 1
    NAME = Paul
    ADDRESS = California
    SALARY = 20000
    
    ID = 2
    NAME = Allen
    ADDRESS = Texas
    SALARY = 15000
    
    ID = 3
    NAME = Teddy
    ADDRESS = Norway
    SALARY = 20000
    
    ID = 4
    NAME = Mark
    ADDRESS = Rich-Mond
    SALARY = 65000
    
    Operation done successfully
    [uxdb@ux215 ~]$
    
  4. uxdb验证

    进入uxdb安装目录的bin目录下:

    cd  /home/uxdb/uxdbinstall/dbsql/bin
    

    连接数据库:

    ./uxsql
    

    查看company表中的内容:

    select * from company ;
    
    uxsql (2.1.1.3)
    Type "help" for help.
    uxdb=# select * from company;
     id |  name  | age |  address   | salary 
    ----+--------+-----+------------+--------
      1 | Paul   |  32 | California |  20000
      2 | Allen  |  25 | Texas      |  15000
      3 | Teddy  |  23 | Norway     |  20000
      4 | Mark   |  25 | Rich-Mond  |  65000
    (4 rows)
    
    uxdb=#