ホーム » PHP

PHP」カテゴリーアーカイブ

CentOSにソースからインストールしたPHPをアンインストール

CENTOSのバージョン:CentOS release 6.6
PHPバージョン:5.3.14

インストール時にconfigure、make、make installを実行したPHPのソースフォルダ(※)より情報を収集

※例/var/download/php-5.3.14

config.statusにはconfigureのコマンドが記載されている

[code]
# ./configure -disable-debug -with-apxs2=/usr/local/apache2/bin/apxs -with-iconv -enable-mbstring -enable-zend-multibyte -with-mysql -enable-soap –with-zlib-dir –with-pdo-mysql –with-mysqli –enable-zip –with-gd –with-jpeg-dir=usr/local/lib –with-libdir=lib64 –with-curl –enable-ftp
[/code]

インストール先のフォルダは引数prefixで指定するが、configureでは指定していないのでデフォルトの/usr/localにインストールされた

以下のファイル、フォルダを削除すればPHPは削除される

/usr/local/bin/php
/usr/local/bin/php-config
/usr/local/bin/phpize
/usr/local/lib/php
/usr/local/lib/php.ini
/usr/local/lib/php

log4php

PEAR等を使わずに単純に使う方法
log4phpダウンロードページよりzip形式のSource packageをダウンロード。

phpフォルダの下にlibsフォルダを作成してダウンロードしたlog4phpを展開

Logger.phpがあるフォルダにPATHを通すためにphp.iniのinclude_pathを設定
[code]
;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;

; UNIX: "/path1:/path2"
;include_path = ".:/php/includes"
;
; Windows: "\path1;\path2"
;include_path = ".;c:\php\includes"
include_path = ".;c:\php\includes;D:\php\libs\apache-log4php-2.3.0\src\main\php"
[/code]

PATHが通ったフォルダ(今回はD:\php\libs\apache-log4php-2.3.0\src\main\php)に設定ファイル(log4php.xml)を作成して配置
[code]
<configuration xmlns="http://logging.apache.org/log4php/">
<appender name="default" class="LoggerAppenderFile">
<param name="file" value="default.log" />
</appender>
<appender name="myAppender" class="LoggerAppenderFile">
<param name="file" value="d:/log/log4php/myLog.log" />
</appender>
<root>
<level value="warn" />
<appender_ref ref="default" />
</root>
<logger name="myLogger">
<level value="debug" />
<appender_ref ref="myAppender" />
</logger>
</configuration>
[/code]

以下がログの出力
[code]
require_once("Logger.php");
Logger::configure(‘log4php.xml’); // 設定ファイルの読み込み
$logger = Logger::getLogger(‘myLogger’); // myLoggerという名前のloggerを使用
$logger->debug("debug message");
[/code]

PHP(Windows)で独自の拡張DLLを作成

実行環境

Windows2008R2(64bit)
IIS
PHP5.4.31の非スレッドセーフ版(IIS を使う場合は、非スレッドセーフ版の PHPのほうが安定しているらしい)
環境構築の為にダウンロードしたファイルは(php-5.4.31-nts-Win32-VC9-x86.zip)

開発環境

PHP5.4.31のソース等が入手できなかったため5.4.33のそれをダウンロード

php-5.4のダウンロードサイト

「Download source code」よりphp-5.4.33-src.zipをダウンロード

「VC9 x86 Non Thread Safe」-「Zip」よりphp-5.4.33-nts-Win32-VC9-x86.zipをダウンロード

clip_1ii

php-5.4.33-nts-Win32-VC9-x86.zipをC:\phpに展開。
(C:\phpにはパスを通す)

php-5.4.33-src.zipをC:\php-srcに展開。

Cygwin

拡張dllのフレームワークの作成等にCygwinのコマンドを使用するのでC:\Cygwinにインストール

Cygwinのサイトよりsetup-x86.exeをダウンロードしてセットアップ実行

必用なモジュールが不明だったのでフルインストールを実行したが、texlive-collection-basic.shのインストールで止まってしまった。

フルインストールをやめてデフォルトインストールをしたが、これでも同様にインストールが完了しなかった。

一応、今回の必用なモジュールはインストールされたようなので、深くは追求しない。

VC

VisualStudio2008はあらかじめインストール済

※別途SDKはインストールしていない

拡張DLLのテンプレートを作成

Visual Studio 2008コマンドプロンプトを開いてカレントをC:\php-src\extに移動して以下のコマンドを実行
※php_test.dllを作成するためのプロジェクトワークスペースが作成される

php ext_skel_win32.php --extname=test

config.w32ファイルの編集

C:\php-src\ext\test\config.w32を以下に従って編集

// $Id$
// vim:ft=javascript

