PHPの最近のブログ記事

PHPのfwriteという関数で文字列をファイルに書き込んでやる処理をLinuxのcronとかWindowsのタスクで自動で実行させているとする。いつもそれで問題なくファイルが生成できているのが突然できなくなって、0KBのファイルしか生成されなくなった。あれ?プログラミング、ミスった?いや、サーバの設定ミスった?とか慌てて肝心なことを見落としてしまうことがある。

PHPとかLinuxとか全然知らない頃でも知っていたことなのに忘れてしまっていた。これは頭が固くなっている証拠なのかもしれない。難しく考えすぎず、昔から知っていた「ホームページ作ろうとした時に0KBのファイルができてしまう時の有名な(?)単純な原因」を思い出せればよかった。

ファイルを保存しようとしてるサーバの空き容量がないんだよってこと。

プロバイダーで借りるホームページの場合などは20MBとか100MBとか少ない容量だからガンガン写真とかFTPしてたらいつの間にか割り当てられたディスク容量を消費し尽して残り0MBになっている。それに気づかなくて必死でFTPして「あれ?10KBの画像をFTPしたのに0KBで上がってしまう。何で?」と悩む羽目になる。それと同じことだ。

Linuxで「df -h」とディスクの使用状況を確認するコマンドを打ってみたところ、なんとホームページ領域が残り0という表示だった。そこで空き容量を増やしたら問題は解決した。

FTPでの過去の苦い経験を活かすことができなかったのが悔しい。こんなことで2時間以上悩んでしまったのがひどくアホらしかった。

例えば、1〜20までの数字を01、02、・・・、09、10、・・・、20といったような整形をしたい場合のメモ。

sprintf(整形後の文字列の書式,整形の対象となる文字列)

<例>
echo sprintf("%02d",1);
//出力結果 01

echo sprintf("%02d",10);
//出力結果 10

echo sprintf("%02d",123);
//出力結果 123

※「%2d」の「2」が数値の桁数。4桁の数値とする場合は、「4」を指定する。

echo sprintf("%04d",1);
//出力結果 0001

PHPエラーの例:
Warning: Wrong parameter count for str_replace() in /var/www/html/test.php on line 130
※適当に訳すと、/var/www/html/test.phpの130行目でstr_replace()に渡している引数の数に誤りがある、というエラー。

《str_replaceの使用例》
$str = "猫大好き";
$str = str_repace("猫","デブ猫",$str);
echo $str;

出力結果:デブ猫大好き

str_repaceでは文字列を置換するために3つの引数を渡してやる必要があるのだが、渡した引数が足りなかったり多かったりすると上記のようなエラーが出る。

正 str_repace("猫","デブ猫",$str)
誤 str_repace("猫","デブ猫")
PHPでディレクトリ内のファイルをコピーする場合、
copy(コピー元ファイル,コピー後のファイル)
というようにcopy()関数を使用する。

《例》
copy("nekochan.jpg","koneko.jpg");
※nekochan.jpgというファイルをコピーし、koneko.jpgというファイル名で保存する。

しかし、このcopy関数、PHPを動作させているサーバがWindowsなら気にしなくてよいがLinuxの場合、ディレクトリのパーミッションを気にしておかないと、以下のようなPermission deniedというエラーが出てしまう。

Warning: copy(koneko.jpg) [function.copy]: failed to open stream: Permission denied in /var/www/html/nobuneko/test.php on line 6
※適当に訳すと、koneko.jpgというファイルをnobunekoディレクトリに書き込もうとしたが、nobunekoディレクトリへの書き込み権限がないため、書き込みが拒否された(Permission denied)というエラー。
この場合、コピー先のディレクトリ「nobuneko」のパーミッションに問題があるので、パーミッションを適宜変更することでエラーは解消する。

■パーミッション変更前
drwxrwxr-x 2 nobu nobu 4.0K 6月 16 13:31 test
※drwxrwxr-x→パーミッション:775のこと。
 このままではPHPのcopy()関数でディレクトリ内にファイルをコピーできない。

■パーミッション変更後
drwxrwxrwx 2 nobu nobu 4.0K 6月 16 13:31 test
※drwxrwxrwx→パーミッション777のこと。
 これで書き込み可能となる。

《備考》パーミッションの変更方法
Linuxコマンド
 → chmod 777 nobuneko
※nobunekoディレクトリのパーミッションを777にするコマンド。
※FFFTP等のFTPツールでも変更可能な場合がある。



PHPプログラミングでミスを犯し、PHPエラーとして以下のようなエラーが出ることがある。

Parse error: syntax error, unexpected '"', expecting T_STRING or T_VARIABLE or T_NUM_STRING in C:\nobuneko\test.php on line 20

このエラーは、ある変数に文字列を入れる際に出た。意味としては、"(ダブルクォーテーション)の扱い方が間違っている、ということ。

<例>
誤 $path = "C:¥nobuneko¥";
正 $path = "C:¥nobuneko¥¥";

この例の「誤」の場合、パスとして末尾の¥(円マーク)も含めて変数「$path」に「C:¥nobuneko¥」を入れようとしているが、¥(円マーク)はPHP言語では「エスケープシーケンス」となるので、"(ダブルクォーテーション)の前に置いたら"(ダブルクォーテーション)がエスケープされてしまい、

"文字列"
という書式が
"文字列

という書式になってしまって"(ダブルクォーテーション)の開始部分はあるが終了部分(閉じ部分)がないと見なされてるようだ。
この場合、この例の「正」のように¥(円マーク)を2つ並べて書くことで直後の"(ダブルクォーテーション)をエスケープすることなく、¥自身を文字列として変数に入れることができる。
ディレクトリのパスを文字列として変数に入れる時にはこの例のようにエスケープシーケンスの件を忘れてミスをしてしまうことがあるので注意が必要。

※ここでは「¥」を全角文字で記載しているが、実際には半角文字。半角の¥はブラウザで\(バックスラッシュ)と表示されてしまって話が分かりにくくなってしまったので、ここでの話を分かりやすくするために全角で書いた。

PHP5で実装されているget_headers関数の使用例

(1)get_headers(取得対象のURL,0)
$url = https://nobuneko.com/index.html;
$headers_result_array = get_headers($url,0);
print_r($headers_result_array);

//出力結果
Array
(
    [0] => HTTP/1.1 200 OK
    [1] => Date: Thu, 21 Jun 2009 03:38:36 GMT
    [2] => Server: Apache
    [3] => Connection: close
    [4] => Content-Type: text/html; charset=EUC-JP
)

(2)get_headers(取得対象のURL,1)
$url = "https://nobuneko.com/index.html";
$headers_result_array = get_headers($url,1);
print_r($headers_result_array);

//出力結果
Array
(
    [0] => HTTP/1.1 200 OK
    [Date] => Thu, 21 Jun 2009 03:40:09 GMT
    [Server] => Apache
    [Connection] => close
    [Content-Type] => text/html; charset=EUC-JP
)

get_headers(取得対象のURL,0)とget_headers(取得対象のURL,1)の違いは、生成される配列の違い。(2)のような連想配列の方が分かりやすいかもと思ったが、[date]なら日時を表すことが簡単に分かるけれど、[0]って何のことか分からない。もっと分かりやすいのにしてくれたらよかったのに・・・。

もし、get_headersに渡すURLが「http://〜」なら問題ないのに「https://〜」だとうまく結果を取得できない場合、以下のようなPHPエラーが出ているかもしれない。

Warning: get_headers() [function.get-headers]: This function may only be used against URLs. in D:nobuneko\html\test.php on line 51

このエラーについては、URLが正しいのであれば、PHPの設定に問題があるかもしれない。
phpからhttpsへの通信(SSL通信)ができる設定になっているかをphpinfo()とphp.iniで確認する。

※以下に、WindowsでPHP5を使用している場合の例を記載する。
<PHPからhttpsに接続できない設定例>
★phpinfo()
Registered PHP Streams:php, file, data, http, ftp, compress.zlib 
Registered Stream Socket Transports:tcp, udp 
→httpsの記述が見あたらない。この設定だとPHPからhttpsのページにアクセスできない。

★php.ini
;extension=php_openssl.dll
→「extension=php_openssl.dll」がコメントアウトになっている。

<PHPからhttpsに接続できる設定例>
★phpinfo()
Registered PHP Streams  php, file, data, http, ftp, compress.zlib, https, ftps 
Registered Stream Socket Transports  tcp, udp, ssl, sslv3, sslv2, tls 
→httpsの記述がある。PHPからhttpsページへのアクセスができる。

★php.ini
extension=php_openssl.dll
→「extension=php_openssl.dll」がコメントアウトになっていない。

<PHPからhttpsに接続できない設定例>のようになっている場合は、php.iniのextension=php_openssl.dllのコメントアウトを解除してApacheを再起動すれば
問題が解決する可能性がある。

先日、「PHPで0パディングする(数字の先頭に0をつける)」という記事を書いたのだが、その時、逆に数字の先頭に0がついている時に0を削除する(0をのける、0を除く)方法はどうしていたのだろう、と思ったが、すぐに思い出せなかったのでしばらく放っておいた。
その後、しばらくしてすぐに思い出したのだが、それを書くのを忘れていた。
今、そのことを思い出したので、忘れないうちに書いておく。

《例》
$str = "000100";
echo $str;
//出力結果:000100

echo abs($str);
//出力結果:100

絶対値を求めるためのabs関数をゼロサプレス(数字の先頭から0を除く/のける)目的で使用するのは、abs関数の本来の役割とは違うためちょっと気になるのだが、他に方法が思いつかなかったのでもう2年ほどこのまま使っている。PHP4、PHP5どちらでも問題なさそうだった。

《2011年8月24日3時17分追記》
昨日、ltrimでもゼロサプレスができるというコメントを頂いたので、早速試してみた。

$str = "000100";
echo ltrim($str,'0');
//出力結果:100

うまくいった!この方法も良いと思った。

《例》
$mysql_con = mysql_connect("localhost","MySQLのユーザ名","MySQLのパスワード");
echo $mysql_con;
//出力結果:Resource id #2

PHPのmysql_connect()関数でMySQLデータベースへの接続に成功した場合、その結果を出力したら「Resource id #2」が返るようだった。

※試しにわざと間違ったパスワードで接続を試みると、以下のようなエラーが表示された。
Warning: mysql_connect() [function.mysql-connect]: Access denied for user: 'MySQLのユーザ名@localhost' (Using password: YES) in /nobuneko.com/nekodaisuki/test.php on line 4

※存在しないサーバ名を指定すると、以下のエラーが表示された。
Warning: mysql_connect() [function.mysql-connect]: Unknown MySQL Server Host 'neko' (1) in /nobuneko.com/nekodaisuki/test.php on line 4

mysql_connect()関数での接続結果をechoで出力すると、MySQLへの接続に成功していても「true」とか「1」ではなくて、「Resource id #2」と表示される。、デバッグで仕方なく確認している時、あるいは、今のように(今、午前4時46分。普段は眠いのだけど、いつの間にか夜更かししていた。もうかなり眠くなってきた。)勉強がてらPHPとMySQLで遊んでいる時にこのメッセージに久しぶりに出くわすと「何だったっけ、これ?」と思ってちょっと不安になる。

さて、「Resource id #2」は、MySQLへの接続に成功していることを表すため、mysql_connect()の戻り値は「true」となり、以下のような条件文を書くことができる。

《例》
if($mysql_con == true){
    echo "MySQLへの接続に成功。";
}
else {
    echo "MySQLへの接続に失敗。";
}

ちなみに、以下のような条件文は成立しなかった。
if($mysql_con == "Resource id #2"){
     echo "MySQLへの接続に成功。";
     //実際には、この条件文は成り立たないので何も出力されない。うっかりしていると勘違いしてしまうので注意。
}
PHPのmysql_close()関数でMySQLの接続を閉じることができるのだが、この関数実行前にMySQLに接続できていなかった場合、以下のようなエラーメッセージが表示される。
Warning: mysql_close(): supplied argument is not a valid MySQL-Link resource in /nobuneko.com/nekodaisuki/test.php on line 11
PHPの関数mysql_select_db("使用したいデータベース名","接続済みMySQLのリソース")でデータベースを選択することができるのだが、MySQLに接続できていないのにこの関数を実行した場合は以下のようなPHPエラーが表示される。
Warning: mysql_select_db(): supplied argument is not a valid MySQL-Link resource in /nobuneko.com/nekodaisuki/test.php on line 12

PHPのプログラム実行の結果、
Parse error: syntax error, unexpected $end in /nobuneko/test.php on line 9
といったエラーメッセージが出る場合、終わり波括弧「}」の数が足りないかもしれない。

