2008年01月29日

アサーション(表明)の件

phpでもアサーションが使えるのですね。

<?php
$a = 0;
assert('$a == 0'); //trueなのでOK
assert('$a == 1'); //falseなので警告が表示されます。
//Warning: assert(): Assertion "$a == 1" failed in D:\phptest\assert0.php on line 4
?>


assert()の引数は論理型の条件または文字列を渡せます。が、文字列の方が便利です。

<?php
assert($a == 0); //trueなのでOK
assert($a == 1); //falseなので警告が表示されます。
//Warning: assert(): Assertion failed in D:\phptest\assert0.php on line 4
?>

文字列を指定しないと、何が失敗したかが警告に表示されません。

コールバック関数を指定して、失敗時の動作を記述する事もできます。
コールバック関数の引数は3つ、ファイル名、行数、コードです。

<?php
//コマンド・プロンプトでメッセージ表示するのにSJIS
mb_http_output('SJIS');

assert_options(ASSERT_CALLBACK, 'assert_handler');

function assert_handler($file, $line, $code)
{
echo "{$file}の{$line}で{$code}が失敗しました!!";
}

$a = 0;
assert('$a == 0'); //trueなのでOK
assert('$a == 1'); //falseなので警告が表示されます。
?>

コマンドプロンプトで実行すると、

D:\phptest>php assert0.php
D:\phptest\assert0.phpの14でが失敗しました!!
Warning: assert(): Assertion failed in D:\phptest\assert0.php on line 14

となります。
コールバック関数を使用する場合でも、assert($a == 1)と文字列ではなく論理式を指定すると3つ目の引数 $code に値が渡されません。

assertで大事なことは、assertを使用しない設定にしても、アプリケーションが正常に動作する事がです。
assertを無効にするには、assert_optionsやphp.iniでassert.active = 0にします。

assert使ってみようかな。デバッグが楽になるのかな?
posted by ほえ at 11:35| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2008年01月16日

キャッシュの有効期限…の件。

phpでmetaタグにno-cacheとかexpiresとか書いてないし、header()関数で
<?php
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // 過去の日付
?>
とか書いてないのに、ブラウザがキャッシュしてくれない。「ページの有効期限切れ」が表示されてしまう。という場合について調べてみました。

簡単に言ってしまえば、php.iniに
session.cache_limiter = nocache
session.cache_expire = 180
とデフォルトで書いてあるからです。

php.iniの設定を変更せずにコードで変更するにはsession_start()より前に、
session_cache_limiter('private_no_expire');
を書けば良いようです。

以前にも調べた事があったのに忘れてしまっていたのでメモしておきます。

下記サイトを参考にさせていただきました。
PHP/「ページの有効期限切れ」対策
ありがとうございます!
posted by ほえ at 15:39| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2007年12月27日

秀丸がVer7になって、単語補完をしてくれるようになったので、PHPの関数一覧を作る件

秀丸がVer7になって、単語補完をしてくれるようになったので、PHPの関数一覧を作ろうと思いました。

マニュアルページに関数一覧があったので、こりゃいいやと思ったら、使わない関数も大量にあるので、あんまり良くないなと思った。

なので、マニュアルページの関数毎のページ(配列関数)から関数一覧を取得するブックマークレットを作ってみました。
bookmarklet(ブックマークレット)は、ブックマークのURLに書いて使います。アドレスバーに入力してもいいですけど、何度も使うのでブックマークしておきます。

ページのbodyの直下にtextareaが表示されるので、そこからコピーします。


javascript:(function(){var u,i,uu,j,a,k,s=[];u=document.getElementsByTagName('UL');for(i=0;i<u.length;i++){if(u[i].className=='chunklist chunklist_reference'){uu=u[i].getElementsByTagName('LI');for(j=0;j<uu.length;j++){a=uu[j].getElementsByTagName('A');for(k=0;k<a.length;k++){s.push(a[k].innerHTML);}}}}(document.body.insertBefore(document.createElement('TEXTAREA'),document.body.childNodes[0])).innerHTML=s.join("\n")+"\n"})();


これで必要な関数だけ関数一覧が作れます。ちょっとめんどくさいけど…。

