PHP PDO トランザクション

備忘録しておきます。
接続文字列の chrset がないと文字化けすることがあります。


<?php

// 接続文字列 //
$CONN = "mysql:dbname=dbname;host=localhost;charset=utf8";

// 接続 //
$dbm = new PDO($CONN, "dbname", "?????????");
echo "MySQL Connected\n";


// MySQLランザクション開始 //
$dbm->beginTransaction();

/* ここに更新処理を入れる */

// MySQLコミット //
$dbm->commit();

// 切断 //
$dbm = null;


?>

バージョン取得コマンド まとめ


[root@??? ???]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Nov  5 2018 01:47:09


[root@??? ????]# java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)

[root@??? ???]# php -v
PHP 7.1.25 (cli) (built: Dec  8 2018 13:52:58) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.1.25, Copyright (c) 1999-2018, by Zend Technologies

[root@??? ????]# python --version
Python 2.7.5

[root@??? ???]# perl -v | head -n 3

This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi
(with 38 registered patches, see perl -V for more detail)

[root@??? ???]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core) 

[root@???? ????]# mysql -uroot -p???????????_ --version
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql  Ver 8.0.13 for Linux on x86_64 (MySQL Community Server - GPL)

[root@???? ????]# postfix -v
postfix: name_mask: ipv4
postfix: inet_addr_local: configured 4 IPv4 addresses
postfix/postfix-script: error: unknown command: ''
postfix/postfix-script: fatal: usage: postfix start (or stop, reload, abort, flush, check, status, set-permissions, upgrade-configuration)

[root@??? ???]# vsftpd -v
vsftpd: version 3.0.2

[root@??? ???]# wget --version | head -n 1
GNU Wget 1.14 built on linux-gnu.

[root@??? ???]# curl --version
curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 NSS/3.36 zlib/1.2.7 libidn/1.28 libssh2/1.4.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp 
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz unix-sockets 

[root@???? bin]# ./version.sh
/usr/local/tomcat9/bin/setenv.sh: 行 3: /root: ディレクトリです
Using CATALINA_BASE:   /usr/local/????
Using CATALINA_HOME:   /usr/local/????
Using CATALINA_TMPDIR: /usr/local/????/temp
Using JRE_HOME:        /
Using CLASSPATH:       /usr/local/tomcat9/bin/bootstrap.jar:/usr/local/tomcat9/bin/tomcat-juli.jar
Server version: Apache Tomcat/9.0.10
Server built:   Jun 20 2018 17:32:21 UTC
Server number:  9.0.10.0
OS Name:        Linux
OS Version:     3.10.0-957.1.3.el7.x86_64
Architecture:   amd64
JVM Version:    1.8.0_191-b12
JVM Vendor:     Oracle Corporation

root@??????:/?????# cat /etc/debian_version
7.11

各データベース バージョン取得SQL


/* MySQL */
SELECT VERSION();

/* Firebird */
SELECT rdb$get_context('SYSTEM', 'ENGINE_VERSION') from rdb$database;

/* PostgreSQL */
SELECT version();

/* SQL Server */
SELECT CAST(SERVERPROPERTY('productversion') AS VARCHAR(30));

/* SQL AnyWhere */
SELECT TOP 1 version
FROM SYSHISTORY
WHERE operation = 'START'
ORDER BY first_time_utc DESC;

/* sqlite */
select sqlite_version();

/* Oracle */
select * from v$version WHERE ROWNUM = 1;

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Firebird徹底入門 [ 木村明治 ]
価格:4180円(税込、送料無料) (2023/1/16時点)

Tomcat9 JNDIデータソースの設定

プーリングコネクションするJNDIの設定を、server.xml に記述します。

[ 設定例 MySQL ]


      <Resource 
      driverClassName="com.mysql.jdbc.Driver" 
      maxActive="300" 
      maxIdle="100" 
      maxWait="5000" 
      name="jdbc/DATABASE_NAME" 
      password="??????" 
      type="javax.sql.DataSource" 
      url="jdbc:mysql://localhost:3306/DATABASE_NAME?characterEncoding=utf8&amp;autoReconnect=true&amp;useSSL=false" 
      username="??????" 
      
      validationQuery="select 1"
      testOnBorrow="true"
      testWhileIdle="true"
      timeBetweenEvictionRunsMillis="60000"
      />

5.7系にバージョンアップした時、はまったのですが、非リモートサーバーのデータベースの場合、urlに useSSL=false を入れる必要あります。(ないと劇遅)
Oracleの中の人に教えてもらったのですが、同一ホスト内の場合、127.0.0.1 より localhost が速いそうです。