ARG_ENABLE("test", "enable test support", "no");

if (PHP_TEST != "no") {
	EXTENSION("test", "test.c");
}

configure


C:\php-srcをカレントにして以下のコマンドを実行

buildconf
configure

正しく実行されればC:\php-src/main/config.w32.hが作成される

C:\php-src\ext\test

プロジェクトの設定とコンパイル

VCでC:\php-src\ext\test\test.dspを開く。
(test.dspはVC6用のプロジェクトファイルなのでVC2008用に変換)

アクティブなプロジェクトをRelease_TSに設定

追加のライブラリプロジェクトにC:\php\devを追加

スクリーンショット 2014-09-22 17.19.25

プリコンパイルプロセッサからZTS=1を削除
(スレッドセーフの時は不要)

スクリーンショット 2014-09-22 16.57.57

参照するライブラリをphp5ts.libからphp5.libに変更
(スレッドセーフの時は不要)

clip_2

以上の設定完了後、コンパイルを実行するとC:\php-src\ext\php_text.sllが作成される

関数の追加

関数Procを追加(引数には数値と文字)

php_test.h

以下を追加

PHP_FUNCTION(Proc);

test.c

test_functions[]にProcを追加

const zend_function_entry test_functions[] = {
	PHP_FE(Proc,	NULL)
	PHP_FE_END	/* Must be the last line in test_functions[] */
};

引数で受けた数値と文字列より文字列に変換して返す関数の実態

PHP_FUNCTION(Proc)
{

	char *arg = NULL;
	int arg_len, len;
	long n;
	char *strg;
	

	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &n, &arg, &arg_len) == FAILURE) {
		return;
	}

	len = spprintf(&strg, 0, "number=%d string=%s", n, arg);
	RETURN_STRINGL(strg, len, 0);
}

以上でリコンパイル

DLLの検証

php_test.dllを実行環境のD:\php\extにコピー

php.iniに以下を追加

extension=php_test.dll

関数の呼び出しをコーディング

$s=Proc(100, "tarum");
echo($s);

以上で正しく動作される

参考サイト


単純な PHP エクステンションの開発方法

gettextを使用してPHPを多国語対応(windows版)

gettextは様々な環境、言語に対応した多国語対応のライブラリ。
PHPも拡張機能として標準で提供されている。
※PHPのextディレクトリにあるphp_gettext.dllが実装
※php.iniのphp_gettext.dllのコメントを予め外して置く
※PHPファイルはUTF-8に設定

カタログファイルについて
gettextでは各言語ごとに辞書ファイル(gettextではカタログと呼ぶ)を用意する。
※拡張子はpo
カタログは全て共通のファイル名。(カタログのファイル名はドメインとして後ほど設定)
カタログファイルの作成方法は後述する。

カタログファイルのディレクトリ構成
実行環境(ここではWindowsサーバー、IISを想定)では各カタログのファイルを以下に従って配置する。
例)
c:¥temp¥locale¥言語¥LC_MESSAGES¥カタログファイル
※1.c:¥temp¥localeは任意のパスを設定可能。(ドメインのパスと呼ぶ)
※2.言語は言語コード_国コード。(日本はja_JP、英語は)

PHPでの実装
PHPでは以下を各PHPの最初に挿入する。


多国語対応の文字は以下のように埋め込む

カタログの作成
カタログはpoEditで作成する。
poEditをダウンロードサイトよりダウンロード
poEditはソースファイルを解析してカタログファイルを作成する

poEditを使用してカタログファイルを作成する際には実行環境とは別に以下のディレクトリ構成で作業することを前提に説明。
c:¥workにカタログファイルを保存
c:¥work¥root以下にソースファイル(*.php)を配置

poEditを起動
スクリーンショット 2014-04-18 05.25.19

メニューの新規作成を選択
言語にカタログ作成対象の言語を指定(最初は日本語)
poedit1

カタログの設定メニューで以下を設定
「プロジェクトの名前とバージョン」任意の名称
「文字符号化法」UTF-8
「ソースコードの文字符号化法」UTF-8
それ以外はデフォルト値
poedit2

ファイルを保存
一旦、ファイルを上述のC:¥workに保存。
ファイル名はdic.poとする。(既に述べた通り、ファイル名=ドメイン名)
poedit3

カタログの設定メニューで以下を設定
「ソースの検索パスーベースのパス」ピリオド(=C:¥work)を指定。
「ソースの検索パスーパス」各ソースのフォルダの絶対パス(=root)
「ソース中のキーワード」アンダーバーを指定
poedit3

poedit4

翻訳を入力
スクリーンショット 2014-04-18 07.10.19

カタログの更新を実行するとカタログファイル「dic.mo」に反映される。