ブックマークレットってIEでは文字数の制限が厳しいですね。
最初Firefoxでは動くのにIEでは動かない原因がわかりませんでした。
ちょっとずつ記述を長くしていったらあるところで動かなくなったので、気がつきました。何文字くらいでしょう?430文字くらい?
ギリギリだったのかな?

IE6 SP2は、455文字みたいです。「javascript:」から最後の「;」まで。
うーん短い。
どうも、スクリプトによって文字数が違うようです。

javascript:alert('1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567');

だと、509文字ですが、動きます。

javascript: alert(a+a+a+a);

のように、スペースをいっぱい入れると動かなかったりします。

めんどくさいですね。
posted by ほえ at 15:51| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

秀丸で次の関数に移動するマクロを作ってみた件

秀丸でphpを編集してる時、次の関数にカーソル移動できたらいいなと思って、作ってみた。

searchdown "^[ \\t]*(static[ \\t]+)?((private|public|protected)[ \\t]+)?(static[ \\t]+)?function[ \\t]+[a-zA-Z_\\x7f-\\xff]+[ \\t]*\\(.*", regular, inselect, hilight;間違えた><

searchdown "^[ \\t]*(static[ \\t]+)?((private|public|protected)[ \\t]+)?(static[ \\t]+)?function[ \\t]+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\x7f-\xff]*[ \\t]*\\(.*", regular, inselect, hilight;


find_function_down2.mac

秀丸のあるフォルダに置いて、マクロ登録→キー割り当てでAlt+Ctrl+Downに割り当ててみた。

searchdownをsearchupにして別名で保存して、同じくマクロ登録→キー割り当てでAlt+Ctrl+Upに割り当ててもみた。

秀丸のマクロはincludeとかできないのかな?別マクロ実行するかiniファイル読込とかすればいいのかな?
posted by ほえ at 10:22| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2007年12月07日

可変変数って

phpの可変変数って、変ですね。さすが変が2つついてる。

可変変数は変数名が別の変数に入っていると思えばいいんですよね。

$a = 'abc';
$$a = 'xyz';
var_dump($abc); -> string(3) "xyz"

と$aに入っている文字列'abc'を変数名として扱うのに、$$aと書いているわけです。これは便利。

なのですが、

$b = 'a.b.c';
$$b = 'xyz';

とできてしまいます。
でも、

var_dump($a.b.c);

と書くわけには行きません…。「.」は文字列の連結だからです。
変数$a+"b.c"と全然意図した事と違う結果が出力されます。

こうすればできますけど。

var_dump($$b); -> string(3) "xyz"


さらにはこんな事も

$c = '';
$$c = 'uvw';
var_dump($$c); -> string(3) "uvw"

名前の無い変数を使ってる感じです。

この変な名前の件はクラスのメンバ(プロパティ)でも

class Hoe
{
public function __construct()
{
$mem = 'a.b.c';
$this->$mem = 'xyz';
}
}
$hoe = new Hoe();
var_dump($hoe);
->object(Hoe)#1 (1) {
["a.b.c"]=>
string(3) "xyz"
}

変なの。

連想配列でも
$arr = array('a.b.c' => 'xyz', '' => 'uvw');
var_dump($arr);
->array(1) {
["a.b.c"]=>
string(3) "xyz"
[""]=>
string(3) "uvw"
}
ですって。まあ連想配列は'a.b.c'はいいけど、空のキーって何よ!
posted by ほえ at 12:19| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2007年11月15日

StatusCodeを返す件

ネットの噂によると、PRGパターンというものがあるそうです。
という事で、phpでStatusCodeを返すには?と試してみました。
<?php
hader('Location:http://localhost/test.php');
?>

でリダイレクトしてくれます。
StatusCodeって何になってるんだろう?と思ってFireBugのNetタブで見てみました。出てない。それよりもここに表示されるのはリダイレクトした先のページにヘッダではないですか!
次にインストールしてあった「Microsoft Network Monitor 3.1」でパケットをキャプチャして見てみました。使い方はよくわかっていないのですが、とりあえずキャプチャ。HTTP関係が何も無いんですけど…。ローカルホストのページでテストしてました!ネットワークアダプタまでデータが行かないからキャプチャされないのですね。
別のPCにソースを置いてキャプチャしたら出てきました!
結果は 302 でした。
これ、303にしたい時はどうするんだろう?と思って、こんなことしてみました。
<?php
hader('StatusCode:303');
?>

