PHPには、CGI版とモジュール版がある

レンタルサーバのPHPの設定を見ると、

CGI版

モジュール版

とあります。

なんなんだ?

PHP公式のページ?を参照すると

サーバーに PHP を組み込む方法が 2 種類あります。多くのサーバーに対して、各サーバー独自のモジュールインターフェイス (SAPI とも呼ばれます) を通じて、ダイレクトに PHP を動作させることができます。 Apache、Microsoft Internet Information Server、 Netscape、iPlanet サーバーなどがサポートされています。 ISAPI と呼ばれるマイクロソフト互換のモジュールインターフェイスを 持つ Web サーバー(OmniHTTPd など)もサポートされます。 PHP がモジュールのサポートをしていない Web サーバーに対しては、 CGI もしくは FastCGI プロセサとして PHP を使用することができます。つまり、PHP ファイルへのリクエストの処理を、 PHP のコマンドライン版の実行ファイルを使って行うよう Web サーバーを設定することができます。

https://www.php.net/manual/ja/install.general.php

CGI版のPHPの動き

  1. ユーザからWEBサーバにリクエスト(例、ホームページにアクセスする)
  2. 1のリクエストを受け取ると、WEBサーバがCGI(プロトコル)の仕組みを利用してPHPを実行する。
  3. WEBサーバがCGI経由のPHPの実行結果をユーザに返す。

モジュール版のPHPの動き

  1. ユーザからWEBサーバにリクエスト(例、ホームページにアクセスする)
  2. 1のリクエストを受け取ると、WEBサーバが直接PHPを実行する。
  3. WEBサーバがPHPの実行結果を、ユーザに返す。
CGI版FastCGI版モジュール版
実行速度遅い速い速い
php.iniの読込毎回プロセス生成時初回のみ
php.iniを変更した場合サーバの再起動が必要
CGI版とモジュール版の比較結果

CGIは、リクエストがあるたびに、プロセスが1つ生成され、完了したらプロセスが破棄される仕組み。プロセスの生成と破棄は、負荷が高い処理。

モジュールは、WEBサーバの機能として組み込まれているため、そのまま実行して完了できる。プロセスの生成と破棄といったことはない。

CGIは、改良されたFastCGIと呼ばれるものがある。FastCGIは、初回起動したプロセスを一定時間保持して利用することにより、プロセスの生成と破棄を毎回行わない。モジュール版のPHPと同等の速度がでる。

よし!今日も1つ知らないことがわかって、頭が賢くなった気がしました。

phpMyAdminインストール(Centos6)

yumでインストール

# yum --enablerepo=epel install -y  phpMyAdmin
読み込んだプラグイン:fastestmirror, refresh-packagekit, security 

Error getting repository data for epel, repository not found 

EPELリポジトリを知らない

EPEL リポジトリ インストール

# cd /tmp/
# wget ftp://ftp.riken.jp/Linux/fedora/epel/6/x86_64/Packages/e/epel-release-6-8.noarch.rpm 
# rpm -ivh ./epel-release-6-8.noarch.rpm 

再度、yumでインストールを実行すると、phpMyAdminがインストールできた。

EPELリポジトリの使用をしないに設定する。競合する場合があるため、必要なときに使用するにしたほうが良いらしい。enabled=1 を enabled=0にする

# vim /etc/yum.repos.d/epel.repo

apacheを再起動して

# service httpd restart

http://localhost/phpMyAdmin/ でブラウザでログインできる

エラーが発生する場合は、エラーログを見る

# cat /var/log/httpd/error_log 

client denied by server configuration: /usr/share/phpMyAdmin

クライアントの権限エラー

phpMyAdminの設定する。テスト環境なので全てのクライアントをアクセス許可。Allow from all とする

 # vim /etc/httpd/conf.d/phpMyAdmin.conf 

エラー一覧

エラー内容

PHP Fatal error: Call to undefined function mb_convert_variables() in ソースの場所 on line xxx
原因と対処を表示

原因

拡張モジュールがインストールされていない。

対処

yum install php-mbstring
 
 

エラー内容

Error: SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes
原因と対処を表示

原因

最大キー長は767バイトまでとなっているため(デフォルト)。文字列型カラム(varchar型やchar型など)に対してインデックスを作成する場合に最大キー長があり,それはバイト数で管理されている。

対処

インデックスの最大キー長を3072バイトまで拡張する my.cnf(デフォルトは、/usr/my.cnf)
[mysqld]
innodb_large_prefix
innodb_file_per_table
innodb_file_format=Barracuda
innodb_large_prefix オプションを有効にすると、DYNAMIC および COMPRESSED 行フォーマットを使用する InnoDB テーブルで、767 バイトよりも長い (最大で 3072 バイトの) インデックスキープリフィクスが許可されます。(このようなテーブルの作成には、innodb_file_format=barracuda および innodb_file_per_table=true のオプション値も必要になります。) innodb_file_per_table InnoDB では、新たに作成された各テーブルのデータおよびインデックスがシステムテーブルスペースではなく、個別の .ibd ファイルに格納されます。これらの InnoDB テーブル用のストレージは、テーブルが削除されたり、切り捨てられたりすると再利用されます。このように設定すると、テーブルの圧縮などのその他のいくつかの InnoDB 機能が有効になります。 innodb_file_format 有効にするには、innodb_file_per_table が有効になっている必要があります。テーブルの圧縮などの特定の InnoDB 機能を使用するには、Barracuda ファイル形式が必要です。
 

phpのタイムゾーン設定

サービス提供するのが日本か?世界中か?

サービスを提供するのが日本だけであれば、何も考えずタイムゾーンを日本時間にする。

PHPのタイムゾーンの設定とは何か。

マニュアルから抜粋
「スクリプト中の日付/時刻関数(日付/時刻関数とは)で使用されるデフォルトタイムゾーンを設定する」
time関数などを使って取得した時間が、日本時間で良いか?だけです。 私は、日本のみのサービスしかやったことがないため、なにも考えず日本時間にします。

現在のタイムゾーンの確認方法

echo date_default_timezone_get()
 

タイムゾーンの設定方法

設定は、以下の2パターンある。
  1. php.ini で設定してあげれば、OK。
  2. php.ini が使えない場合は、 date_default_timezone_set関数を使う。

php.ini で設定する

// 日本時間に設定
date.timezone = "Asia/Tokyo"
 

date_default_timezone_set 関数で設定する

// 日本時間に設定 
date_default_timezone_set('Asia/Tokyo'); 

bool date_default_timezone_set ( string $timezone_identifier )

PHP – バイナリデータ(画像)を読み込みファイルに保存したい

解決したいこと

バイナリデータ(画像)を読み込みファイルに保存したい

[php] // バイナリデータ(画像)を読みこむ $im = imagecreatefromstring($imageData); if ($im === false) { // エラー処理 return; } $filepath = "savedFilePath"; if (!imagepng($im, $filepath)) { // エラー処理 return; } // 必要に応じてパーミッションを変更 chmod($filepath, 0666); [/php] imagecreatefromstring の リファレンス imagepng のリファレンス