カタログファイルを以下にコピー
c:¥temp¥locale¥jp_JA¥LC_MESSAGES¥dic.mo

以上

LOG4PHPで出力フォーマットに日付を指定したらエラー

LOG4PHPで出力フォーマットを指定しないとログには日時は出力されない
以下はLOG4PHPに渡す設定ファイル(config.xml)の内容
[code]
<configuration xmlns="http://logging.apache.org/log4php/">
<appender name="myAppender" class="LoggerAppenderFile">
<param name="file" value="c:/phplog/myLog.log" />
</appender>
<root>
<appender_ref ref="myAppender" />
</root>
</configuration>
[/code]
設定ファイルを以下に変更して日時を出力指定する
[code]
<configuration xmlns="http://logging.apache.org/log4php/">
<appender name="myAppender" class="LoggerAppenderFile">
<layout class="LoggerLayoutPattern">
<param name="conversionPattern" value="%d %-5p %m%n" />
</layout>
<param name="file" value="c:/phplog/myLog.log" />
</appender>
<root>
<appender_ref ref="myAppender" />
</root>
</configuration>
[/code]
すると以下のエラーが表示された

Warning: date(): It is not safe to rely on the system's timezone settings. 
You are *required* to use the date.timezone setting or the date_default_timezone_set() function. 
In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. 
We selected 'Asia/Tokyo' for '9.0/no DST' instead in C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\php\php\log4php\pattern\LoggerPatternConverterDate.php on line 74 Warning: date(): 
It is not safe to rely on the system's timezone settings. 
You are *required* to use the date.timezone setting or the date_default_timezone_set() function. 
In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. 
We selected 'Asia/Tokyo' for '9.0/no DST' instead in C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\php\php\log4php\pattern\LoggerPatternConverterDate.php on line 74 Warning: date(): 
It is not safe to rely on the system's timezone settings. 
You are *required* to use the date.timezone setting or the date_default_timezone_set() function. 
In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. 
We selected 'Asia/Tokyo' for '9.0/no DST' instead in C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\php\php\log4php\pattern\LoggerPatternConverterDate.php on line 74 Warning: date(): 
It is not safe to rely on the system's timezone settings. 
You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. 
We selected 'Asia/Tokyo' for '9.0/no DST' instead in C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\php\php\log4php\pattern\LoggerPatternConverterDate.php on line 74

メッセージに従ってphp.iniに以下を追加して対応

date.timezone = Asia/Tokyo

TOMCAT上でPHPを動かす

環境

OS Windows 2008 64bit
TOCAT 7.0.47
PHP php-5.3.28-Win32-VC9-x86

PHPのインストール

PHPのZIPファイル(php-5.3.28-Win32-VC9-x86.zip)をPHPのダウンロードページよりダウンロード

ZIPファイルをC:\php以下に展開

C:\php\php.ini-productionをC:\php\php.iniにコピー

;extension_dir = "ext"

extension_dir = "c:\php\ext"
に変更

;cgi.force_redirect = 1

cgi.force_redirect = 0
に変更

C:\phpにpathを通す

TOMCATの設定
PHP用のコンテキストPHPを作成
C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\php\WEB-INF\web.xmlに以下を記述
[code]
<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>PHP</display-name>
<servlet>
<servlet-name>cgi</servlet-name>
<servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>cgiPathPrefix</param-name>
<param-value></param-value>
</init-param>
<init-param>
<param-name>executable</param-name>
<param-value>C:\php\php-cgi.exe</param-value>
</init-param>
<init-param>
<param-name>passShellEnvironment</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>cgi</servlet-name>
<url-pattern>*.php</url-pattern>
</servlet-mapping>
</web-app>
[/code]

C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\php\META-INF\content.xmlに以下を記述
[code]
<?xml version="1.0" encoding="utf-8"?>
<Context privileged="true"/>
[/code]

C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\php\test.phpに以下を記述
[code]
<?php
phpinfo();
?>
[/code]

http://localhost:8080/php/test.phpをブラウザで表示して動作を確認
スクリーンショット 2014-01-15 10.27.54

参考にしたサイト

Tomcat上でPHPを動作させる

Tomcat 6.0.26でCGIを使ってPHPを呼び出す

TOMCATコンテキストの追加

C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps以下に新しいコンテキストとなるディレクトリを作成
ここではディレクトリphpを作成
C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\WEB-INF\web.xmlに以下を記述
[code]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>PHP</display-name>
</web-app>
[/code]

web.xmlの詳細はこちらが詳しい

TOMCAT5以前ではC:\Program Files\Apache Software Foundation\Tomcat 7.0\conf\Catalina\localhost以下にコンテキストの情報をXMLに記述したが、TOMCAT6以降では必用はないようだ。