??キャプチャしてみるとStatusCodeは200になってます。ヘッダの中にはStatusCode:303と出てきてはいるのですが…。
phpのマニュアルを見てみると、
<?php
header("Location:http://localhost/test.php", false, 303);
?>

とすれば、
HTTP レスポンスコードを強制的に指定の値にします。

2番目の引数のtrue/falseは、前に送信したヘッダを置換するか/追加するだそうです。デフォルトは置換だそうです。

なるほど。という事でメモ。
posted by ほえ at 11:43| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2007年11月13日

バイナリデータに対応した関数・マルチバイト関数

良くわからないのでメモしておきます。

たとえばexplode()関数は、
注意: この関数はバイナリデータに対応しています。
とマニュアルにあります。
そうか、じゃあ日本語も大丈夫なんだ。と思ってふと、バイナリデータってマルチバイトって事じゃないんでは?と考え直しました。

しかしながら、調べる時間が無いので、とりあえずメモしておきます。
posted by ほえ at 20:52| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2007年10月31日

Webアプリケーションを作ってみようと思ったら…php?

windowsにglassfishインストールしてみて思うのは、やはりphpは簡単なんだなと。Javaだとデスクトップアプリケーションを作るのか、Webアプリケーションを作るのかで何をインストールしていいんだかわからなくなったりするわけで。phpならWebアプリ作成しかないって感じですからね。Windowsのコマンドラインで使うには?なんて逆な事になったりするわけだけれども。とりあえずインストーラダウンロードして起動したらWebアプリ使えるんですもんね。
なんでmod_javaとかないんだろう?なんて変な事言ってますかね??
tracインストールする時、pythonも大変でしたもんね。何を入れていいのやら?って。
rubyは?やっぱりmod_rubyとか別にインストールしないといけないのかな?

apacheとかIISとか入れた後に簡単にセットアップできる言語?環境?ってなんだろう?phpの他には?C#とかって簡単なのかな?後は?perl?ActivePerlを入れてみよう。別にmod_perl2を入れないとダメなのですね。

なんだか最近windowsの方がアプリケーションというかソフトのインストールって面倒くさいなって思うようになっている気がします。
posted by ほえ at 14:23| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2007年10月26日

defineですが、何か?

phpのページでどんな変数が使われているのか見てみよう!と思ってこう書いてみました。
<?php
:
define(XXX, 'xxx');
:
foreach(get_defined_vars() as $key => $value) {
echo("$key = ");
var_dump($value);
}
?>
そしたら、
$php_errormsg = Use of undefined constant XXX - assumed 'XXX'
と出てきました。定数 XXX が定義されていない?
なんだろう?と思って延々調べました。
ずーっと調べてて、どうやらPEAR.phpをインクルードするとこうなる事がわかりました(実際は他のPEARモジュールがPEAR.phpをインクルードしていたんですけどね)。
@ini_set('track_errors', true);
この行があると$php_errormsgにエラーメッセージが入るようです。
これはなにをやっているかというと
track_errors boolean

有効にした場合、直近のエラーメッセージが、 $php_errormsg変 数に常に代入されます。
という事です。
もうちょっと調べてみて、
<?php
error_repoting(E_NOTICE);
define(XXX, 'xxx');
?>
とすると
Notice: Use of undefined constant XXX - assumed 'XXX' in C:\Program Files\Apache Group\Apache2\htdocs\test.php on line 3
と画面に表示される事がわかりました。

E_NOTICEは
実行時の警告。エラーを発しうる状況に遭遇したことを示す。 ただし通常のスクリプト実行の場合にもこの警告を発することがありうる。
だそうです。

defineすると、内部的にはエラー(お知らせ程度)が起きている。
設定ディレクティブ track_errors が true になっていないと、$php_errormsg にはエラーメッセージは設定されない。
error_reporting ディレクティブにはデフォルトでは E_ALL & ~E_NOTICE なので、E_NOTICEレベルの警告は画面等には出力されない。

