持続的接続を理解するために(その4)

2009/12/04 | MySQL, PHPの基本

register_shutdown_function()の動作を確認しておく。

http://jp.php.net/manual/ja/function.register-shutdown-function.php

void register_shutdown_function ( callback $function [, mixed $parameter [, mixed $… ]] )

$functionで指定した関数を、当該スクリプトが終了した時点で実行される。出力バッファが空になってから(全ての吐出しが終わった、さらにその後に)呼び出される。コールバック関数を使って出力することも出来るけど、出力バッファの処理と切り離して考える必要がある。出力バッファ内で文字コードの変換とかいれたりしていると、思いもよらぬ結果(複数の文字コードで出力してしまう)といった現象にも遭遇しそう。

あと、この関数は1度コールすると一つの関数を登録する。複数回コールすると複数の関数を登録できる。関数は登録された順番に、スクリプト終了後に実行される。

だから持続的接続での仕様を考慮に入れると、引数にデータベースへのリンクIDなどを渡しておいて、トランザクションをロールバックしたりテーブルのロックを解除する関数を起動すればよさそうだ。

ただし注意が必要で、exit()をコールした場合は、それ以降シャットダウン関数は実行されない。だから、いくらこの関数で後始末をする処理を登録しておいても、スクリプト中にexit()などが記載されていると、やはり後始末がないままで、コネクションが継続してしまうことになる。

exit()はスクリプト中だけでなく、登録された関数中にあっても同様。複数の関数が登録されていて、最初の関数でexit()が呼ばれたりすると、登録された後続の関数は実行されない。ここも注意が必要だ。

テストのときは気軽にexit()することも多いので、気をつけないと。

持続的接続とapacheの動作を理解したいのだが

2009/12/02 | apache, PHPの基本

いろいろ調査中。プログラムを始めて間もない頃(というかつい最近まで)は、プログラムは動きさえすればよかった。そしてセキュリティを気にするようになり、最近は速度を気にするようになった。順番はどうでもいいが、より高度なステップにチャレンジしようとしている自分がいる。もちろんそれはいいことだと思うが、だんだんそれが難しくなってきた。

データベースへの持続的接続について調べている。PHPのマニュアルを見るだけでは全て理解できなかった。もちろん自分のスキルが足らないのでしょうがないのだが、マジメに調べるうちのウェブサーバ(apache)をよく理解する必要に迫られた。しかしこちらも難しい。一通り、apacheを動作させるために必要な基本的な設定はネットワーク管理者時代にやっているが、apacheを速度面でチューンアップしたことなどないからだ。

プロセスという言葉はなんとなく理解できるが、プロセスが子プロセスを産んで・・・、みたいな言葉が次から次へと羅列されると、ちょっとお手上げな感がある。そしてそれらを平易な言葉で説明してくれるような文献はない(素人でもわかるように、とは言わないけど、もうちょっとなんとか・・・)。そうすると、あと思いつく方法は、どういう動作をするようになっているのか、PHPなりapacheなりのソースコードを読め、ということになる。C言語もまた自分にとっては未知の領域だ。

マジメにやろうとすればするほど、自分の範疇も拡大し続けないといけない。これもまた当然。「いくつになっても勉強」にも賛同するが、年齢を重ねると、学習するための能力が著しく低下しているのがよくわかる。理解の進み具合が明らかに遅いのだ。

持続的接続と非持続的接続(通常接続)とapacheのプロセス。メリットとデメリット。平易な記載のあるサイトがあれば、是非教えていただきたい。

CSVで書き出す関数fputcsv

2009/10/31 | PHPの基本

CSVファイルを取り扱うのに便利な関数にfgetcsv、fputcsvがある。CSV吐き出し機能が欲しかったので、fputcsvの仕様を検証してみることにした。マニュアルではこんな具合に書かれている。

int fputcsv ( resource $handle , array $fields [, string $delimiter [, string $enclosure ]] )

マニュアルによると$delimiterは1文字でなくてはいけないらしい。だから$delimiterに2文字以上の文字列(例えば「<>」)を指定するのはNGらしい。同様にタブを「\t」と指定するのもダメらしい。この場合はchr関数を使ってchr(9)と記述しなくてはいけないらしい。1バイトってことかな。$enclosureも同様。

この関数で便利だなと思ったのは、配列内の値にエスケープすべき文字列(「,」と「”」)が含まれているとき、うまく取り計らってくれることだ。それらの文字列が入っていると、自動的に「”」で囲み、「”」の場合はエスケープまでしてくれる。これはとても便利。でも、不便なのは、エスケープすべき文字が入っていない場合は囲み文字で囲んでくれないということ。個人的には数値以外は全て囲んで欲しいのだが、そういう意見は少ないのだろうか。

でもまぁ便利。使ってみることにする。

CGI版PHP用の設定

CGIとしてPHP4をインストールし、PHPスクリプトの1行目にパスを記述して、ウェブからアクセスしてみた。しかし500エラーが返ってきた。Apacheのログを見ると「Security Alert!」「The PHP CGI cannot be accessed directly.」とある。でも、これ意味がよくわからない。さらにメッセージが並んでいるのだが、自分の英語の読解力が低いせいか、全部読んでも意味がわからない。

調べてみると、設定ファイルを変更すればよさそうだ。

cgi.force_redirect=0

やっぱり意味がわからない。設定変更して、Apacheを再起動し、スクリプトがPHP4のCGIとして動作することを確認できた。セキュリティの問題らしいので、詳しくドキュメントを読み込む必要がありそうだ。ま、とりあえず、これでよし。

今さらPHP4をインストール

2009/10/12 | PHPの基本

今更PHP4を使いたいなんて絶対思わないけれど、過去の遺産があってどうしてもPHP4を使わざるを得ない状態になってしまった。しょうがない。自分でサーバの設定をするのは不本意ではあるけれど(プログラムしかできないと世間では通している手前)、インストールすることにした。

まずPHP4のソースをダウンロードしなくてはいけない。普通に検索しててもぜんぜん見つからなかったんだけれど、検索結果を漁ってようやくわかった(こんなところにリポジトリってたのね)。「museum」・・・たしかに博物館的遺物。

http://museum.php.net/php4/

お好きなバージョン(普通はlatest)を選んでダウンロード。今回は4.4.9。PHP4はこれが最終リリース。そしてまず解凍し、解凍したディレクトリに入る。

tar xvfx php-4.4.9.tar.gz
cd php-4.4.9

とりあえず、configureしてみる。もちろんここで、いわゆるPHPのconfigureオプションを指定(しなければデフォルト・・・ってデフォルトが何かは知らないけれど)。

./configure
:
:
configure: error: no acceptble cc found in $PATH

エラーだそうです。開発環境が用意されてないとのことなので、とりあえずインストール。

yum install gcc

これでインストールOK。再度configureを実行。

configure: error: cannot find output from lex; giving up

またエラー。lexって何だよ、って思って調べたら、flexってのが必要になるらしい。

yum install flex

これでインストールOK。再度configure実行で、一応正常終了した。そしてmake。

make

ずらずら処理内容が記述されて、いちおうおなじみのThankYou画面が表示された(この画面は何年かぶりに見たので、少しうれしい)。あとはmake installでインストール完了。今回はcgi版だけが必要だったので、sapi/cgi/phpだけを/usr/bin/php4という名前でコピーした。他にも必要なのかもしれないけれど、とりあえずそれだけ。

いまだに、こうやって過去の遺産を漁っている人はいるのだろうか・・・。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net