[ 設定例 Firebird ]


    <Resource
      name="jdbc/DATABASE_NAME"
      type="javax.sql.DataSource"
      driverClassName="org.firebirdsql.jdbc.FBDriver"
      password="????????"
      maxIdle="40"
      maxWait="5000"
      username="????????"
      url="jdbc:firebirdsql:localhost/3050:DATABASE_NAME?lc_ctype=SJIS_0208"
      maxActive="100"
      
    />

[ 設定例 Oracle ]


    <Resource
      name="jdbc/SID_NAME"
      type="javax.sql.DataSource"
      driverClassName="oracle.jdbc.driver.OracleDriver"
      password="SID_NAME"
      maxIdle="40"
      maxWait="5000"
      username="????????"
      url="jdbc:oracle:thin:@???.???.???.???:1521:SID_NAME"
      maxActive="100"/>

[ 設定例 PostgreSQL ]


    <Resource
      name="jdbc/DBNAME"
      type="javax.sql.DataSource"
      driverClassName="org.postgresql.Driver"
      password="???????"
      maxIdle="40"
      maxWait="5000"
      username="??????"
      url="jdbc:postgresql://127.0.0.1/DBNAME"
      maxActive="100"/>

[ 設定例 SQLServer ]


     <Resource
      name="jdbc/DBNAME"
      type="javax.sql.DataSource"
      driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
      password="??????"
      maxIdle="40"
      maxWait="5000"
      username="??????"
      url="jdbc:sqlserver://???.????.???.???:1433;DatabaseName=DBNAME"
      maxActive="100" />

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Tomcatハンドブック
価格:5170円(税込、送料無料) (2023/1/11時点)

Apache2.4 <=> Tomcat 連携

/etc/httpd/conf.d/ の中にインクルードする設定ファイルを作り、以下のような記述を入れます。
8009 はデフォルトのTomcatの server.xml に設定されたポート番号なので、変えた場合、変える必要あります。

<Location /tomcat_sitename>
  ProxyPass ajp://127.0.0.1:8009/tomcat_sitename
</Location>

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Tomcatハンドブック
価格:5170円(税込、送料無料) (2023/1/11時点)

Apache2.4 プロキシ配下でリアルなリモートIPを取得する設定

httpd.conf に以下のような設定を入れます。


LoadModule remoteip_module modules/mod_remoteip.so
RemoteIPHeader X-Forwarded-For

RemoteIPInternalProxy 10.0.0.0/8
RemoteIPInternalProxy 192.0.0.0/8
RemoteIPInternalProxy ???.???.???.0/24

PHP のバージョン情報を応答ヘッダーから消す

php.ini を以下の記述に変更します。


;;;;;;;;;;;;;;;;;
; Miscellaneous ;
;;;;;;;;;;;;;;;;;

; Decides whether PHP may expose the fact that it is installed on the server
; (e.g. by adding its signature to the Web server header).  It is no security
; threat in any way, but it makes it possible to determine whether you use PHP
; on your server or not.
; http://php.net/expose-php
expose_php = Off

ない場合、下のような応答ヘッダーになり危険です。

Apache2.4 ログローテーションの設定

httpd.conf に以下のような記述を入れてます。
プロキシされてるサーバーなので、SSLの設定入れてませんが、必要な場合、ssl.confに同様の設定入れるとよいです。

<IfModule log_config_module>
    #
    # The following directives define some format nicknames for use with
    # a CustomLog directive (see below).
    #
    ### last %D means micro second ###
    LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" combined
    LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      # You need to enable mod_logio.c to use %I and %O
      LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>

    #
    # The location and format of the access logfile (Common Logfile Format).
    # If you do not define any access logfiles within a <VirtualHost>
    # container, they will be logged here.  Contrariwise, if you *do*
    # define per-<VirtualHost> access logfiles, transactions will be
    # logged therein and *not* in this file.
    #
    #CustomLog "logs/access_log" common

    #
    # If you prefer a logfile with access, agent, and referer information
    # (Combined Logfile Format) you can use the following directive.
    #
    SetEnvIf User-Agent "ELB-HealthChecker.*" nolog
    #CustomLog "logs/access_log" combined env=!nolog
    CustomLog "|/usr/sbin/rotatelogs /home/Log/apache/access_log_%Y%m%d 86400 540" combined env=!nolog
</IfModule>