という事ですね。

PEAR.phpはなんでtrack_errorsをtrueにしたかったんでしょうね。
posted by ほえ at 14:59| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2007年09月03日

preg_xxxのuの件

PCRE関数である、preg_xxxを使う時は
/xxx/u
とパターン修飾子'u'を指定しましょう。
これは、パターン文字列をUTF-8エンコードされた文字列として扱うための指定です。

$str = "PHPです!PHPです!";
preg_match_all('/P../u', $str, $match);
print_r($match);
この出力は
Array
(
[0] => Array
(
[0] => PHP
[1] => PHP
)

)
ですが、
preg_match_all('/P../', $str, $match);
print_r($match);
の出力は
Array
(
[0] => Array
(
[0] => P
[1] => P
[2] => P
[3] => P
)

)
になってしまいます。

同様に
$match = preg_split('/P../u', $str);
print_r($match);
Array
(
[0] =>
[1] => です!
[2] => です!
)
ですが、
$match = preg_split('/P../', $str);
print_r($match);
Array
(
[0] =>
[1] =>
[2] => す!
[3] =>
[4] => す!
)
となってしまいます。

気をつけよっと。
posted by ほえ at 18:41| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2007年08月25日

よく覚えていない!

でも、何かを覚えておかないといけない!
何を覚えておくのか覚えていないけど、何かを覚えていなければいけないから、ここに書いておく。
思い出したら、すぐ消す。
たいした事じゃないかもしれない、でも覚えておかなきゃいけない気がする!!

とりあえず、ニチレイから焼きカレーが出てることは書いておく。
これはそんなに大事なことじゃない、たぶん、きっと…。
posted by ほえ at 01:40| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2007年08月23日

proxyパターン?の件

またしても「まつもと直伝 プログラミングのオキテ 第8回 デザインパターン(1)」の図6の下あたりを読んでいて、proxyをphpでもできるのでは?と思って調べてみました。

phpには__callというマジックメソッド(特殊関数)があります。
これをどう使うのか良くわかっていませんでした。
delegate(委譲)に使えるのですね。
<php
class Proxy
{
private $obj;
public function__construct($obj) {
$this->obj = $obj;
}

public function proxy_method($param) {
echo("***{$param}***");
}

public function __call($name, $args) {
// echo("method name = {$name}\n");
// echo("args = ");
// print_r($args);

$this->obj->$name($args[0], $args[1], $args[2]);
}
}

class Hoehoe
{
function hoehoe_method($a, $b, $c) {
echo($a.$b.$c);
}
}

$p = new Proxy(new $Hoehoe());
$p->proxy_method('ppp'); //'***ppp***'
$p->hoehoe_method('a', 'b', 'c'); //'abc'
?>

委譲先のクラスのメソッドに対応したメソッドを書かなくてもよいのですね。
ただ、パラメータが気になりました。
__callの2つ目の引数が、もともとの引数を配列にしていますが、これを委譲先に渡す時に、
$arg[0], $arg[1], ... 
としなくてはならないのでしょうか?
配列を引数に展開する方法はないのかなぁ?
extract()は複数の変数に展開してくれるけど、結局その変数を書かなくてはならないし…。
  extract($args, EXTR_PREFIX_ALL, 'tmpvars'); //$tmpvars_0 = args[0], $tmpvars_1 = args[1] ...としてくれる
$this->obj->$name($tmpvars_0, $tmpvars_1, ...) //変数名書かないとダメ


何かいい方法はありませんかね?

call_user_func_array()が使えそう。
<php
class Proxy
{
private $obj;
public function__construct($obj) {
$this->obj = $obj;
}

public function proxy_method($param) {
echo("***{$param}***");
}

public function __call($name, $args) {
// $this->obj->$name($args[0], $args[1], $args[2]);
// call_user_func_array('$this->obj->'.$name, $args);とやってみたけどダメでした。'$this->obj->xxx'としたかったんですけど…
//こうやればいいらしいです。
call_user_func_array(array($this->obj, $name), $args);
}
}