《終わり波括弧「}」が不足する例》
<?php
$test = 1;
if($test == 1){
 echo "1です";
}
else {
 echo "1以外です";
//★ここに本来、終わり波括弧「}」があるべきなのだが、書き忘れていると上記のようなエラーが出る。
?>

それでは、逆に終わり波括弧「}」ではなく、始め波括弧「{」がない場合にはどんなエラーが出るのかを試してみたら、以下のようなエラーメッセージとなった。
Parse error: syntax error, unexpected '}' in /nobuneko/test.php on line 8

《始め波括弧「{」が不足する例》
<?php
$test = 1;
if($test == 1){
 echo "1です";
}
else //★ここに本来、始め波括弧「{」があるべきなのだが、書き忘れていると上記のようなエラーが出る。
 echo "1以外です";
}
?>

PHPで小数点付きの数字から整数値のみを取得する方法を以下にメモしておく。
intval()関数を用いて、以下のようにする。

intval(小数点付きの数字)

《例》
小数点付きの数字「1.2」から整数部分の数字「1」のみを取得して表示する。
$num = "1.2";//文字列
$num = intval($num);
echo $no;
//出力結果:1

www.nobuneko.comなどドメイン名のIPアドレスを調べたいと思った時の簡易ツールをPHPで作ってみた。

参照:Get IP address from domain name

今後、上記のページに限らず、私のホームページは、少なくとも英語・日本語両方に対応しようと思って、今回は手始めにまず英語のみのページで作ってみた(英文法とか滅茶苦茶なんで、後で修正を考えないと・・・笑)。そのうち、接続元IPアドレスとかを見て日本語表示にするなどの格好いいことができればいいなあ、と思っている(また、いつもの言うだけにならないようにしなくては・・・)。本気でそうするのなら、今のShift_JIS、EUC-JP混在のページをもうUTF-8にしてしまう、といった面倒なことも考えないといけないなぁ・・・。

さて、そろそろ年越しそばを食べて仕事に行こうかなぁ。

コンソール画面でpsql -U postgresが利用できるようになっても、PHPでDB接続できない場合がある。
その時に、PostgreSQLのログを見てみると(Linuxなら/var/lib/pgsql/data/pg_logなどログがある)、以下のようなエラーが出ている。

LOG:  could not connect to Ident server at address "127.0.0.1", port 113: 接続を拒否されました
FATAL:  Ident authentication failed for user "postgres"

この場合、pg_hba.confの設定を変更すると接続できるようになる。

/var/lib/pgsql/data/pg_hba.conf
-----------------------------------------------------------------------------------------------------
# IPv4 local connections:
host    all         all         127.0.0.1/32          ident sameuser
-----------------------------------------------------------------------------------------------------

PostgreSQL 8.xのインストール直後だと上記のようになっているので、「ident sameuser」を「trust」に変更する。

-----------------------------------------------------------------------------------------------------
# IPv4 local connections:
host    all         all         127.0.0.1/32          trust
-----------------------------------------------------------------------------------------------------

PostgreSQLサービスを再起動したら、PHPからPostgreSQLデータベースに接続できるようになるはず。

PHP5.2.4とかPHP5.2.6では、date.timezone、extension_dirは何も設定しなくても問題なかったのだが、5.3.2にアップデートすると、これらに設定をしないとエラーメッセージが表示された。

例えば、phpinfoを見てみると、「date」の項目でで以下のエラーが表示された。

date
date/time support  enabled 
"Olson" Timezone Database Version  2010.3 
Timezone Database  internal 
Warning: phpinfo(): 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 D:\nobuneko\phpinfo.php on line 2

といわけで、php.iniを以下のように修正し、Apacheを再起動すればエラーは解消される。
<修正前>
;date.timezone =

<修正後>
date.timezone = Asia/Tokyo

今後は、以上については必ず設定するようにしよう。

PHPのエラーメッセージをエラーログ(テキストファイル)として出力したい場合は、php.iniファイルのerror_logでエラーログの出力場所(出力先)を設定すればよい。

(1)php.iniの現状設定を確認する。
(php.iniの保存先が分からない場合は、phpinfoで確認すること。)

php.iniファイルの一部(Windows版PHP5.2.0例)-----------------------
;   - Show all errors, except coding standards warnings
;
error_reporting  =  E_ALL

《略》

; Log errors to specified file.
;error_log = filename

; Log errors to syslog (Event Log on NT, not valid in Windows 95).
;error_log = syslog
------------------------------------------------------------------
※「error_reporting」でエラーが表示される設定になっていることを確認する。
※「error_log」の設定が有効でない場合はログが出力されていない。この設定の時、phpinfoで確認するとerror_logはno valueとなっている。

(2)php.iniの設定を変更する。

例えば、「;error_log = syslog」の記述の直後あたりに
error_log = "D:\phplog\error.log"
と追記し、Apacheを再起動すれば、Dドライブのphplogフォルダにログが出力されるようになる。
※phpinfoで確認してerror_logが指定したフォルダ名(例ではphplog)となっていることを確認する。
※「D:\phplog\error.log」の「phplog」というフォルダ、「error.log」というファイル名は私が適当に作成したでフォルダ名、ファイル名は任意に指定可能。

Apacheを使用することが前提だが、PHPのinclude_pathをphp.iniではなく、.htaccessファイルで指定することも可能。

.htaccess内に「php_value include_path」を記述すればよい。

《例》
php_value include_path ".:/var/www/nobuneko/httpdocs/abc/php/include"

※上記例の場合、「/var/www/nobuneko/httpdocs/abc/php/include」内にインクルードさせたいファイルを設置する。

Linuxのコンソール、Windowsのコマンドプロンプト等でコマンドラインでPHPを実行するには、以下のようにする。

<Linux>
/usr/bin/php -r '実行したいPHPのプログラムコード'

<Windows>
php -r "実行したいPHPのプログラムコード"

※Windowsの場合、Linuxのように「実行したいPHPのプログラムコード」を'(シングルクォーテーション)で囲んで実行すると、
Parse error: parse error, unexpected $end in Command line code on line 1
といったエラーになってしまうので、"(ダブルクォーテーション)にする。

《例》
<Linux>
/usr/bin/php -r 'echo date("Y-m-d H:i:s");'

<Windows>
php -r "echo date('Y-m-d H:i:s');"

《結果》
コンソールまたはコマンドプロンプトの画面に上記コードの実行結果(例えば「2010-05-04 17:53:39」)が表示される。

また、上記例のように実行するPHPのプログラムコードが画面に文字等を出力するものであれば、「>」(大なり記号)を使用することで、任意の場所に出力結果をテキストファイルとして出力することもできる。

<Linux>
/usr/bin/php -r '実行したいPHPのプログラムコード' > 出力場所

<Windows>
php -r "実行したいPHPのプログラムコード" > 出力場所

《例》
<Linux>
/usr/bin/php -r 'echo date("Y-m-d H:i:s");' > /var/www/nobuneko/httpdocs/testdate.txt

<Windows>
php -r "echo date('Y-m-d H:i:s');" > D:/testdate.txt

《結果》
指定したディレクトリ(上記例ではLinuxなら「/var/www/nobuneko/httpdocs/」、WindowsならDドライブ直下)に上記コードの実行結果(例えば「2010-05-04 17:53:39」)を記述したテキストファイルtestdate.txtが出力される。

PHPの関数str_repeat()は、第1引数に文字列、第2引数に0以上の数値を指定して、第1引数の文字列を第2引数で指定した回数分繰り返すことができる。

《書式》
str_repeat(文字列,繰り返し数)

《例》
$str = "*";
echo str_repeat($str,"5");

とすれば、「******」が表示される。

ここで、誤って第2引数を指定せず、str_repeat($str)とすると、以下のエラーが表示される。

Warning: Wrong parameter count for str_repeat()
(r_nobu適当訳)str_repeat()に渡している引数の数に誤りがあります。

このエラーは、第2引数をきちんと指定してやると表示されなくなる。しかし、指定する値は0以上の値でないと別のエラーが表示される。例えば、試しに-1を指定すると以下のエラーが表示された。

Warning: str_repeat() [function.str-repeat]: Second argument has to be greater than or equal to 0.
(r_nobu適当訳)関数str-repeatの第2引数は0以上の値にする必要があります。

以下のようなエラーが表示されることがある。
Parse error: parse error, unexpected T_START_HEREDOC in C:\php\nobuneko\test.php on line 8
「T_START_HEREDOC」というのは、ヒアドキュメントの開始部分という意味なので、開始部分の記述に何らかの間違いがあることがこのエラーの原因。解決するには、ヒアドキュメントの開始部分の記述を正しく修正すればよい。

《間違いの例》
$nobuneko_txt <<<CAT
猫が大好きです。
野良猫を見つけると、立ち止まって眺めてしまいます。

CAT;

上記の例の場合、ヒアドキュメントに=(イコール)を付け忘れていたことが原因だった。

<誤>「$nobuneko_txt <<<CAT」

<正>「$nobuneko_txt =<<<CAT」

ヒアドキュメントの構文は以下の通り。

変数名 =<<<CAT
ここに文字列
CAT;

※「CAT」の部分は、同一のものであれば何でもよい(たぶん)。「CAT」としているのは、私が猫が好きだから、という理由なので、それ以上の意味はない。

ヒアドキュメントの詳細は、以下のサイトを参照。http://www.php.net/manual/ja/language.types.string.php#language.types.string.syntax.heredoc

以下のようなエラーが表示されることがある。
Warning: preg_match_all() [function.preg-match-all]: Unknown modifier 'a' in C:\php\nobuneko\test.php line 24
これは、関数「preg-match-all」で不明な修飾子「a」が使われている、という意味。関数preg-match-allで「修飾子」をつける場所といったら「/(スラッシュ)」の隣なので、「/(スラッシュ)」の記述箇所を探す。

《間違いの例》
$html_source =<<<CAT
<a href="noraneko.html">野良猫A</a><br />
飼い猫A<br />
飼い猫B<br />
<a href="noraneko2.html">野良猫B</a><br />
<a href="noraneko3.html">野良猫C</a><br />
<a href="noraneko4.html">野良猫D</a><br />
CAT;

$num = preg_match_all("/<a href=\"[^<]+\">.+?</a>/",$html_source,$array_match);
echo $num;
echo "<br>\n";
print_r($array_match);

上記の例の場合、正規表現の開始位置と終了位置を示す「/(スラッシュ)」の他に正規表現内に「/(スラッシュ)」がそのまま含まれていたことが原因だった。例の場合、</a>の「/(スラッシュ)」の直前にエスケープ文字「\」(Windowsだと半角の¥マーク、Linuxだとバックスラッシュ)を付けることで解決できる。

<誤>「$num = preg_match_all("/<a href=\"[^<]+\">.+?</a>/",$html_source,$array_match);」
<正>「$num = preg_match_all("/<a href=\"[^<]+\">.+?<\/a>/",$html_source,$array_match);」

preg_match_allの構文は、以下の通り。
preg_match_all(パターン文字列,検索対象の文字列,結果を格納する配列)
・パターン文字列→正規表現でマッチさせたい文字列のパターンを記述する
・検索対象の文字列→HTMLソース、テキストソースなど、検索対象となるソースを指定する(ereg系の関数と違って、「/(スラッシュ)」で正規表現全体を囲む必要があるので注意)
・結果を格納する配列→検索対象の文字列の中でパターン文字列にマッチした文字列を格納する配列
※preg_match_all(パターン文字列,検索対象の文字列,結果を格納する配列)の戻り値(返り値)は、パターンマッチした数となる。

《正しい例》HTMLソースの中のリンクをHTMLタグ付で取得することを想定。
$html_source =<<<CAT
<a href="noraneko.html">野良猫A</a><br />
飼い猫A<br />
飼い猫B<br />
<a href="noraneko2.html">野良猫B</a><br />
<a href="noraneko3.html">野良猫C</a><br />
<a href="noraneko4.html">野良猫D</a><br />
CAT;

$num = preg_match_all("/<a href=\"[^<]+\">.+?<\/a>/",$html_source,$array_match);
echo $num;
echo "<br>\n";
print_r($array_match);

《上記の例の実行結果》
4<br>
Array
(
    [0] => Array
        (
            [0] => <a href="noraneko.html">野良猫A</a>
            [1] => <a href="noraneko2.html">野良猫B</a>
            [2] => <a href="noraneko3.html">野良猫C</a>
            [3] => <a href="noraneko4.html">野良猫D</a>
        )

)

PHPで文字列のエンコーディングを変更しようと思ってmb_convert_encoding関数を使用したら、以下のえらーが表示された。

Fatal error: Call to undefined function mb_convert_encoding() in C:\php\nobuneko\test.php on line 18

「mb_convert_encoding」のスペルミスはないということを確認した上で、phpinfoを確認してみると、「mbstring」の項目が一切表示されなかった。

これは、PHPの設定の問題だなぁ、と思ってphp.iniを見てみたら、以下のようになっていた。

;extension=php_mbstring.dll

今、PHPを動作させているOSがWindows XPのマシン(=この記事を書いているマシンと同じ(笑))だったので、mbstringを有効化するには、「;extension=php_mbstring.dll」ではダメだ。

;extension=php_mbstring.dll

extension=php_mbstring.dll

というように「;」を削除して、Apacheを再起動すればOKのはず・・・あれ?改善せず。

まさか、と思って「extension_dir」で指定しているフォルダ(phpinfoで確認可能)を見てみたら、そのフォルダの中にはphp_gd2.dllしかなかった。何でだろう?このXPマシンにPHPをインストールしたのは随分前だったが、その時にどんなインストールしたんだろう?という疑問もあったが、とりあえず、今日のところは、インターネットでphp_mbstring.dllを入手してextension_dirフォルダに入れてApacheを再起動してみると・・・うまくいった!

mb_convert_encoding関数を使用する時に以下のようなエラーが出ることがある。

エラーメッセージ:
「Notice: Array to string conversion in C:\php\nobuneko\test.php on line 23」

上記のエラーを読むと、「Array(配列)を文字変換(?)しようとしている」という意味のように思えたので、あっと気づく。

《私が書いたPHPのコード》
$neko_test = mb_convert_encoding($neko_test,"UTF-8","SJIS");

一見、このPHPのコードには何も問題がないように見えたが、mb_convert_encoding関数に渡している引数「$neko_test」は単なる文字列ではなく、配列(Array)だということを思い出した。

mb_convert_encoding関数には配列を引数として渡すことはできないのにもかかわらず、私は配列を渡していたようだ。このことに気づくと、後の修正はあっと言う間だった。

単純なミスだが、今後も起きるかもしれないので、注意したいと思う。

session_start()関数を使用する時、
PHP Warning:  session_start(): Cannot send session cookie - headers already sent in /nobuneko/test.php on line 5
といったエラーが出力される場合がある。
session_start()関数よりも前にPHPで何かを出力している場合に上記のようなエラーが出る。
session_start()よりも前にPHPで改行コード、HTMLタグ等を出力してるのであれば、それらを削除すれば解決することがある。

全く同一のプログラムファイルを使用しているはずなのに、プログラムを動作させる環境が異なるだけで上記のエラーメッセージが出るなど、どうしても原因が分からない場合、とりあえずエラーメッセージを削除したいだけであれば、session_start()関数の左に@マークを付けるとエラーメッセージを出さないようにすることはできる。

session_start();

@session_start();
この方法は根本的な問題解決にはならないかもしれないが・・・。

Linux(CentOS 5.x)、PHP 5.1.6の環境において、PHP 拡張モジュールImagickをインストールする時にエラーとなってインストールが失敗することがある。その1つの例がPECLのバグだ。(今のところ、2つ目の例はまだ知らない・・・。)

まずは、「ImageMagick」、「ImageMagick-devel」をyumでインストールする。

[root@nobuneko lib]# yum install ImageMagick
[root@nobuneko lib]# yum install ImageMagick-devel

ここまでは順調。しかし、次で失敗。

[root@nobuneko lib]# pecl install imagick
downloading imagick-3.0.0.tgz ...
Starting to download imagick-3.0.0.tgz (93,488 bytes)
.....................done: 93,488 bytes
13 source files, building
running: phpize
Configuring for:
PHP Api Version:         20041225
Zend Module Api No:      20050922
Zend Extension Api No:   220051025
Please provide the prefix of Imagemagick installation [autodetect] :
building in /var/tmp/pear-build-root/imagick-3.0.0
running: /tmp/tmp1SodBd/imagick-3.0.0/configure --with-imagick
checking for egrep... grep -E
checking for a sed that does not truncate output... /bin/sed
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking whether gcc and cc understand -c and -o together... yes
checking if compiler supports -R... no
checking if compiler supports -Wl,-rpath,... yes
checking build system type... x86_64-redhat-linux-gnu
checking host system type... x86_64-redhat-linux-gnu
checking target system type... x86_64-redhat-linux-gnu
checking for PHP prefix... /usr
checking for PHP includes... -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext
checking for PHP extension directory... /usr/lib64/php/modules
checking for PHP installed headers prefix... /usr/include/php
checking for re2c... no
configure: WARNING: You will need re2c 0.9.11 or later if you want to regenerate PHP parsers.
checking for gawk... gawk
checking whether to enable the imagick extension... yes, shared
checking whether to enable the imagick GraphicsMagick backend... no
checking ImageMagick MagickWand API configuration program... found in /usr/bin/Wand-config
checking if ImageMagick version is at least 6.2.4... found version 6.2.8
checking for magick-wand.h header file... found in /usr/include/wand/magick-wand.h
checking PHP version is at least 5.1.3... /tmp/tmp1SodBd/imagick-3.0.0/configure: line 3339: test: Usage: /usr/bin/php-config [--prefix|--includes|--ldflags|--libs|--extension-dir|--include-dir|--php-binary|--version]: integer expression expected
configure: error: no. found 5.1.6
ERROR: `/tmp/tmp1SodBd/imagick-3.0.0/configure --with-imagick' failed
You have mail in /var/spool/mail/root

さて、どうしようかなぁ、と思ってWebで探していたら、以下のページを発見。

http://pecl.php.net/bugs/bug.php?id=18057
[2010-08-12 14:46 UTC] mkoppanen at php dot net
This bug has been fixed in SVN.

In case this was a documentation problem, the fix will show up at the
end of next Sunday (CET) on pecl.php.net.

In case this was a pecl.php.net website problem, the change will show
up on the website in short time.
 
Thank you for the report, and for helping us make PECL better.

This bug has been fixed in svn already. There hasn't been a release yet
but there will be one soonish.

どうやらPECLのバグのようだ。・・・そうですか。
とりあえず、上記のページの続きを読んでみる。

[2010-08-31 00:55 UTC] tharmor at gmail dot com
Any idea when CentOS 5.5 will see this bug fix in stable?
[2010-09-16 14:09 UTC] joris at timdm dot nl
Thank you for fixing the bug, but is there a workaround for?

r_nobu適当訳「バグを直してくれてありがとう、ところで、回避策ってない?」

《略》
The simplest workaround is to edit /usr/bin/php-config, find the
following lines:

--version)
        echo $version;;


And add two more lines after them:

--vernum)
        echo "50106";;

If that doesn't work, increase the "version number" of PHP until it does
:)

《r_nobu適当訳》
一番簡単な回避策は、/usr/bin/php-config(というファイル)を編集することだよ。

--version)
        echo $version;;

って書いている行を見つけて、この行のすぐ下に次の2行を追記する。

--vernum)
        echo "50106";;

もし、これでうまく動かない場合は、うまく動くようになるまで、PHPの「version number」(vernumのことだろう)の値を大きくしていけばよい(この何かいい加減な感じのアドバイスにちょっと笑ってしまった)。

私は、この「回避策」を使わせてもらうことにした。
おかげさまで、うまくいった!

[root@nobuneko bin]# pecl install imagick
downloading imagick-3.0.0.tgz ...
Starting to download imagick-3.0.0.tgz (93,488 bytes)
.....................done: 93,488 bytes
13 source files, building
running: phpize
Configuring for:
PHP Api Version:         20041225
Zend Module Api No:      20050922
Zend Extension Api No:   220051025
Please provide the prefix of Imagemagick installation [autodetect] :
building in /var/tmp/pear-build-root/imagick-3.0.0
running: /tmp/tmpoIotjA/imagick-3.0.0/configure --with-imagick
checking for egrep... grep -E
checking for a sed that does not truncate output... /bin/sed
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking whether gcc and cc understand -c and -o together... yes
checking if compiler supports -R... no
checking if compiler supports -Wl,-rpath,... yes
checking build system type... x86_64-redhat-linux-gnu
checking host system type... x86_64-redhat-linux-gnu
checking target system type... x86_64-redhat-linux-gnu
checking for PHP prefix... /usr
checking for PHP includes... -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext
checking for PHP extension directory... /usr/lib64/php/modules
checking for PHP installed headers prefix... /usr/include/php
checking for re2c... no
configure: WARNING: You will need re2c 0.9.11 or later if you want to regenerate PHP parsers.
checking for gawk... gawk
checking whether to enable the imagick extension... yes, shared
checking whether to enable the imagick GraphicsMagick backend... no
checking ImageMagick MagickWand API configuration program... found in /usr/bin/Wand-config
checking if ImageMagick version is at least 6.2.4... found version 6.2.8
checking for magick-wand.h header file... found in /usr/include/wand/magick-wand.h
checking PHP version is at least 5.1.3... yes. found 5.1.6
checking for ld used by gcc... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking for /usr/bin/ld option to reload object files... -r
checking for BSD-compatible nm... /usr/bin/nm -B
checking whether ln -s works... yes
checking how to recognise dependent libraries... pass_all
checking how to run the C preprocessor... gcc -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking dlfcn.h usability... yes
checking dlfcn.h presence... yes
checking for dlfcn.h... yes
checking for g++... g++
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking how to run the C++ preprocessor... g++ -E
checking for g77... no
checking for f77... no
checking for xlf... no
checking for frt... no
checking for pgf77... no
checking for fort77... no
checking for fl32... no
checking for af77... no
checking for f90... no
checking for xlf90... no
checking for pgf90... no
checking for epcf90... no
checking for f95... no
checking for fort... no
checking for xlf95... no
checking for ifc... no
checking for efc... no
checking for pgf95... no
checking for lf95... no
checking for gfortran... no
checking whether we are using the GNU Fortran 77 compiler... no
checking whether  accepts -g... no
checking the maximum length of command line arguments... 32768
checking command to parse /usr/bin/nm -B output from gcc object... ok
checking for objdir... .libs
checking for ar... ar
checking for ranlib... ranlib
checking for strip... strip
checking if gcc supports -fno-rtti -fno-exceptions... no
checking for gcc option to produce PIC... -fPIC
checking if gcc PIC flag -fPIC works... yes
checking if gcc static flag -static works... yes
checking if gcc supports -c -o file.o... yes
checking whether the gcc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes
checking whether -lc should be explicitly linked in... no
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... no
configure: creating libtool
appending configuration tag "CXX" to libtool
checking for ld used by g++... /usr/bin/ld -m elf_x86_64
checking if the linker (/usr/bin/ld -m elf_x86_64) is GNU ld... yes
checking whether the g++ linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes
checking for g++ option to produce PIC... -fPIC
checking if g++ PIC flag -fPIC works... yes
checking if g++ static flag -static works... yes
checking if g++ supports -c -o file.o... yes
checking whether the g++ linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
appending configuration tag "F77" to libtool
configure: creating ./config.status
config.status: creating config.h
running: make
/bin/sh /var/tmp/pear-build-root/imagick-3.0.0/libtool --mode=compile gcc  -I. -I/tmp/tmpoIotjA/imagick-3.0.0 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/imagick-3.0.0/include -I/var/tmp/pear-build-root/imagick-3.0.0/main -I/tmp/tmpoIotjA/imagick-3.0.0 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext  -DHAVE_CONFIG_H  -g -O2   -c /tmp/tmpoIotjA/imagick-3.0.0/imagick_class.c -o imagick_class.lo
mkdir .libs
 gcc -I. -I/tmp/tmpoIotjA/imagick-3.0.0 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/imagick-3.0.0/include -I/var/tmp/pear-build-root/imagick-3.0.0/main -I/tmp/tmpoIotjA/imagick-3.0.0 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -DHAVE_CONFIG_H -g -O2 -c /tmp/tmpoIotjA/imagick-3.0.0/imagick_class.c  -fPIC -DPIC -o .libs/imagick_class.o
/bin/sh /var/tmp/pear-build-root/imagick-3.0.0/libtool --mode=compile gcc  -I. -I/tmp/tmpoIotjA/imagick-3.0.0 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/imagick-3.0.0/include -I/var/tmp/pear-build-root/imagick-3.0.0/main -I/tmp/tmpoIotjA/imagick-3.0.0 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext  -DHAVE_CONFIG_H  -g -O2   -c /tmp/tmpoIotjA/imagick-3.0.0/imagickdraw_class.c -o imagickdraw_class.lo
 gcc -I. -I/tmp/tmpoIotjA/imagick-3.0.0 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/imagick-3.0.0/include -I/var/tmp/pear-build-root/imagick-3.0.0/main -I/tmp/tmpoIotjA/imagick-3.0.0 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -DHAVE_CONFIG_H -g -O2 -c /tmp/tmpoIotjA/imagick-3.0.0/imagickdraw_class.c  -fPIC -DPIC -o .libs/imagickdraw_class.o
/bin/sh /var/tmp/pear-build-root/imagick-3.0.0/libtool --mode=compile gcc  -I. -I/tmp/tmpoIotjA/imagick-3.0.0 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/imagick-3.0.0/include -I/var/tmp/pear-build-root/imagick-3.0.0/main -I/tmp/tmpoIotjA/imagick-3.0.0 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext  -DHAVE_CONFIG_H  -g -O2   -c /tmp/tmpoIotjA/imagick-3.0.0/imagickpixel_class.c -o imagickpixel_class.lo
 gcc -I. -I/tmp/tmpoIotjA/imagick-3.0.0 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/imagick-3.0.0/include -I/var/tmp/pear-build-root/imagick-3.0.0/main -I/tmp/tmpoIotjA/imagick-3.0.0 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -DHAVE_CONFIG_H -g -O2 -c /tmp/tmpoIotjA/imagick-3.0.0/imagickpixel_class.c  -fPIC -DPIC -o .libs/imagickpixel_class.o
/bin/sh /var/tmp/pear-build-root/imagick-3.0.0/libtool --mode=compile gcc  -I. -I/tmp/tmpoIotjA/imagick-3.0.0 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/imagick-3.0.0/include -I/var/tmp/pear-build-root/imagick-3.0.0/main -I/tmp/tmpoIotjA/imagick-3.0.0 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext  -DHAVE_CONFIG_H  -g -O2   -c /tmp/tmpoIotjA/imagick-3.0.0/imagickpixeliterator_class.c -o imagickpixeliterator_class.lo
 gcc -I. -I/tmp/tmpoIotjA/imagick-3.0.0 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/imagick-3.0.0/include -I/var/tmp/pear-build-root/imagick-3.0.0/main -I/tmp/tmpoIotjA/imagick-3.0.0 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -DHAVE_CONFIG_H -g -O2 -c /tmp/tmpoIotjA/imagick-3.0.0/imagickpixeliterator_class.c  -fPIC -DPIC -o .libs/imagickpixeliterator_class.o
/bin/sh /var/tmp/pear-build-root/imagick-3.0.0/libtool --mode=compile gcc  -I. -I/tmp/tmpoIotjA/imagick-3.0.0 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/imagick-3.0.0/include -I/var/tmp/pear-build-root/imagick-3.0.0/main -I/tmp/tmpoIotjA/imagick-3.0.0 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext  -DHAVE_CONFIG_H  -g -O2   -c /tmp/tmpoIotjA/imagick-3.0.0/imagick_helpers.c -o imagick_helpers.lo
 gcc -I. -I/tmp/tmpoIotjA/imagick-3.0.0 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/imagick-3.0.0/include -I/var/tmp/pear-build-root/imagick-3.0.0/main -I/tmp/tmpoIotjA/imagick-3.0.0 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -DHAVE_CONFIG_H -g -O2 -c /tmp/tmpoIotjA/imagick-3.0.0/imagick_helpers.c  -fPIC -DPIC -o .libs/imagick_helpers.o
/tmp/tmpoIotjA/imagick-3.0.0/imagick_helpers.c: In function 'php_imagick_validate_map':
/tmp/tmpoIotjA/imagick-3.0.0/imagick_helpers.c:227: warning: initialization discards qualifiers from pointer target type
/bin/sh /var/tmp/pear-build-root/imagick-3.0.0/libtool --mode=compile gcc  -I. -I/tmp/tmpoIotjA/imagick-3.0.0 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/imagick-3.0.0/include -I/var/tmp/pear-build-root/imagick-3.0.0/main -I/tmp/tmpoIotjA/imagick-3.0.0 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext  -DHAVE_CONFIG_H  -g -O2   -c /tmp/tmpoIotjA/imagick-3.0.0/imagick_read.c -o imagick_read.lo
 gcc -I. -I/tmp/tmpoIotjA/imagick-3.0.0 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/imagick-3.0.0/include -I/var/tmp/pear-build-root/imagick-3.0.0/main -I/tmp/tmpoIotjA/imagick-3.0.0 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -DHAVE_CONFIG_H -g -O2 -c /tmp/tmpoIotjA/imagick-3.0.0/imagick_read.c  -fPIC -DPIC -o .libs/imagick_read.o
/bin/sh /var/tmp/pear-build-root/imagick-3.0.0/libtool --mode=compile gcc  -I. -I/tmp/tmpoIotjA/imagick-3.0.0 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/imagick-3.0.0/include -I/var/tmp/pear-build-root/imagick-3.0.0/main -I/tmp/tmpoIotjA/imagick-3.0.0 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext  -DHAVE_CONFIG_H  -g -O2   -c /tmp/tmpoIotjA/imagick-3.0.0/imagick.c -o imagick.lo
 gcc -I. -I/tmp/tmpoIotjA/imagick-3.0.0 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/imagick-3.0.0/include -I/var/tmp/pear-build-root/imagick-3.0.0/main -I/tmp/tmpoIotjA/imagick-3.0.0 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -DHAVE_CONFIG_H -g -O2 -c /tmp/tmpoIotjA/imagick-3.0.0/imagick.c  -fPIC -DPIC -o .libs/imagick.o
/bin/sh /var/tmp/pear-build-root/imagick-3.0.0/libtool --mode=link gcc -DPHP_ATOM_INC -I/var/tmp/pear-build-root/imagick-3.0.0/include -I/var/tmp/pear-build-root/imagick-3.0.0/main -I/tmp/tmpoIotjA/imagick-3.0.0 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext  -DHAVE_CONFIG_H  -g -O2   -o imagick.la -export-dynamic -avoid-version -prefer-pic -module -rpath /var/tmp/pear-build-root/imagick-3.0.0/modules  imagick_class.lo imagickdraw_class.lo imagickpixel_class.lo imagickpixeliterator_class.lo imagick_helpers.lo imagick_read.lo imagick.lo -lWand -lMagick
gcc -shared  .libs/imagick_class.o .libs/imagickdraw_class.o .libs/imagickpixel_class.o .libs/imagickpixeliterator_class.o .libs/imagick_helpers.o .libs/imagick_read.o .libs/imagick.o  -lWand -lMagick  -Wl,-soname -Wl,imagick.so -o .libs/imagick.so
creating imagick.la
(cd .libs && rm -f imagick.la && ln -s ../imagick.la imagick.la)
/bin/sh /var/tmp/pear-build-root/imagick-3.0.0/libtool --mode=install cp ./imagick.la /var/tmp/pear-build-root/imagick-3.0.0/modules
cp ./.libs/imagick.so /var/tmp/pear-build-root/imagick-3.0.0/modules/imagick.so
cp ./.libs/imagick.lai /var/tmp/pear-build-root/imagick-3.0.0/modules/imagick.la
PATH="$PATH:/sbin" ldconfig -n /var/tmp/pear-build-root/imagick-3.0.0/modules
----------------------------------------------------------------------
Libraries have been installed in:
   /var/tmp/pear-build-root/imagick-3.0.0/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

Build complete.
(It is safe to ignore warnings about tempnam and tmpnam).

running: make INSTALL_ROOT="/var/tmp/pear-build-root/install-imagick-3.0.0" install
Installing shared extensions:     /var/tmp/pear-build-root/install-imagick-3.0.0/usr/lib64/php/modules/
Installing header files:          /var/tmp/pear-build-root/install-imagick-3.0.0/usr/include/php/
running: find "/var/tmp/pear-build-root/install-imagick-3.0.0" -ls
112427559    4 drwxr-xr-x   3 root     root         4096 10月  8 23:29 /var/tmp/pear-build-root/install-imagick-3.0.0
112427592    4 drwxr-xr-x   4 root     root         4096 10月  8 23:29 /var/tmp/pear-build-root/install-imagick-3.0.0/usr
112427593    4 drwxr-xr-x   3 root     root         4096 10月  8 23:29 /var/tmp/pear-build-root/install-imagick-3.0.0/usr/lib64
112427594    4 drwxr-xr-x   3 root     root         4096 10月  8 23:29 /var/tmp/pear-build-root/install-imagick-3.0.0/usr/lib64/php
112427595    4 drwxr-xr-x   2 root     root         4096 10月  8 23:29 /var/tmp/pear-build-root/install-imagick-3.0.0/usr/lib64/php/modules
112427591  920 -rwxr-xr-x   1 root     root       934261 10月  8 23:29 /var/tmp/pear-build-root/install-imagick-3.0.0/usr/lib64/php/modules/imagick.so
112427596    4 drwxr-xr-x   3 root     root         4096 10月  8 23:29 /var/tmp/pear-build-root/install-imagick-3.0.0/usr/include
112427597    4 drwxr-xr-x   3 root     root         4096 10月  8 23:29 /var/tmp/pear-build-root/install-imagick-3.0.0/usr/include/php
112427598    4 drwxr-xr-x   3 root     root         4096 10月  8 23:29 /var/tmp/pear-build-root/install-imagick-3.0.0/usr/include/php/ext
112427599    4 drwxr-xr-x   2 root     root         4096 10月  8 23:29 /var/tmp/pear-build-root/install-imagick-3.0.0/usr/include/php/ext/imagick
112427601   28 -rw-r--r--   1 root     root        26690 10月  8 23:29 /var/tmp/pear-build-root/install-imagick-3.0.0/usr/include/php/ext/imagick/php_imagick_defs.h
112427600    4 -rw-r--r--   1 root     root         2476 10月  8 23:29 /var/tmp/pear-build-root/install-imagick-3.0.0/usr/include/php/ext/imagick/php_imagick.h
112427602    4 -rw-r--r--   1 root     root         1828 10月  8 23:29 /var/tmp/pear-build-root/install-imagick-3.0.0/usr/include/php/ext/imagick/php_imagick_shared.h

Build process completed successfully
Installing '/var/tmp/pear-build-root/install-imagick-3.0.0//usr/lib64/php/modules/imagick.so'
Installing '/var/tmp/pear-build-root/install-imagick-3.0.0//usr/include/php/ext/imagick/php_imagick_defs.h'
Installing '/var/tmp/pear-build-root/install-imagick-3.0.0//usr/include/php/ext/imagick/php_imagick.h'
Installing '/var/tmp/pear-build-root/install-imagick-3.0.0//usr/include/php/ext/imagick/php_imagick_shared.h'
install ok: channel://pecl.php.net/imagick-3.0.0
You should add "extension=imagick.so" to php.ini

php.iniに「extension=imagick.so」を追記しなさい、と指示されたので、そうしておく。

[root@nobuneko bin]# ls -ahl /usr/lib64/php/modules/
合計 3.6M
drwxr-xr-x 2 root root 4.0K 10月  8 23:29 .
drwxr-xr-x 5 root root 4.0K  3月 31  2010 ..
-rwxr-xr-x 1 root root  32K  3月 31  2010 dbase.so
-rwxr-xr-x 1 root root 151K  3月 31  2010 dom.so
-rwxr-xr-x 1 root root 330K  3月 31  2010 gd.so
-rwxr-xr-x 1 root root 913K 10月  8 23:54 imagick.so
-rwxr-xr-x 1 root root 1.8M  3月 31  2010 mbstring.so
-rwxr-xr-x 1 root root  91K  3月 31  2010 pdo.so
-rwxr-xr-x 1 root root  28K  3月 31  2010 pdo_pgsql.so
-rwxr-xr-x 1 root root  24K  3月 31  2010 pdo_sqlite.so
-rwxr-xr-x 1 root root 100K  3月 31  2010 pgsql.so
-rwxr-xr-x 1 root root  16K  1月 20  2010 phpcups.so
-rwxr-xr-x 1 root root  26K  3月 31  2010 xmlreader.so
-rwxr-xr-x 1 root root  38K  3月 31  2010 xmlwriter.so
-rwxr-xr-x 1 root root  28K  3月 31  2010 xsl.so

/usr/lib64/php/modules/配下に「imagick.so」というファイルが作成されたことを確認。

[root@nobuneko bin]# /etc/rc.d/init.d/httpd restart
Apacheを再起動。

phpinfoを見ると「imagick」が追記されていることを確認。(以下はphpinfoで確認した設定。)
imagick
imagick module enabled
imagick module version  3.0.0 
imagick classes  Imagick, ImagickDraw, ImagickPixel, ImagickPixelIterator 
ImageMagick version  ImageMagick 6.2.8 08/25/10 Q16 file:/usr/share/ImageMagick-6.2.8/doc/index.html 
ImageMagick copyright  Copyright (C) 1999-2006 ImageMagick Studio LLC 
ImageMagick release date  08/25/10 
ImageMagick number of supported formats:  153 
ImageMagick supported formats  A, ART, AVI, AVS, B, BMP, BMP2, BMP3, C, CACHE, CAPTION, CIN, CIP, CLIP, CMYK, CMYKA, CUR, CUT, DCM, DCX, DNG, DOT, DPS, DPX, EPDF, EPI, EPS, EPS2, EPS3, EPSF, EPSI, EPT, EPT2, EPT3, FAX, FITS, FRACTAL, G, G3, GIF, GIF87, GRADIENT, GRAY, HISTOGRAM, HTM, HTML, ICB, ICO, ICON, INFO, JNG, JPEG, JPG, K, LABEL, M, M2V, MAP, MAT, MATTE, MIFF, MNG, MONO, MPC, MPEG, MPG, MSL, MTV, MVG, NULL, O, OTB, OTF, P7, PAL, PALM, PAM, PATTERN, PBM, PCD, PCDS, PCL, PCT, PCX, PDB, PDF, PFA, PFB, PGM, PICON, PICT, PIX, PJPEG, PLASMA, PNG, PNG24, PNG32, PNG8, PNM, PPM, PREVIEW, PS, PS2, PS3, PSD, PTIF, PWP, R, RAS, RGB, RGBA, RGBO, RLA, RLE, SCR, SCT, SFW, SGI, SHTML, STEGANO, SUN, SVG, SVGZ, TEXT, TGA, TIFF, TILE, TIM, TTC, TTF, TXT, UIL, UYVY, VDA, VICAR, VID, VIFF, VST, WBMP, WMF, WMZ, WPG, X, XBM, XC, XCF, XPM, XV, XWD, Y, YCbCr, YCbCrA, YUV 

Directive Local Value Master Value
imagick.locale_fix 0 0
imagick.progress_monitor 0 0

今後も同様のことが起きたら、きっと今回の回避策を使うのだろうなぁ。

PHPでCSVファイルを読み込む関数「fgetcsv()」を使用しようとして、

Warning: Wrong parameter count for fgetcsv() in /var/www/html/test.php on line 12

といったエラーが出た場合、このプログラムを実行している環境はPHP5ではなく、PHP4かもしれない。

《PHP4でエラーが出るプログラムのサンプル》
$csv = fopen("/var/www/html/test.csv", "r" );
$csv2 = fgetcsv($csv);
Warning: Wrong parameter count for fgetcsv() in /var/www/html/test.php on line 12

このプログラムは、PHP5の環境ではエラーとならない。PHP5ではfgetcsv()の第2引数は省略できるようになったからだ。

PHP4では省略すると、

Wrong parameter count for fgetcsv()

というエラーになる。

つまり、

$csv2 = fgetcsv($csv);

と第2引数を省略すると、PHP5ではエラーにならないが、PHP4ではエラーになるので、例えば、以下のようにきちんと第2引数を記述すれば問題は解決する。

$csv2 = fgetcsv($csv,1000);

※fgetcsv()の第2引数:CSVファイルの各行の最大の長さ(length)を指定する。

PHPでコーディングしている際、たまに

Parse error: syntax error, unexpected '[' in C:\nobuneko\test.php on line 51

といったエラーが出る。

《上記エラーが出るプログラム例》
$nobuneko = array();
$nobuneko[] = 'neko';
echo nobuneko[0];

《上記エラーが出ないプログラム例》
$nobuneko = array();
$nobuneko[] = 'neko';
echo $nobuneko[0];

…違いは、nobuneko[0]の左に「$」(ドル記号)があるかどうか。

今回の上記エラーの原因は、$のつけ忘れだった。PHPの変数には「$」(ドル記号)を付けなければならない。もちろん、配列変数にも変数名の左に$をつけなければならない。

$をつければ、上記エラーは解消できる。

誤 echo nobuneko[0];
正 echo $nobuneko[0];

PHPでeregi()関数を使用していて、以下のようなエラーメッセージが表示される時がある。

Warning: eregi() [function.eregi]: REG_EMPTY in D:\nobuneko\test.php on line 5

このようなエラーが出る場合、eregiの第1引数に渡している値が空の可能性がある。

《エラーとなるプログラム例》
$str = "";
$str2 = "nekodaisuki";

if(eregi($str,$str2)){
    echo "neko";
}
else {
    echo "koneko";
}
→「Warning: eregi() [function.eregi]: REG_EMPTY」エラーの他、「koneko」と表示される。

※上記のプログラム例では、eregiの第1引数「$str」が空であるため、「Warning: eregi() [function.eregi]: REG_EMPTY」というエラーが出てしまう。

本来、eregi()関数は、

eregi(正規表現,検査対象の文字列)

として、検査対象の文字列を正規表現検索させた結果(trueまたはfalse)を得る目的で使用すると思われるので、eregi()関数の第1引数が空となるのは問題だ、ということなのだろう。

《エラーとならないプログラム例》
$str = "neko.*";
$str2 = "nekodaisuki";

if(eregi($str,$str2)){
    echo "neko";
}
else {
    echo "koneko";
}
→「neko」と表示される。

PHPで除算(割り算)をする時に、

Warning: Division by zero in /var/www/html/test.php on line 151

といったエラーが発生することがある。

《エラーが起きるプログラム例》
$num_a = 100;
$num_b = 0;
$num = $num_a/$num_b;

上記の例の場合、100を0(ゼロ)で割ろうとしているため、そんなことはできない、というエラー。

警告メッセージにも「Division by zero(ゼロ除算)」と記述されているので、このエラーが出た場合、どうしたらエラーが解決するかはすぐに分かる。

割り算においては、割る数を0(ゼロ)にするとエラーになるので、0(ゼロ)で割る処理が発生しないプログラムにすればよい。

もちろん、何故「割る数」(上記例では$num_b)が0(ゼロ)になるんだろう、というところで少し悩むことがあるかもしれないが、その原因は自力で何とか見つけ出すしかない。

PHPでGDライブラリを使うために、まずはPHPのサイトを見てみたら、以下の記述があった。

GDライブラリ( » http://www.libgd.org/で取得可能)があれば、画像の作成と操作を行なうこともできます。

(参照サイト:http://www.php.net/manual/ja/image.requirements.php

そこで、GDライブラリの提供元(www.libgd.org)からダウンロードしようとしたのだけれど、このサイトに全く接続できないので困った。

Googleで調べると、GDライブラリは現在はwww.libgd.orgで提供されているが、以前はwww.boutell.com/gd/で提供されていたことが分かった。

そこで、以前のGDライブラリ提供元(http://www.boutell.com/gd/)を訪れてみると、以下のメッセージが記述されていた。

GD has moved... and right now the site is down
The GD library has moved to libgd.org, but as of this writing that site is down. However you can obtain the latest gd source code, or that of any version, via the gd-libgd project on bitbucket.org where the source code repository lives. I will update this page when I receive notice that libgd.org is back up.

なるほど、GDは「boutell.com」から「libgd.org」に移転したが、今はそのサイトがダウンしているようなので「bitbucket.org」で最新のGDソースコードを取得できるということ、「libgd.org」が復活したら、このメッセージを更新する、ということが分かった。

以前の提供元サイトの親切心に感謝しながら、GDライブラリをダウンロードするために、早速、gd-libgd project on bitbucket.orgを訪問。

そして、ファイルをダウンロード!

しかし、ダウンロードはできたのだが、ダウンロードしたファイルを解凍してみると、その中には「configure」ファイルがなかった。

configureファイルがなくても使える方法があるのかどうかを調べたのだが、私には分からなかった。

惜しいなぁ、何か使える方法があるのだろうなぁ、と思いながらも、今の私には使い方が分からないのだから仕方がない。このファイルを使用することは諦めた。

configureファイルがなくても使用する方法が分かる人は、このファイルを使うとよいかもしれない。

さて、どうしてもGDライブラリをダウンロードしたかったので、探し方を変えることにした。

Wikipediaに何かヒントがあるかもしれない、と思ったのでWikipediaを見てみた。

http://en.wikipedia.org/wiki/GD_Graphics_Library

このWikipediaのページによると、「Stable release 2.0.35 / November 28, 2007」という記述があったので、2007年11月28日にリリースされたバージョン「2.0.35」(安定版)がGDライブラリの最新版かな、と推測。

そこで、Googleで「gd 2.0.35 download」というキーワードで検索すると、以下のサイトを見つけることができた。

http://sourceforge.jp/projects/sfnet_buluoos/downloads/0.1/src/gd-2.0.35.tar.bz2/

そして、このサイトから、GDライブラリをダウンロードできた。ダウンロードファイルの中にはconfigureファイルも含まれており、めでたくインストールにも成功した。

少し、気になるのが、上記ダウンロード元のサイトの下部に「BuluoOS、GNUのfreshmeat_linux/ Linux]操作」といった記述があること。

BuluoOS」って何だろう、と思って調べてみると、BuluoOS」とは、中国語版のLinuxのようだ、ということが分かった。

例えば、http://www.oschina.net/p/buluoosというサイトを見ると、このBuluoOS」にはX Window Systemも実装されており、GNOMEを中国語に翻訳したようなデザインのデスクトップを備えていることが分かる。

話がそれてきたが、ダウンロードしたGDライブラリをそのまま使ってよいのかどうかが、確信が持てなかった。つまり、BuluoOS」でPHP環境を構築する人は使っても問題ないのかもしれないが、それ以外の環境(CentOS、Vine Linux、Solaris等)で使用する場合も問題ないのかどうかが分からない。ファイルの中身がオリジナルと全く同じならよいのだが・・・。

2011年6月12日04:05追記(ここから)

1ヶ月ほど前の上記記事(2011年5月8日08:47)でインストールしたこの「BuluoOS」のgd-2.0.35.tar.bz2では、imagecopyresampled関数使用時にエラーが出ることが分かった。imagecopyresampled関数を使用した際に、以下のようなエラーがApacheのエラーログに記録された。

PHP Warning:  imagecopyresampled(): supplied argument is not a valid Image resource in /nobuneko/test.php on line 168, referer: http://nobuneko.com/testpage.html
gd-jpeg: JPEG library reports unrecoverable error: Wrong JPEG library version: library is 80, caller expects 62

このエラーログによると、「Wrong JPEG library version: library is 80, caller expects 62」とあるので、これは適当に訳すと「JPEGライブラリのバージョンに問題あり!ライブラリはバージョンが80なのに、ライブラリの呼び出し元は、バージョン62だと思っているよ。」ということのようだ。

エラーメッセージに従って、JPEGライブラリ(libjpeg)のバージョンを落とせばいいのだろうか。JPEGライブラリは、提供元サイト(http://www.ijg.org/)から最新版(8c)となるjpegsrc.v8c.tar.gzをダウンロードしてインストールしているのだが、これをダウングレードするのは面倒だな、と思った。

そこで、提供元サイト以外から入手したGDライブラリをアンインストールし、旧提供元サイト(www.boutell.com/gd/)が教えてくれた現在の臨時(?)のライブラリ提供元サイト(https://bitbucket.org/pierrejoye/gd-libgd/downloads)を再訪し、同サイトより「GD_2_0_33」をダウンロードしてインストールしたところ、このエラーを解決できた。

上記のJPEGライブラリのエラーについては、GDライブラリのインストールファイルとして、「BuluoOS」のgd-2.0.35.tar.bz2を使用したことが原因なのか、それとも正式な提供元から入手できる最新バージョン2.0.35でインストールしても発生する問題なのかの切り分けはできていない。正式な提供元から最新バージョン2.0.35を入手できれば、それも分かるのだろうけれど、まだ正式な提供元は復活していないし、臨時(?)のサイトから入手できるGDライブラリの最新版は、2.0.35ではなく、2.0.33のようだ。

2011年6月12日04:05追記(ここまで)

というわけで、早くGDライブラリの提供元(www.libgd.org)サイトが復活してくれることを願うことにしたい。

いつから、サイトはダウンしているのだろう。私が初めて訪れた1週間前からダウンしているようだが、今もダウンしている。PHPユーザは多いはずなので、そんなに長いことサイトがダウンしている状態が続くとは思いたくないが・・・。

サイトが復活したら、すぐにインストールをやり直したい。

PHPのバージョンをLinuxコンソールで確認したい場合、Linuxコンソールで

php -v

を実行すれば確認できる。

《PHPバージョンが4.3.9だった時の例》
[root@nobuneko]# php -v
PHP 4.3.9 (cgi) (built: Sep 20 2007 19:31:11)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies

《PHPバージョンが5.1.6だった時の例》
[root@nobuneko1]# php -v
PHP 5.1.6 (cli) (built: Nov 29 2010 16:47:46)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies

《PHPバージョンが5.2.17だった時の例》
[root@nobuneko2]# php -v
PHP 5.2.17 (cli) (built: May 24 2011 22:07:52)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies

もし、phpのパスが通っていなくてphp -vで実行した時に「command not found」となる場合は、phpのフルパスを指定して実行すればよい。

《例》phpのフルパスが/usr/bin/phpの場合
/usr/bin/php -v

プログラムを設置しようとしているサーバで、どんなPHP関数が使用できるかを確認したい場合、

get_defined_functions()

という関数を使用すればよいかもしれない。

《get_defined_functions()で取得したPHPの関数一覧を画面に出力させるプログラム例》
<?php
print_r(get_defined_functions());
?>

《上記プログラムの実行結果》
Array
(
    [internal] => Array
        (
            [0] => zend_version
            [1] => func_num_args
            [2] => func_get_arg
            [3] => func_get_args
            [4] => strlen
            [5] => strcmp
            [6] => strncmp
            [7] => strcasecmp
            [8] => strncasecmp
            [9] => each
            [10] => error_reporting
            [11] => define
            [12] => defined
            [13] => get_class
            [14] => get_parent_class
            [15] => method_exists
            [16] => property_exists
            [17] => class_exists
            [18] => interface_exists
            [19] => function_exists
            [20] => get_included_files
            [21] => get_required_files
            [22] => is_subclass_of
            [23] => is_a
            [24] => get_class_vars
            [25] => get_object_vars
            [26] => get_class_methods
            [27] => trigger_error
            [28] => user_error
            [29] => set_error_handler
            [30] => restore_error_handler
            [31] => set_exception_handler
            [32] => restore_exception_handler
            [33] => get_declared_classes
            [34] => get_declared_interfaces
            [35] => get_defined_functions
            [36] => get_defined_vars
            [37] => create_function
            [38] => get_resource_type
            [39] => get_loaded_extensions
            [40] => extension_loaded
            [41] => get_extension_funcs
            [42] => get_defined_constants
            [43] => debug_backtrace
            [44] => debug_print_backtrace
            [45] => bcadd
            [46] => bcsub
            [47] => bcmul
            [48] => bcdiv
            [49] => bcmod
            [50] => bcpow
            [51] => bcsqrt
            [52] => bcscale
            [53] => bccomp
            [54] => bcpowmod
            [55] => jdtogregorian
            [56] => gregoriantojd
            [57] => jdtojulian
            [58] => juliantojd
            [59] => jdtojewish
            [60] => jewishtojd
            [61] => jdtofrench
            [62] => frenchtojd
            [63] => jddayofweek
            [64] => jdmonthname
            [65] => easter_date
            [66] => easter_days
            [67] => unixtojd
            [68] => jdtounix
            [69] => cal_to_jd
            [70] => cal_from_jd
            [71] => cal_days_in_month
            [72] => cal_info
            [73] => variant_set
            [74] => variant_add
            [75] => variant_cat
            [76] => variant_sub
            [77] => variant_mul
            [78] => variant_and
            [79] => variant_div
            [80] => variant_eqv
            [81] => variant_idiv
            [82] => variant_imp
            [83] => variant_mod
            [84] => variant_or
            [85] => variant_pow
            [86] => variant_xor
            [87] => variant_abs
            [88] => variant_fix
            [89] => variant_int
            [90] => variant_neg
            [91] => variant_not
            [92] => variant_round
            [93] => variant_cmp
            [94] => variant_date_to_timestamp
            [95] => variant_date_from_timestamp
            [96] => variant_get_type
            [97] => variant_set_type
            [98] => variant_cast
            [99] => com_create_guid
            [100] => com_event_sink
            [101] => com_print_typeinfo
            [102] => com_message_pump
            [103] => com_load_typelib
            [104] => com_get_active_object
            [105] => ctype_alnum
            [106] => ctype_alpha
            [107] => ctype_cntrl
            [108] => ctype_digit
            [109] => ctype_lower
            [110] => ctype_graph
            [111] => ctype_print
            [112] => ctype_punct
            [113] => ctype_space
            [114] => ctype_upper
            [115] => ctype_xdigit
            [116] => strtotime
            [117] => date
            [118] => idate
            [119] => gmdate
            [120] => mktime
            [121] => gmmktime
            [122] => checkdate
            [123] => strftime
            [124] => gmstrftime
            [125] => time
            [126] => localtime
            [127] => getdate
            [128] => date_create
            [129] => date_parse
            [130] => date_format
            [131] => date_modify
            [132] => date_timezone_get
            [133] => date_timezone_set
            [134] => date_offset_get
            [135] => date_time_set
            [136] => date_date_set
            [137] => date_isodate_set
            [138] => timezone_open
            [139] => timezone_name_get
            [140] => timezone_name_from_abbr
            [141] => timezone_offset_get
            [142] => timezone_transitions_get
            [143] => timezone_identifiers_list
            [144] => timezone_abbreviations_list
            [145] => date_default_timezone_set
            [146] => date_default_timezone_get
            [147] => date_sunrise
            [148] => date_sunset
            [149] => date_sun_info
            [150] => filter_input
            [151] => filter_var
            [152] => filter_input_array
            [153] => filter_var_array
            [154] => filter_list
            [155] => filter_has_var
            [156] => filter_id
            [157] => ftp_connect
            [158] => ftp_login
            [159] => ftp_pwd
            [160] => ftp_cdup
            [161] => ftp_chdir
            [162] => ftp_exec
            [163] => ftp_raw
            [164] => ftp_mkdir
            [165] => ftp_rmdir
            [166] => ftp_chmod
            [167] => ftp_alloc
            [168] => ftp_nlist
            [169] => ftp_rawlist
            [170] => ftp_systype
            [171] => ftp_pasv
            [172] => ftp_get
            [173] => ftp_fget
            [174] => ftp_put
            [175] => ftp_fput
            [176] => ftp_size
            [177] => ftp_mdtm
            [178] => ftp_rename
            [179] => ftp_delete
            [180] => ftp_site
            [181] => ftp_close
            [182] => ftp_set_option
            [183] => ftp_get_option
            [184] => ftp_nb_fget
            [185] => ftp_nb_get
            [186] => ftp_nb_continue
            [187] => ftp_nb_put
            [188] => ftp_nb_fput
            [189] => ftp_quit
            [190] => hash
            [191] => hash_file
            [192] => hash_hmac
            [193] => hash_hmac_file
            [194] => hash_init
            [195] => hash_update
            [196] => hash_update_stream
            [197] => hash_update_file
            [198] => hash_final
            [199] => hash_algos
            [200] => iconv
            [201] => ob_iconv_handler
            [202] => iconv_get_encoding
            [203] => iconv_set_encoding
            [204] => iconv_strlen
            [205] => iconv_substr
            [206] => iconv_strpos
            [207] => iconv_strrpos
            [208] => iconv_mime_encode
            [209] => iconv_mime_decode
            [210] => iconv_mime_decode_headers
            [211] => json_encode
            [212] => json_decode
            [213] => odbc_autocommit
            [214] => odbc_binmode
            [215] => odbc_close
            [216] => odbc_close_all
            [217] => odbc_columns
            [218] => odbc_commit
            [219] => odbc_connect
            [220] => odbc_cursor
            [221] => odbc_data_source
            [222] => odbc_execute
            [223] => odbc_error
            [224] => odbc_errormsg
            [225] => odbc_exec
            [226] => odbc_fetch_array
            [227] => odbc_fetch_object
            [228] => odbc_fetch_row
            [229] => odbc_fetch_into
            [230] => odbc_field_len
            [231] => odbc_field_scale
            [232] => odbc_field_name
            [233] => odbc_field_type
            [234] => odbc_field_num
            [235] => odbc_free_result
            [236] => odbc_gettypeinfo
            [237] => odbc_longreadlen
            [238] => odbc_next_result
            [239] => odbc_num_fields
            [240] => odbc_num_rows
            [241] => odbc_pconnect
            [242] => odbc_prepare
            [243] => odbc_result
            [244] => odbc_result_all
            [245] => odbc_rollback
            [246] => odbc_setoption
            [247] => odbc_specialcolumns
            [248] => odbc_statistics
            [249] => odbc_tables
            [250] => odbc_primarykeys
            [251] => odbc_columnprivileges
            [252] => odbc_tableprivileges
            [253] => odbc_foreignkeys
            [254] => odbc_procedures
            [255] => odbc_procedurecolumns
            [256] => odbc_do
            [257] => odbc_field_precision
            [258] => preg_match
            [259] => preg_match_all
            [260] => preg_replace
            [261] => preg_replace_callback
            [262] => preg_split
            [263] => preg_quote
            [264] => preg_grep
            [265] => preg_last_error
            [266] => session_name
            [267] => session_module_name
            [268] => session_save_path
            [269] => session_id
            [270] => session_regenerate_id
            [271] => session_decode
            [272] => session_register
            [273] => session_unregister
            [274] => session_is_registered
            [275] => session_encode
            [276] => session_start
            [277] => session_destroy
            [278] => session_unset
            [279] => session_set_save_handler
            [280] => session_cache_limiter
            [281] => session_cache_expire
            [282] => session_set_cookie_params
            [283] => session_get_cookie_params
            [284] => session_write_close
            [285] => session_commit
            [286] => spl_classes
            [287] => spl_autoload
            [288] => spl_autoload_extensions
            [289] => spl_autoload_register
            [290] => spl_autoload_unregister
            [291] => spl_autoload_functions
            [292] => spl_autoload_call
            [293] => class_parents
            [294] => class_implements
            [295] => spl_object_hash
            [296] => iterator_to_array
            [297] => iterator_count
            [298] => iterator_apply
            [299] => constant
            [300] => bin2hex
            [301] => sleep
            [302] => usleep
            [303] => flush
            [304] => wordwrap
            [305] => htmlspecialchars
            [306] => htmlentities
            [307] => html_entity_decode
            [308] => htmlspecialchars_decode
            [309] => get_html_translation_table
            [310] => sha1
            [311] => sha1_file
            [312] => md5
            [313] => md5_file
            [314] => crc32
            [315] => iptcparse
            [316] => iptcembed
            [317] => getimagesize
            [318] => image_type_to_mime_type
            [319] => image_type_to_extension
            [320] => phpinfo
            [321] => phpversion
            [322] => phpcredits
            [323] => php_logo_guid
            [324] => php_real_logo_guid
            [325] => php_egg_logo_guid
            [326] => zend_logo_guid
            [327] => php_sapi_name
            [328] => php_uname
            [329] => php_ini_scanned_files
            [330] => strnatcmp
            [331] => strnatcasecmp
            [332] => substr_count
            [333] => strspn
            [334] => strcspn
            [335] => strtok
            [336] => strtoupper
            [337] => strtolower
            [338] => strpos
            [339] => stripos
            [340] => strrpos
            [341] => strripos
            [342] => strrev
            [343] => hebrev
            [344] => hebrevc
            [345] => nl2br
            [346] => basename
            [347] => dirname
            [348] => pathinfo
            [349] => stripslashes
            [350] => stripcslashes
            [351] => strstr
            [352] => stristr
            [353] => strrchr
            [354] => str_shuffle
            [355] => str_word_count
            [356] => str_split
            [357] => strpbrk
            [358] => substr_compare
            [359] => strcoll
            [360] => substr
            [361] => substr_replace
            [362] => quotemeta
            [363] => ucfirst
            [364] => ucwords
            [365] => strtr
            [366] => addslashes
            [367] => addcslashes
            [368] => rtrim
            [369] => str_replace
            [370] => str_ireplace
            [371] => str_repeat
            [372] => count_chars
            [373] => chunk_split
            [374] => trim
            [375] => ltrim
            [376] => strip_tags
            [377] => similar_text
            [378] => explode
            [379] => implode
            [380] => setlocale
            [381] => localeconv
            [382] => soundex
            [383] => levenshtein
            [384] => chr
            [385] => ord
            [386] => parse_str
            [387] => str_pad
            [388] => chop
            [389] => strchr
            [390] => sprintf
            [391] => printf
            [392] => vprintf
            [393] => vsprintf
            [394] => fprintf
            [395] => vfprintf
            [396] => sscanf
            [397] => fscanf
            [398] => parse_url
            [399] => urlencode
            [400] => urldecode
            [401] => rawurlencode
            [402] => rawurldecode
            [403] => http_build_query
            [404] => unlink
            [405] => exec
            [406] => system
            [407] => escapeshellcmd
            [408] => escapeshellarg
            [409] => passthru
            [410] => shell_exec
            [411] => proc_open
            [412] => proc_close
            [413] => proc_terminate
            [414] => proc_get_status
            [415] => rand
            [416] => srand
            [417] => getrandmax
            [418] => mt_rand
            [419] => mt_srand
            [420] => mt_getrandmax
            [421] => getservbyname
            [422] => getservbyport
            [423] => getprotobyname
            [424] => getprotobynumber
            [425] => getmyuid
            [426] => getmygid
            [427] => getmypid
            [428] => getmyinode
            [429] => getlastmod
            [430] => base64_decode
            [431] => base64_encode
            [432] => convert_uuencode
            [433] => convert_uudecode
            [434] => abs
            [435] => ceil
            [436] => floor
            [437] => round
            [438] => sin
            [439] => cos
            [440] => tan
            [441] => asin
            [442] => acos
            [443] => atan
            [444] => atan2
            [445] => sinh
            [446] => cosh
            [447] => tanh
            [448] => pi
            [449] => is_finite
            [450] => is_nan
            [451] => is_infinite
            [452] => pow
            [453] => exp
            [454] => log
            [455] => log10
            [456] => sqrt
            [457] => hypot
            [458] => deg2rad
            [459] => rad2deg
            [460] => bindec
            [461] => hexdec
            [462] => octdec
            [463] => decbin
            [464] => decoct
            [465] => dechex
            [466] => base_convert
            [467] => number_format
            [468] => fmod
            [469] => ip2long
            [470] => long2ip
            [471] => getenv
            [472] => putenv
            [473] => microtime
            [474] => gettimeofday
            [475] => uniqid
            [476] => quoted_printable_decode
            [477] => convert_cyr_string
            [478] => get_current_user
            [479] => set_time_limit
            [480] => get_cfg_var
            [481] => magic_quotes_runtime
            [482] => set_magic_quotes_runtime
            [483] => get_magic_quotes_gpc
            [484] => get_magic_quotes_runtime
            [485] => import_request_variables
            [486] => error_log
            [487] => error_get_last
            [488] => call_user_func
            [489] => call_user_func_array
            [490] => call_user_method
            [491] => call_user_method_array
            [492] => serialize
            [493] => unserialize
            [494] => var_dump
            [495] => var_export
            [496] => debug_zval_dump
            [497] => print_r
            [498] => register_shutdown_function
            [499] => register_tick_function
            [500] => unregister_tick_function
            [501] => highlight_file
            [502] => show_source
            [503] => highlight_string
            [504] => php_strip_whitespace
            [505] => ini_get
            [506] => ini_get_all
            [507] => ini_set
            [508] => ini_alter
            [509] => ini_restore
            [510] => get_include_path
            [511] => set_include_path
            [512] => restore_include_path
            [513] => setcookie
            [514] => setrawcookie
            [515] => header
            [516] => headers_sent
            [517] => headers_list
            [518] => connection_aborted
            [519] => connection_status
            [520] => ignore_user_abort
            [521] => parse_ini_file
            [522] => is_uploaded_file
            [523] => move_uploaded_file
            [524] => gethostbyaddr
            [525] => gethostbyname
            [526] => gethostbynamel
            [527] => intval
            [528] => floatval
            [529] => doubleval
            [530] => strval
            [531] => gettype
            [532] => settype
            [533] => is_null
            [534] => is_resource
            [535] => is_bool
            [536] => is_long
            [537] => is_float
            [538] => is_int
            [539] => is_integer
            [540] => is_double
            [541] => is_real
            [542] => is_numeric
            [543] => is_string
            [544] => is_array
            [545] => is_object
            [546] => is_scalar
            [547] => is_callable
            [548] => ereg
            [549] => ereg_replace
            [550] => eregi
            [551] => eregi_replace
            [552] => split
            [553] => spliti
            [554] => join
            [555] => sql_regcase
            [556] => dl
            [557] => pclose
            [558] => popen
            [559] => readfile
            [560] => rewind
            [561] => rmdir
            [562] => umask
            [563] => fclose
            [564] => feof
            [565] => fgetc
            [566] => fgets
            [567] => fgetss
            [568] => fread
            [569] => fopen
            [570] => fpassthru
            [571] => ftruncate
            [572] => fstat
            [573] => fseek
            [574] => ftell
            [575] => fflush
            [576] => fwrite
            [577] => fputs
            [578] => mkdir
            [579] => rename
            [580] => copy
            [581] => tempnam
            [582] => tmpfile
            [583] => file
            [584] => file_get_contents
            [585] => file_put_contents
            [586] => stream_select
            [587] => stream_context_create
            [588] => stream_context_set_params
            [589] => stream_context_set_option
            [590] => stream_context_get_options
            [591] => stream_context_get_default
            [592] => stream_filter_prepend
            [593] => stream_filter_append
            [594] => stream_filter_remove
            [595] => stream_socket_client
            [596] => stream_socket_server
            [597] => stream_socket_accept
            [598] => stream_socket_get_name
            [599] => stream_socket_recvfrom
            [600] => stream_socket_sendto
            [601] => stream_socket_enable_crypto
            [602] => stream_copy_to_stream
            [603] => stream_get_contents
            [604] => fgetcsv
            [605] => fputcsv
            [606] => flock
            [607] => get_meta_tags
            [608] => stream_set_write_buffer
            [609] => set_file_buffer
            [610] => set_socket_blocking
            [611] => stream_set_blocking
            [612] => socket_set_blocking
            [613] => stream_get_meta_data
            [614] => stream_get_line
            [615] => stream_wrapper_register
            [616] => stream_register_wrapper
            [617] => stream_wrapper_unregister
            [618] => stream_wrapper_restore
            [619] => stream_get_wrappers
            [620] => stream_get_transports
            [621] => get_headers
            [622] => stream_set_timeout
            [623] => socket_set_timeout
            [624] => socket_get_status
            [625] => realpath
            [626] => fsockopen
            [627] => pfsockopen
            [628] => pack
            [629] => unpack
            [630] => get_browser
            [631] => crypt
            [632] => opendir
            [633] => closedir
            [634] => chdir
            [635] => getcwd
            [636] => rewinddir
            [637] => readdir
            [638] => dir
            [639] => scandir
            [640] => glob
            [641] => fileatime
            [642] => filectime
            [643] => filegroup
            [644] => fileinode
            [645] => filemtime
            [646] => fileowner
            [647] => fileperms
            [648] => filesize
            [649] => filetype
            [650] => file_exists
            [651] => is_writable
            [652] => is_writeable
            [653] => is_readable
            [654] => is_executable
            [655] => is_file
            [656] => is_dir
            [657] => is_link
            [658] => stat
            [659] => lstat
            [660] => chown
            [661] => chgrp
            [662] => chmod
            [663] => touch
            [664] => clearstatcache
            [665] => disk_total_space
            [666] => disk_free_space
            [667] => diskfreespace
            [668] => mail
            [669] => ezmlm_hash
            [670] => openlog
            [671] => syslog
            [672] => closelog
            [673] => define_syslog_variables
            [674] => lcg_value
            [675] => metaphone
            [676] => ob_start
            [677] => ob_flush
            [678] => ob_clean
            [679] => ob_end_flush
            [680] => ob_end_clean
            [681] => ob_get_flush
            [682] => ob_get_clean
            [683] => ob_get_length
            [684] => ob_get_level
            [685] => ob_get_status
            [686] => ob_get_contents
            [687] => ob_implicit_flush
            [688] => ob_list_handlers
            [689] => ksort
            [690] => krsort
            [691] => natsort
            [692] => natcasesort
            [693] => asort
            [694] => arsort
            [695] => sort
            [696] => rsort
            [697] => usort
            [698] => uasort
            [699] => uksort
            [700] => shuffle
            [701] => array_walk
            [702] => array_walk_recursive
            [703] => count
            [704] => end
            [705] => prev
            [706] => next
            [707] => reset
            [708] => current
            [709] => key
            [710] => min
            [711] => max
            [712] => in_array
            [713] => array_search
            [714] => extract
            [715] => compact
            [716] => array_fill
            [717] => array_fill_keys
            [718] => range
            [719] => array_multisort
            [720] => array_push
            [721] => array_pop
            [722] => array_shift
            [723] => array_unshift
            [724] => array_splice
            [725] => array_slice
            [726] => array_merge
            [727] => array_merge_recursive
            [728] => array_keys
            [729] => array_values
            [730] => array_count_values
            [731] => array_reverse
            [732] => array_reduce
            [733] => array_pad
            [734] => array_flip
            [735] => array_change_key_case
            [736] => array_rand
            [737] => array_unique
            [738] => array_intersect
            [739] => array_intersect_key
            [740] => array_intersect_ukey
            [741] => array_uintersect
            [742] => array_intersect_assoc
            [743] => array_uintersect_assoc
            [744] => array_intersect_uassoc
            [745] => array_uintersect_uassoc
            [746] => array_diff
            [747] => array_diff_key
            [748] => array_diff_ukey
            [749] => array_udiff
            [750] => array_diff_assoc
            [751] => array_udiff_assoc
            [752] => array_diff_uassoc
            [753] => array_udiff_uassoc
            [754] => array_sum
            [755] => array_product
            [756] => array_filter
            [757] => array_map
            [758] => array_chunk
            [759] => array_combine
            [760] => array_key_exists
            [761] => pos
            [762] => sizeof
            [763] => key_exists
            [764] => assert
            [765] => assert_options
            [766] => version_compare
            [767] => str_rot13
            [768] => stream_get_filters
            [769] => stream_filter_register
            [770] => stream_bucket_make_writeable
            [771] => stream_bucket_prepend
            [772] => stream_bucket_append
            [773] => stream_bucket_new
            [774] => output_add_rewrite_var
            [775] => output_reset_rewrite_vars
            [776] => token_get_all
            [777] => token_name
            [778] => readgzfile
            [779] => gzrewind
            [780] => gzclose
            [781] => gzeof
            [782] => gzgetc
            [783] => gzgets
            [784] => gzgetss
            [785] => gzread
            [786] => gzopen
            [787] => gzpassthru
            [788] => gzseek
            [789] => gztell
            [790] => gzwrite
            [791] => gzputs
            [792] => gzfile
            [793] => gzcompress
            [794] => gzuncompress
            [795] => gzdeflate
            [796] => gzinflate
            [797] => gzencode
            [798] => ob_gzhandler
            [799] => zlib_get_coding_type
            [800] => libxml_set_streams_context
            [801] => libxml_use_internal_errors
            [802] => libxml_get_last_error
            [803] => libxml_clear_errors
            [804] => libxml_get_errors
            [805] => dom_import_simplexml
            [806] => simplexml_load_file
            [807] => simplexml_load_string
            [808] => simplexml_import_dom
            [809] => wddx_serialize_value
            [810] => wddx_serialize_vars
            [811] => wddx_packet_start
            [812] => wddx_packet_end
            [813] => wddx_add_vars
            [814] => wddx_deserialize
            [815] => xml_parser_create
            [816] => xml_parser_create_ns
            [817] => xml_set_object
            [818] => xml_set_element_handler
            [819] => xml_set_character_data_handler
            [820] => xml_set_processing_instruction_handler
            [821] => xml_set_default_handler
            [822] => xml_set_unparsed_entity_decl_handler
            [823] => xml_set_notation_decl_handler
            [824] => xml_set_external_entity_ref_handler
            [825] => xml_set_start_namespace_decl_handler
            [826] => xml_set_end_namespace_decl_handler
            [827] => xml_parse
            [828] => xml_parse_into_struct
            [829] => xml_get_error_code
            [830] => xml_error_string
            [831] => xml_get_current_line_number
            [832] => xml_get_current_column_number
            [833] => xml_get_current_byte_index
            [834] => xml_parser_free
            [835] => xml_parser_set_option
            [836] => xml_parser_get_option
            [837] => utf8_encode
            [838] => utf8_decode
            [839] => xmlwriter_open_uri
            [840] => xmlwriter_open_memory
            [841] => xmlwriter_set_indent
            [842] => xmlwriter_set_indent_string
            [843] => xmlwriter_start_comment
            [844] => xmlwriter_end_comment
            [845] => xmlwriter_start_attribute
            [846] => xmlwriter_end_attribute
            [847] => xmlwriter_write_attribute
            [848] => xmlwriter_start_attribute_ns
            [849] => xmlwriter_write_attribute_ns
            [850] => xmlwriter_start_element
            [851] => xmlwriter_end_element
            [852] => xmlwriter_full_end_element
            [853] => xmlwriter_start_element_ns
            [854] => xmlwriter_write_element
            [855] => xmlwriter_write_element_ns
            [856] => xmlwriter_start_pi
            [857] => xmlwriter_end_pi
            [858] => xmlwriter_write_pi
            [859] => xmlwriter_start_cdata
            [860] => xmlwriter_end_cdata
            [861] => xmlwriter_write_cdata
            [862] => xmlwriter_text
            [863] => xmlwriter_write_raw
            [864] => xmlwriter_start_document
            [865] => xmlwriter_end_document
            [866] => xmlwriter_write_comment
            [867] => xmlwriter_start_dtd
            [868] => xmlwriter_end_dtd
            [869] => xmlwriter_write_dtd
            [870] => xmlwriter_start_dtd_element
            [871] => xmlwriter_end_dtd_element
            [872] => xmlwriter_write_dtd_element
            [873] => xmlwriter_start_dtd_attlist
            [874] => xmlwriter_end_dtd_attlist
            [875] => xmlwriter_write_dtd_attlist
            [876] => xmlwriter_output_memory
            [877] => xmlwriter_flush
            [878] => apache_lookup_uri
            [879] => virtual
            [880] => apache_request_headers
            [881] => apache_response_headers
            [882] => apache_setenv
            [883] => apache_getenv
            [884] => apache_note
            [885] => apache_get_version
            [886] => apache_get_modules
            [887] => getallheaders
            [888] => mb_convert_case
            [889] => mb_strtoupper
            [890] => mb_strtolower
            [891] => mb_language
            [892] => mb_internal_encoding
            [893] => mb_http_input
            [894] => mb_http_output
            [895] => mb_detect_order
            [896] => mb_substitute_character
            [897] => mb_parse_str
            [898] => mb_output_handler
            [899] => mb_preferred_mime_name
            [900] => mb_strlen
            [901] => mb_strpos
            [902] => mb_strrpos
            [903] => mb_stripos
            [904] => mb_strripos
            [905] => mb_strstr
            [906] => mb_strrchr
            [907] => mb_stristr
            [908] => mb_strrichr
            [909] => mb_substr_count
            [910] => mb_substr
            [911] => mb_strcut
            [912] => mb_strwidth
            [913] => mb_strimwidth
            [914] => mb_convert_encoding
            [915] => mb_detect_encoding
            [916] => mb_list_encodings
            [917] => mb_convert_kana
            [918] => mb_encode_mimeheader
            [919] => mb_decode_mimeheader
            [920] => mb_convert_variables
            [921] => mb_encode_numericentity
            [922] => mb_decode_numericentity
            [923] => mb_send_mail
            [924] => mb_get_info
            [925] => mb_check_encoding
            [926] => mb_regex_encoding
            [927] => mb_regex_set_options
            [928] => mb_ereg
            [929] => mb_eregi
            [930] => mb_ereg_replace
            [931] => mb_eregi_replace
            [932] => mb_split
            [933] => mb_ereg_match
            [934] => mb_ereg_search
            [935] => mb_ereg_search_pos
            [936] => mb_ereg_search_regs
            [937] => mb_ereg_search_init
            [938] => mb_ereg_search_getregs
            [939] => mb_ereg_search_getpos
            [940] => mb_ereg_search_setpos
            [941] => mbregex_encoding
            [942] => mbereg
            [943] => mberegi
            [944] => mbereg_replace
            [945] => mberegi_replace
            [946] => mbsplit
            [947] => mbereg_match
            [948] => mbereg_search
            [949] => mbereg_search_pos
            [950] => mbereg_search_regs
            [951] => mbereg_search_init
            [952] => mbereg_search_getregs
            [953] => mbereg_search_getpos
            [954] => mbereg_search_setpos
            [955] => gd_info
            [956] => imagearc
            [957] => imageellipse
            [958] => imagechar
            [959] => imagecharup
            [960] => imagecolorat
            [961] => imagecolorallocate
            [962] => imagepalettecopy
            [963] => imagecreatefromstring
            [964] => imagecolorclosest
            [965] => imagecolordeallocate
            [966] => imagecolorresolve
            [967] => imagecolorexact
            [968] => imagecolorset
            [969] => imagecolortransparent
            [970] => imagecolorstotal
            [971] => imagecolorsforindex
            [972] => imagecopy
            [973] => imagecopymerge
            [974] => imagecopymergegray
            [975] => imagecopyresized
            [976] => imagecreate
            [977] => imagecreatetruecolor
            [978] => imageistruecolor
            [979] => imagetruecolortopalette
            [980] => imagesetthickness
            [981] => imagefilledarc
            [982] => imagefilledellipse
            [983] => imagealphablending
            [984] => imagesavealpha
            [985] => imagecolorallocatealpha
            [986] => imagecolorresolvealpha
            [987] => imagecolorclosestalpha
            [988] => imagecolorexactalpha
            [989] => imagecopyresampled
            [990] => imagerotate
            [991] => imageantialias
            [992] => imagesettile
            [993] => imagesetbrush
            [994] => imagesetstyle
            [995] => imagecreatefrompng
            [996] => imagecreatefromgif
            [997] => imagecreatefromjpeg
            [998] => imagecreatefromwbmp
            [999] => imagecreatefromxbm
            [1000] => imagecreatefromgd
            [1001] => imagecreatefromgd2
            [1002] => imagecreatefromgd2part
            [1003] => imagepng
            [1004] => imagegif
            [1005] => imagejpeg
            [1006] => imagewbmp
            [1007] => imagegd
            [1008] => imagegd2
            [1009] => imagedestroy
            [1010] => imagegammacorrect
            [1011] => imagefill
            [1012] => imagefilledpolygon
            [1013] => imagefilledrectangle
            [1014] => imagefilltoborder
            [1015] => imagefontwidth
            [1016] => imagefontheight
            [1017] => imageinterlace
            [1018] => imageline
            [1019] => imageloadfont
            [1020] => imagepolygon
            [1021] => imagerectangle
            [1022] => imagesetpixel
            [1023] => imagestring
            [1024] => imagestringup
            [1025] => imagesx
            [1026] => imagesy
            [1027] => imagedashedline
            [1028] => imagettfbbox
            [1029] => imagettftext
            [1030] => imageftbbox
            [1031] => imagefttext
            [1032] => imagepsloadfont
            [1033] => imagepsfreefont
            [1034] => imagepsencodefont
            [1035] => imagepsextendfont
            [1036] => imagepsslantfont
            [1037] => imagepstext
            [1038] => imagepsbbox
            [1039] => imagetypes
            [1040] => jpeg2wbmp
            [1041] => png2wbmp
            [1042] => image2wbmp
            [1043] => imagelayereffect
            [1044] => imagecolormatch
            [1045] => imagexbm
            [1046] => imagefilter
            [1047] => imageconvolution
        )

    [user] => Array
        (
        )

)

上記は、私の自宅のデスクトップPC(Windows XP)にインストールしているPHP Version 5.2.0での実行結果。

PHPで定義されている関数が1047個もあることに驚いた。

知らない関数がいっぱい…。

PHPのサーバ変数「$_SERVER」に現在何が格納されているかを確認したい場合は、以下のようにすればよい。

《PHPサーバ変数「$_SERVER」を出力する例》
<?php
print_r($_SERVER);
?>

《上記プログラムの実行結果》
Array
(
    [HTTP_ACCEPT] => image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, application/x-silverlight, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
    [HTTP_ACCEPT_LANGUAGE] => ja
    [HTTP_USER_AGENT] => Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; EasyBits GO v1.0; .NET CLR 1.1.4322; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727)
    [HTTP_ACCEPT_ENCODING] => gzip, deflate
    [HTTP_HOST] => neko
    [HTTP_CONNECTION] => Keep-Alive
    [PATH] => C:\Program Files\PHP\;%JAVA_HOME%bin;C:\Perl\bin\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\Common Files\Ulead Systems\MPEG;C:\Program Files\ATI Technologies\ATI Control Panel;C:\Program Files\PostgreSQL\8.4\bin;C:\Program Files\QuickTime\QTSystem\
    [SystemRoot] => C:\WINDOWS
    [COMSPEC] => C:\WINDOWS\system32\cmd.exe
    [PATHEXT] => .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
    [WINDIR] => C:\WINDOWS
    [SERVER_SIGNATURE] =>
    [SERVER_SOFTWARE] => Apache/2.2.3 (Win32) PHP/5.2.0
    [SERVER_NAME] => neko
    [SERVER_ADDR] => 192.168.0.3
    [SERVER_PORT] => 80
    [REMOTE_ADDR] => 192.168.0.3
    [DOCUMENT_ROOT] => C:/Program Files/Apache Software Foundation/Apache2.2/htdocs
    [SERVER_ADMIN] => r_nobu@h8.dion.ne.jp
    [SCRIPT_FILENAME] => C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/php/server.php
    [REMOTE_PORT] => 2744
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_PROTOCOL] => HTTP/1.1
    [REQUEST_METHOD] => GET
    [QUERY_STRING] =>
    [REQUEST_URI] => /php/server.php
    [SCRIPT_NAME] => /php/server.php
    [PHP_SELF] => /php/server.php
    [REQUEST_TIME] => 1312993720
)

 

PHPのmemory_limitは、phpinfo()関数で確認できる。

phpinfo()関数の出力結果は、ブラウザで確認することが多いかもしれないが、以下のようにLinuxのコンソール等でコマンドラインで実行して確認することもできる。

《コマンド例》
php -r 'phpinfo();' | grep memory_limit

《出力結果例》
memory_limit => 512M => 512M

変数に格納されている文字列に含まれる数字を数値に変換するには、

settype(変数,"integer")

とすればよい。

例1 変数←「数字」
$str = "2011";
settype($str,"integer");
echo $str;

《出力結果》
2011

例2 変数←「数字+数字以外」
$str = "2011年";
settype($str,"integer");
echo $str;

《出力結果》
2011
※文字列に含まれる数字以外は削除されるようだ。

例3 変数←「数字+数字以外+数字+数字以外+数字+数字以外」
$str = "2011年9月18日";
settype($str,"integer");
echo $str;

《出力結果》
2011
※文字列に含まれる数字のみを抽出して「2011918」という結果になるかな、と期待したのだが、「2011」のみだった。文字列に数字と数字以外が混在する場合は、最初に出現する先頭の数字のみを取り出し、その数字以降に登場する文字列は数字も含めて削除するようだ。

例4 変数←「数字以外+数字+数字以外」
$str = "西暦2011年";
settype($str,"integer");
echo $str;

《出力結果》
0
※文字列の先頭が数字以外の場合、以降の文字列に数字が含まれているかどうかには関係なく、出力結果は0になるようだ。

例5 変数←「数字以外」
$str = "西暦";
settype($str,"integer");
echo $str;

《出力結果》
0
※文字列に数字が含まれない場合は、出力結果は0になるようだ。

文字列を小文字に変換するPHP関数として、strtolower()関数、mb_strtolower()関数があるので、これらを使ってみる。

例1 変数←「英語アルファベット大文字」
$str = "NOBUNEKO";
echo strtolower($str);

《出力結果》
NOBUNEKO

例2 変数←「英語アルファベット大文字+日本語文字列」
$str = "NOBUNEKOは猫大好きです";
echo strtolower($str);

《出力結果》
nobunekoは罵大硬きです
※「猫大好き」が「罵大硬き」と文字化けしてしまった。日本語などマルチバイト文字列が含まれる場合は、strtolower()関数は使用しない方がよさそう。

日本語などマルチバイト文字列を含む文字列を小文字に変換する場合は、mb_strtolower()関数を使用すると良さそうなので試してみる。

例3 変数←「英語アルファベット大文字+日本語文字列」 ※文字化けする場合がある
$str = "NOBUNEKOは猫大好きです";
echo mb_strtolower($str);

《出力結果》
nobunekoわ罵大硬きょす
※「は猫大好きです」が「わ罵大硬きょす」と文字化けしてしまった。strtolower()関数よりも悪い結果となってしまった。

PHPの現在の内部文字エンコーディングに問題があると思ったので、mb_internal_encoding()関数で確認してみる。

echo mb_internal_encoding();

《出力結果》
ISO-8859-1

ISO-8859-1をWikipediaで調べてみると、「ラテンアルファベットの文字コード標準」ということだった。

《参考》
http://ja.wikipedia.org/wiki/ISO/IEC_8859-1
ISO 8859-1(より正式にはISO/IEC 8859-1)はISO/IEC 8859の第一部であり、ラテンアルファベットの文字コード標準である。

内部文字エンコーディングが、何だかいかにも文字化けしそうな文字コードで設定されている!(苦笑)。

例4 変数←「英語アルファベット大文字+日本語文字列」 ※文字化け対策(方法1)を含む
mb_internal_encoding("SJIS-win");
$str = "NOBUNEKOは猫大好きです";
echo mb_strtolower($str);

《出力結果》
nobunekoは猫大好きです

※mb_internal_encoding()関数で、PHPの内部文字エンコーディングをシフトJIS(Shift_JIS)に設定してみると、文字化けは解消された。
mb_internal_encoding()関数を使用したくない場合は、mb_strtolower()関数で文字コードを指定することでも文字化けは解消される。

例5 変数←「英語アルファベット大文字+日本語文字列」 ※文字化け対策(方法2)を含む
$str = "NOBUNEKOは猫大好きです";
echo mb_strtolower($str,"SJIS-win");

《出力結果》
nobunekoは猫大好きです

一方、文字列を大文字に変換するPHP関数として、strtoupper()関数、mb_strtoupper()関数があるので、これらを使ってみる。

例1 変数←「英語アルファベット小文字」
$str = "nobuneko";
echo strtoupper($str);

《出力結果》
NOBUNEKO

例2 変数←「英語アルファベット小文字+日本語文字列」
$str = "nobunekoは猫大好きです";
echo strtoupper($str);

《出力結果》
NOBUNEKOは猫大好きです
※strtolowerと異なり、文字化けしないのかと思ったら、文字列を変更すると文字化けした。

例3 変数←「英語アルファベット小文字+日本語文字列」 ※文字化けする場合がある
$str = "nobunekoは電車が好きです";
echo strtoupper($str);

《出力結果》
NOBUNEKOは泥車が好きです
※「電車」が「泥車」に文字化けした。

一方、日本語などマルチバイト文字列を含む文字列を大文字に変換する場合は、mb_strtoupper()関数を使用すると良さそうなので試してみる。

例4 変数←「英語アルファベット小文字+日本語文字列」 ※文字化けする場合がある
$str = "nobunekoは電車が好きです";
echo mb_strtoupper($str);

《出力結果》
NOBUNEKOは泥車が好きです
※「電車」が「泥車」に文字化けした。

例5 変数←「英語アルファベット小文字+日本語文字列」 ※文字化け対策(方法1)を含む
mb_internal_encoding("SJIS-win");
$str = "nobunekoは電車が好きです";
echo mb_strtoupper($str);

《出力結果》
NOBUNEKOは電車が好きです
※mb_strtolowerと同様にPHPの内部文字エンコーディングを指定すると、文字化けが解消した。

例6 変数←「英語アルファベット小文字+日本語文字列」 ※文字化け対策(方法2)を含む

$str = "nobunekoは電車が好きです";
echo mb_strtoupper($str,"SJIS-win");

《出力結果》
NOBUNEKOは電車が好きです
※mb_strtolower()と同様にmb_strtoupper()関数内で文字コードを指定すると、文字化けが解消した。

PHPのrmdir()関数で

rmdir(/var/www/html/nobuneko)

などとして、ディレクトリを削除しようとした際に、

PHP Warning:  rmdir(/var/www/html/nobuneko): ディレクトリは空ではありません

といったエラーメッセージが表示されて削除できない場合がある。

このエラーの原因は、「ディレクトリは空ではありません」というエラーメッセージのとおりで、削除対象のディレクトリが空ではないからだ。

したがって、このエラーを解決するには、ディレクトリの中身を空にしてやればよい。

PHPのrmdir()関数では、削除対象のディレクトリ内にファイル、サブディレクトリがあると削除に失敗するので注意が必要だ。

PHPでファイルのアップロードを行う時に、

PHP Warning:  Maximum number of allowable file uploads has been exceeded in Unknown on line 0

といったエラーが出てアップロードができない時がある。

このエラーの原因は、php.iniで設定できるmax_file_uploadsの値に問題があるので、max_file_uploadsを適切な値に変更することで問題が解決する。

まずは、このような場合、phpinfoでmax_file_uploadsを確認する。

max_file_uploadsで設定されている数値は、PHPでファイルを同時に何ファイルまでアップロードできるか、という最大値となる。

Webページ内にファイルの登録欄を30個設けていて、それらを1回のsubmitで処理しようとするのであれば、max_file_uploadsは30以上の数値になっている必要がある。

もし、max_file_uploadsの設定を20にしてファイルを30個登録しようとしたら、ファイルのうち20個までは登録に成功し、21個目以降の登録に失敗する、ということになってしまう。

max_file_uploadsの数値を変更するには、php.iniを編集することになる。

30に設定したい場合は、php.iniでは

max_file_uploads = 30

と指定する。(設定を反映するにはApacheの再起動が必要。)

CentOS 5でパッケージインストールしたPHP5.1.6のphp.iniなど、php.iniの中にmax_file_uploadsの記述がない場合は、「max_file_uploads = 数値」を新規に追加することになる。

max_file_uploadsのデフォルト(初期値)は20になっているようなので、max_file_uploadsの設定を知らなければ、「PHPではファイルが20個までしか登録できない。21個以上登録できない。何故だろう。」と悩むことになってしまう。(私も昔困ったことがあった。最近、困っている人を見かけたので、この設定のことを思い出した。)

PHPのマニュアルを参照すると、PHP 5.3.4以降に仕様が変わったことが書いてあり、少し面白い、と思った。

《参考》「コア php.ini ディレクティブに関する説明」
http://php.net/manual/ja/ini.core.php

max_file_uploadsinteger 
同時にアップロードできるファイルの最大数。 PHP 5.3.4 以降、何もファイルを指定せずに送信されたアップロードフィールドは ファイル数に数えられなくなりました。

これまでは、ファイルアップロード欄(アップロードフィールド)の数とmax_file_uploadsの数を一致させる、という意識を持ちやすかったのだが、上記の仕様に変わると、そのような意識を持つ人が減るかもしれない。

もし、ファイルアップロード欄(アップロードフィールド)が21個以上あるが、いつも使うのは20個以内、そしてファイルアップロード欄の最大数でのファイル登録テストをしなかった、というような場合、max_file_uploadsの数値を本来は30にしておかないといけないのに、デフォルトの20のままで長期間運用してしまい、ある日、21個以上登録する機会がやってきた時に「登録できない」と困ることがありそうだ。・・・と言ったことを考えつつも、PHP5.1.6でも結局同じことで困っている人をよく見かけるので、上記の仕様変更により、かえって困る人が増える、ということはないのかもしれない。

例えば、php.iniで、

include_path=".;c:\php\pear"

と指定していても、phpinfo()で「include_path」の設定値を確認すると、自分が指定していない

include_path='.;c:\php5\pear'

になっている、ということがある。

include_pathの設定に限らないが、php.iniの設定が反映されない場合、普通(?)よくあるパターンが以下だと思う。

1)php.iniの設定を変更したのにApacheを再起動していなかった。
 →Apacheを再起動したら、php.iniの設定変更が反映される。

2)修正したphp.iniファイルが、全く関係のないファイルだった。つまり、PHPが読み込んでいるphp.iniファイルは、どこか別の場所に格納されており、それに気づかないまま、たまたま見つけた関係のないphp.iniファイルを修正してしまった。
 →phpinfo()でどのフォルダ内のphp.iniを読み込んでいるかを確認すれば、解決する。

《例》WindowsのC:\Windows配下にphp.iniを設置した場合のphpinfo()での表示例

Configuration File (php.ini) Path C:\WINDOWS
Loaded Configuration File C:\WINDOWS\php.ini


 →実は、どのphp.iniもPHPが読み込めていないのであれば、読み込めるようにする。(PHPから見た時に、どこにphp.iniが設置されているのかを認識できていない、ということはよくある。)
 ※Windows環境であれば、C:\Windows配下にphp.iniを設置すると、認識してくれる。

3)Windows環境だと、php.iniの設置場所によっては、設置場所のphp.iniを直接修正しても修正内容が実は保存されていない。
 →Windows 7、Windows Vistaではよくあること。
  デスクトップ等でphp.iniファイルを修正した後、本来設置したい場所にコピーすると良い。

これまでは、この3つのパターンしか思いつかなかったが、最近、4つ目のパターンがあることに気付いた。

4)新たにPHP設定を記述した行よりも前の行で、PHPの設定記述に誤りがあった。
→最近、コレに少しはまった。

何かの設定が悪かったのか、Apacheのエラーログにも記録されないし、ブラウザで表示した時にもエラーが表示されなかったので、php.iniの記述には間違いがないのだろう、と断定し、さて、どうしようか、と八方ふさがりになりつつあった。

その時に、ふと思いついて、コマンドラインで(Windowsのコマンドプロンプトで)PHPを実行すると、PHPエラーが表示された。

○行目でエラーが出ている、ということまで記載されていたので、php.iniの該当行を確認すると、PHPの設定の記述の仕方が間違っていたことに気付いた。

この間違っていた行は、include_pathの記述よりも遥かに前の行だったので、include_pathの設定を何度も確認している時には、視界に入っていなかった。

PHPの動きとしては、新たに設定した記述(今回の例では「include_path」)よりも前に登場したPHP設定の記述において、記述の仕方が間違っていると、それ以後の設定は受け付けない、といったことになっているのかもしれない。

掲題の件だが、php.iniでinclude_pathを指定しても、phpinfoで確認すると自分が指定していない「include_path='.;c:\php5\pear'」になってしまう原因の1つとしては、今回は、include_pathを記述した行よりも前の行で、PHPの設定記述に誤りがあった、ということになる。

PHPとしては、(PHP5の)include_pathの初期値は、「'.;c:\php5\pear'」なのかなぁ。

今後も「php.iniの修正内容が反映されない!」という問題に遭遇した場合には、上述の1)〜4)項目のすべてを考慮することにしよう、と思った。まだ、これ以外にもハマリ・パターンがある場合は、このブログに追記するかも。

PHPのtouch()関数で、引数にパスを指定し、ファイルを新規に作成しようとした時に、

PHP Warning:  touch(): Unable to create file〜because No such file or directory

となることがある。

《プログラム例》「/home/nobuneko/test.php」ファイルの中身(一部)

26行目: $file_path = "/home/nobuneko/cat/test.txt";
27行目: touch($file_path);

《実行例》
PHP Warning:  touch(): Unable to create file /home/nobuneko/cat/test.txt because No such file or directory in /home/nobuneko/test.php on line 27

touch()関数は、引数に指定したパスにファイルがない場合は、ファイルを新規に作成する動きとなるが、ディレクトリまでは作成してくれない。

上記の例では、「/home/nobuneko/」ディレクトリは存在するが、その下位の「cat」ディレクトリが存在しないため(→because No such file or directory)、catディレクトリ配下にtest.txtファイルを作成しようとしても作成できず(→Unable to create file)にPHPエラーとなっている。

上記の例の場合は、「/home/nobuneko/」ディレクトリ直下にcatというディレクトリを新規に作成することで、PHPエラーとなっていた問題を解決できる。

PHPでファイルに書き込もうとすると、

PHP Warning:  fwrite(): supplied argument is not a valid stream resource

といったエラーになり、書き込みに失敗する時がある。

この場合、書き込み対象のファイルを「開く」(fopen)ことにも失敗していることがほとんどだと思う。

《プログラム例》「/home/nobuneko/test.php」ファイルの中身(一部)

27行目:$file_path = "/home/nobuneko/cat/test.txt";
28行目:$file_contents = fopen($file_path,"w+");
29行目:fwrite($file_contents,$new_contents);
30行目:fclose($file_contents);

《実行例》
PHP Warning:  fopen(/home/nobuneko/cat/test.txt): failed to open stream: No such file or directory in /home/nobuneko/test.php on line 28
PHP Warning:  fwrite(): supplied argument is not a valid stream resource in /home/nobuneko/test.php on line 29
PHP Warning:  fclose(): supplied argument is not a valid stream resource in /home/nobuneko/test.php on line 30

上記の例の場合、「/home/nobuneko/cat/test.txt」という存在しないファイルをfopenで開こうとしているが、存在しないため、エラーとなっている。

fopen(ファルオープン)に成功していたら、続くfwrite(ファイル書き込み)ではエラーにならないが、fopenに失敗しているため、無効な「ストリームリソース」を指定したことになり、fwrite、そして、fcloseにも失敗している。

したがって、PHPエラー「PHP Warning: fwrite(): supplied argument is not a valid stream resource」の原因は、fwrite実行前のfopenに失敗していることにあるので、fopenを成功させれば、問題は解決する。

fopenを成功させるには、

fopenの引数に指定するファイルへのパスが正しく、アクセス可能であること

といったことに気を付けていればよいので、このエラーの解消は、そんなには難しくない、と思う。

PHPプログラムを実行した際に、

PHP Parse error:  syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in /home/nobuneko/test.php on line 100

といったエラーになる場合、\(¥:エスケープシーケンス)の扱い方に誤りがある可能性がある。

《例》「/(スラッシュ)」を\(¥:エスケープシーケンス)に置換するプログラム

$neko = str_replace("/","\",$neko);

→この場合は、上述のエラーとなる。

 何故ならば、\(¥:エスケープシーケンス)が、後続の"(ダブルクォーテーション)をエスケープ処理してしまい、\(¥:エスケープシーケンス)の直前に記述されている"(ダブルクォーテーション)に対応する"(ダブルクォーテーション)が存在しないことになるからだ。

このような場合は、\(¥:エスケープシーケンス)を2連続で書くと良い。

$neko = str_replace("/","\\",$neko);

この書き方であれば、\(¥:エスケープシーケンス)が、後続の"(ダブルクォーテーション)をエスケープ処理したとしても、まだもう1つ\(¥:エスケープシーケンス)が残っていることになるので、上述のようなPHPエラーを防止することができる。

fsockopen関数で、

fsockopen(ドメイン名,80)

といったように、指定したドメインに(80番ポートで)接続しようとしたところ、以下のようなエラーメッセージが表示され、指定したドメインへの接続には失敗することがある。

Warning: fsockopen() [function.fsockopen]: php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution in /home/neko/test.php on line 12

Warning: fsockopen() [function.fsockopen]: unable to connect to nobuneko.com:80 (Unknown error) in /home/neko/test.php on line 12

上記のPHPエラーには、「failure in name resolution」とある。

「failure in name resolution」とは、「名前解決に失敗」という意味だ。

これは、ドメインをIPアドレスに変換することに失敗していることを意味する。

従って、上記のようなPHPエラーが出た場合、PHPを動作させているマシン(Linux、Solaris、Windows等)に設定されているDNSサーバの指定が正しいかどうかを確認し、正しくない場合は、DNSの指定を正しくすることで問題が解決する。

もし、そのマシンのDNSサーバの指定を確認した結果、

  • 何も設定していない
  • 設定しているが、指定したDNSサーバのIPアドレスが間違っている
  • 指定したDNSサーバのIPアドレスは正しいが、DNSサーバが故障している

といったことが判明した場合、そのマシンでは、ドメインをIPアドレスに変換できない、という問題が発生していることを認識しないといけない。

ドメインをIPアドレスに変換できない問題が発生しているマシンでは、インターネット接続によるドメインベースでのサイト閲覧にも失敗してしまうので、上記のようなPHPエラーが表示された場合は、

  • PHPを動作させているマシンでのドメインベースでのサイト閲覧が成功するかどうか
  • nslookupを実行して正引きに成功するかどうか

といったことを問題の切り分けとして確認してみると良いかと思う。

2012年5月

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

アーカイブ

カテゴリー