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

インストール、php.ini(Windows)

extension_dirの設定
extension_dir = "c:/php5/ext"
Dynamic Extensionsの設定
例:

extension=php_mbstring.dll
extension=php_exif.dll
extension=php_gd2.dll
extension=php_mysql.dll
extension=php_mysqli.dll
extension=php_pgsql.dll
extension=php_pdo.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_mysql.dll
extension=php_sqlite.dll
extension=php_xsl.dll
zend_extension_ts="c:/php5/ext/php_xdebug.dll"
必要なextensionライブラリをextにコピー
最新のmysql、mysqli extensionをextにコピー(アップデート)
最新のlibmysql.dllをphpディレクトリにコピー
include_pathの設定
設定がなかったり間違っている場合、go-pear.batを実行すると、pearの環境が変になるので注意。

include_path="."

変になったら、以下の手順で復旧。
PEARの環境がおかしくなった場合は

go-pear.bat
5.2.0はgo-pear.pharにバグがあるので、go-pear.pharの修正ファイルをダウンロードして、pearディレクトリにコピー。(PHP5.2.0のgo-pear.batでエラー

実行前に、C:\Windows\pear.iniを削除しておく。

php go-pear.php local
http://go-pear.org/http://pear.php.net/go-pearをgo-pear.phpに保存して実行。
PEAR_ENV.regを実行
include_pathを確認
通常はgo-pearで追加されるが、念のため確認。
include_path=".;c:\php5\pear"
apacheの設定
httpd.confに以下を追加

# php5 setting
LoadModule php5_module c:/php5/php5apache2_2.dll
AddType application/x-httpd-php .php .phtml
PHPIniDir "c:/php5"

unlink

[PHP-users 23600] Re: バージョンアップ後にunlinkでエラー

> オープンしたままのファイルに対して削除(unlink)するなんて
> ルール違反ですしOS、バージョン、タイミングによって
> 挙動が変化するのは当然です。
まさにおっしゃる通りで、基本的には OS によって挙動が変化するのは当り
前ですが、UNIX 系の OS では一時的に作成したテンポラリファイルを確実に
消す方法としては
open 直後に unlink して、そのまま使いつづける
というのは定番的な tips だったりします。
というのは、どれかのプロセスがそのファイルをオープンしていた場合、そ
のオープンしている最後のプロセスがファイルを close するまで、そのファ
イルは存在しつづけることが保証されるからです。確か POSIX でもそう決まっ
ていたはず。
どういうときに嬉しいかというと、先ほども書いたようにプログラム内で一
時ファイルを作るときです。プログラム内で一時ファイルを使用終了したら
unlink するという処理でも良いのですが、それではエラーで終了するときに
もいちいち unlink しなければなりませんし、予想外の異常終了の場合は一時
ファイルが残ったままになってしまいます。open 直後に unlink しておけば、
例えどんなケースであれ、プロセスが終了したら確実にファイルは消去されま
す。

array_walkの三番目の引数はarray

PHP: array_walk - Manual
bool array_walk ( array &array, callback funcname [, mixed userdata] )

通常、 funcname は引数を二つとります。 array パラメータの値が最初の引数、 キー/添字は二番目の引数となります。 オプションの userdata パラメータが指定された場合、 コールバック関数 funcname への三番目の引数として渡されます。

※このuserdataはarrayで受け渡しする。

入力文字コード変換

内部エンコーディングと出力エンコーディングが異なる場合は、php.iniでは入力エンコーディング変換をせず、mb_convert_variablesなどで、自力で変換する。
※mb_convert_variablesでは、だめな場合がある。
これは、

mb_convert_variables() は、エンコーディング検出の ためにArrayまたはObjectの文字列を結合します。これは、 エンコーディング検出は短い文字列では失敗する傾向があるためです。このため、 1 つの配列またはオブジェクトにエンコーディングを混ぜることはできません。

だからだろうか?
なので、
array_walkとmb_convert_encodingで再帰処理する。
また、
変換するのは$_POSTのみにする。$_GET、$_COOKIE、$_REQUESTは変換しない。
例:


function convert_encoding(&$item, $key, $encoding){
  if (is_array($item)){
    array_walk($item, 'convert_encoding', $encoding['to'], $encoding['from']);
  } else {
    $item = mb_convert_encoding($item, $encoding['to'], $encoding['from']);
  }
}
//array_walk($_GET, 'convert_encoding', array('to' => $internal_encoding, 'from' => $http_output));
array_walk($_POST, 'convert_encoding', array('to' => $internal_encoding, 'from' => $http_output));
//array_walk($_COOKIE, 'convert_encoding', array('to' => $internal_encoding, 'from' => $http_output));
//array_walk($_REQUEST, 'convert_encoding', array('to' => $internal_encoding, 'from' => $http_output));

mb_convert_variables
PHP/tips/日本語環境php.ini設定 - PukiWiki

mbstring Shift_JISを使う場合

入出力にShift_JISを使用する場合は、以下のmbstring設定が必要。

※このやり方はよくない。下記を参照。

mbstring.encoding_translation = On (php.ini または .htaccess)
mbstring.http_input = auto (php.ini または .htaccess)
mbstring.language = Japanese (php.ini または .htaccess またはスクリプト)
[php.ini]
;; HTTP 入力変換を有効にする
mbstring.encoding_translation = On
;; HTTP 入力エンコーディング変換を auto に設定
mbstring.http_input = auto
[.htaccess]
# shift_jis の場合のためのmbstring設定
# HTTP 入力変換を有効にする
php_value mbstring.encoding_translation 1
# HTTP 入力エンコーディング変換を auto に設定
php_value mbstring.http_input auto
[スクリプト]
mb_language($language);
mb_internal_encoding($internal_encoding);
mb_http_output($http_output);
//mb_detect_order('auto');
mb_substitute_character('none');

PHP: マルチバイト文字列関数 (mbstring) - Manual

※このやり方はよくない。

Shift_JISの場合はこれでいけるが、エンコードを動的に切り替える場合、UTF-8で入力エンコードがおかしくなる。
php.iniや.htaccessで、入力エンコーディング変換をせず、スクリプトで変換が必要な場合だけ、自力で変換する方がよい。
入力文字コード変換