とするとできました。
しかしながら、
array($this->obj, $name)
の意味がわかりません。
どこかで見た気もするのですが…。謎です。

ここにありました。call_user_func_array()は1番目の引数に'callback型'を取るのです。そして、
 オブジェクトのインスタンスを作成するための方法の 1 つは、 オブジェクトを 0 番目の要素、 メソッド名を 1 番目の要素として含む配列を渡す方法です。
静的なクラスメソッドの場合、 0 番目の要素としてオブジェクトを渡す代わりにクラス名を渡すことにより、 オブジェクトのインスタンスを作成せずに渡すことができます。
ですって。
意味がわからない…
英語版のマニュアルを見ると
A method of an instantiated object is passed as an array containing an object as the element with index 0 and a method name as the element with index 1.
との事なので、
インスタンス化されたオブジェクトのメソッドは、
オブジェクトを0番目の要素、メソッド名を1番目の要素とした配列として渡すことができます
ってところでしょうか。
なるほど。
これ、ずいぶん前にphp4でデストラクタとしてregister_shutdown_function()を使うらしいというのを調べた時に同じように「なんで配列?」って悩んで調べてました。
メモしてなかったからわすれてました><
#いや、メモしてあったけど、忘れてました;;。

ずいぶん遠くまで来たような気がするけれども、わー、すっきり。

...この調べものの途中で、phpでも無名関数を作成できることを知りました。create_function()です。これは次に書こうと思います。
posted by ほえ at 15:22| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2007年07月23日

fgetcsv()で日本語が入っているフィールドが正しく読み込まれない件

まだ良く調べていないのですが、fgetcsv()は日本語が入ると正しい結果を返さない?
$handle = fopen('hoehoe.csv', 'r');
$arr = fgetcsv($handle);
fclose($handle);

とすると、hoehoe.csvが
1,abcdefg,−,xxx

のとき、
$arr[1]
は''になってしまうようです。データ中の−は全角のハイフンです。
とりあえず、そういうことがあったという事を忘れないようにメモ。
posted by ほえ at 01:16| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

basename()で日本語の件

まだ良く調べていないのですが、basename()は日本語が入ると正しい結果を返さない?
$a = 'abc\def\木村だっけな?.jpg';
$b = basename($a);

とすると、$bには
.jpg
しか入っていないような。日本語の文字列がなんだったか忘れちゃったけど。
とりあえず、そういうことがあったという事を忘れないようにメモ。
posted by ほえ at 01:13| Comment(0) | TrackBack(1) | PHP | このブログの読者になる | 更新情報をチェックする

2007年05月23日

正規表現の\(円マーク)について

mb_ereg, mb_ereg_replaceで\(円マーク)の使い方で相当悩んだので書いておきます。

$result = mb_ereg(パターン, 対象文字列[, $regs]);
一致しなければ、$result === false。
$regsを指定すると、一致した文字列の配列が入ります。
例)
mb_ereg('(abc)+', 'abcabcdef', $regs);
->$regs = array(
[0]=>abcabc,
[1]=>abc
);

$retstr = mb_ereg_replace(パターン, 置換文字列, 対象文字列);
例)
mb_ereg_replace('(abc)+', 'ABC', 'abcabcdef');
->ABCdef

ここでパターンに\(円マーク)を入れたい場合、面倒です。
mb_ereg('\\\\', '\a', $regs);
->$regs = array([0]=>\);
と\(円マーク)が4個もいります。

'\\'で良いかと思ったら、正規表現内で'\'となって、
「正規表現がエスケープで終わってるよ!」
と怒られます。
'\\\'だと正規表現内での'\'と、"\'"という「'(シングルクォーテーション)をエスケープしたもの」になってしまってシンタックスエラーです。
'\\\\'でやっと正規表現内で'\\'となります。

エスケープする文字を変更できないと大変ですね。



'\':'のエスケープ
'\\':正規表現の\が一個
'\\\':\ + 'のエスケープ
'\\\\':\1個の置換(正規表現内では'\\'。やっと/\/と同じになりました)。
'\\\\\':\ + 'のエスケープ
'\\\\\\':\ + 正規表現の\
'\\\\\\\':\ + 正規表現の\ + \'
'\\\\\\\\':\ + \ -> \\の置換
タグ:正規表現
posted by ほえ at 12:22| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2007年03月15日

PHPのマニュアルの件

PHPのマニュアルの使い方を間違っていました。
今までPHPのマニュアルは
http://www.php.net/manual/ja/を見ていました。
「今やなんでもウェブだぜ」なんて思って。
chmのヘルプをダウンロードして、エディタの外部ヘルプに設定しました。なんて便利なんでしょう!
chm形式のヘルプファイルがあるのは知っていました。PHPのマニュアルのあるサイトが時々アクセスできなくなったりしたので、そんな時のために一応ダウンロードはしてあったのです。

しかし、編集中のキーワードから直接PHPのヘルプが参照できるのは、なんて便利なんでしょう。

これからはこれでいこう。
posted by ほえ at 15:50| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

PHPで日本語のファイル名のファイルを扱う件

windowsでphpを使っているのですが、UTF-8にしているのです。
で、windowsの日本語のファイル名はSJISになっているので、file_exists()で調べたりするのにはどうしたら?
というのと、コマンドライン(CLI)で使いたいんだけど、それもどうしたら?
というのでこんなにしてみました。



<?php
//p(mb_internal_encoding());
//SJISで出力するには、この設定が必要です。
mb_http_output('SJIS');

//そのまま出力するのに、mb_convert_encodingはいりません。
//p(mb_convert_encoding('あ'));
p('あ');

//ファイル名として使用する場合は、mb_convert_encodingが必要です。
//if(file_exists('"あいうえお.jpg"') === true){
if(file_exists(mb_convert_encoding('"あいうえお.jpg"', 'SJIS')) === true){
p('あった!');
}

function p($data){
echo($data."\n");
}
?>



よくわからないですが、
mb_http_output('SJIS');
が、コマンドプロンプトで出力するときにも有効なのですね。httpっていう名前なのに…。

最初、echoなどで画面に出力する場合と、file_exists()など内部で使用する場合の区別がつかず、混乱してしまいました。
なのでコマンドラインでphpはあまり使っていませんでしたが、これで色々な事に使えるようになりそうです。
posted by ほえ at 15:36| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2007年02月28日

pdoではまった件

php5.2.0でpdoを使ってみようと思いましたが、はまったので書いておきます。

環境は
FreeBSD6.1
php5.2.0
postgresql8.2.3
です。phpもpostgresもソースをダウンロードしてコンパイルしました。

まず、pdoはphp5.1からはデフォルトで組み込まれているという事でしたのでそのままコンパイルしてみました。

で見てみると、PDOの項目があって、sqliteが使用できるようです。
postgresを使用できるようにするには?と思いましたがマニュアルにはそれらしき記載がありません。なんだか「詳細についてはデータベース固有の PDO ドライバ を参照ください。」なんて書いてありますけど、PostgreSQL関数のところには書いてないみたいです。

php-5.2.0のソースのディレクトリで
./configure --help
ってやったらオプションについて説明が色々出てきましたよ。
その中に

--with-pdo-pgsql[=DIR] PDO: PostgreSQL support. DIR is the PostgreSQL base
install directory or the path to pg_config

とありました。
なのでこんな感じにしてみました。
./configure \
--with-apxs2=/usr/local/apache2/bin/apxs \
--enable-pdo \
--with-pgsql \
--enable-mbstring \
--with-pdo-pgsql \
--without-pdo-sqlite \
--without-sqlite
で、phpinfo()をみると、PDOの項目があって、
PDO
PDO support enabled
PDO drivers pgsql
こんな感じです。

PDOのマニュアルを見ると、共有モジュールにしたほうが便利みたいな事が書いてありました。後でアップデート版をインストールする事はないだろうと思いますが、ためしにやってみました。

./configure \
--with-apxs2=/usr/local/apache2/bin/apxs \
--enable-pdo=shared \
--with-pgsql=shared \
--enable-mbstring \
--with-pdo-pgsql=shared \
--without-pdo-sqlite \
--without-sqlite

こんな感じで。
make
su
make install
した後に、出来上がった共有モジュールへのシンボリックリンクを作成
ln -s /usr/local/lib/php/extensions/no-debug-non-zts-20060613/pdo.so /usr/local/lib/pdo.so
ln -s /usr/local/lib/php/extensions/no-debug-non-zts-20060613/pdo_pgsql.so /usr/local/lib/pdo_pgsql.so

/usr/local/lib/php.iniを編集。
extension_dir="/usr/local/lib"
extensions=pdo.so
extensions=pdo_pgsql.so

シンボリックリンクではなくてコピーしてもいいのかもしれません。
php.iniのextension_dirは最初
extension_dir="./"
となっていました。このカレントディレクトリっていう指定はどこの事?この指定ではまってしまいました。

最初このextension_dirの指定の方法がわからなくてデフォルトの
extension_dir="./"
のままにしてました。カレントディレクトリ以下のディレクトリも参照してくれるのかと思ったりもしたりなんかしてたのですが、PDOの共有モジュールが読み込まれなくて、phpinfo()でPDOの項目が出てきませんでした。

次にpdo.soとpdo_pgsql.soのシンボリックリンクを作成してみたのですが、やはり、PDOの共有モジュールが読み込まれなくて...。

include_pathみたいに
extension_dir="./:/usr/local/lib"
ってやってみたらPDOの...。

で結局、シンボリックリンク作って、/usr/local/libを指定するという事に落ち着きました。
ずーっとよくわからなくて、configureの指定がいけないんだと思い込み、何度もコンパイルをし直してしまいました。

configureのオプション指定もenable-pdoをwith-pdoと間違えたり、pdo_pgsqlをpdo_pqsqlにしちゃったり散々やり直したのでした。

あまりにも間違えたのでメモしておきます。
extension_dir="./"がどこを指しているのかは結局わかりませんでした。
あとextension_dirについてマニュアルには記述が少ないと思いました。複数指定できるのかと思っちゃいましたし。

まぁいつもの失敗の話です。

2007/03/07 追記
シンボリックリンクを張るのは
/usr/local/lib
よりも
/usr/local/lib/php/extensions
の方がよさそうですね。
php.iniの記述も
extensioin_dir=/usr/local/lib/php/extensions
という事の方が。
posted by ほえ at 12:26| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2007年01月24日

PHPのマニュアルがわからなかった件

PHP4の代入の話。コピーなのかリファレンスなのか。

コンストラクタの内部での参照の最後の例がわからなかったです。

英語のマニュアルを見たら、
// 以下の単純なコピーが、* 印を付けた行で望ましくない結果を生む理由を
// 考えてみてください。
// try to understand why using a simple copy here would yield
// in an undesired result in the *-marked line
となってました。
これはひょっとして、
$a =& new A(10);
$a->createRef();
...
の =& が = だと問題があるという事なのでは?
実際 =& を = にすると、
class A: 10
class B: 10
class B: 10
class A: 11
class B: 11
class B: 11

class A: 10
class B: 10
class B: 10
class A: 11
class B: 10 <--
class B: 11

になりますから。

PHP5だと、もんだいありません。= での代入がリファレンスが代入されるので。
posted by ほえ at 15:13| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2006年12月29日

コネクションの件その2

ブラウザからサーバにアクセスがあるとapacheのプロセスが起動するのですね。
または、クライアントに送信を行っていないプロセスを使うのですね。
そのアクセスのあったページが.phpで、PostgreSQLに持続的な接続をしてデータを取りに行く処理が記述されていると、その起動されたプロセス毎にPostgreSqlに持続的な接続をしに行くわけですね。
または、既に起動していたクライアントに送信を行っていないプロセスの持っている持続的な接続を再利用するのですね。

前回書いた設定がされていると、
php.iniでは持続的な接続数に制限がない。
postgres.confでは(持続的な接続に限らず)同時接続数を100に制限している。
という事ですね。

例えばそのページが何かの一覧を表示するページで、「次のページへ」なんていうリンクがあったとして、次々にページめくりをしていくと接続数がいっぱいになってしまって、接続できなくなるのではないでしょうか?
プロセスはいつ終了するのでしょうか?
Postgresへの接続はいつ切断されるのでしょうか?
posted by ほえ at 21:25| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。