ブラウザの戻るボタンでフォームが消える

2010/01/27 | その他

お問い合わせフォームなどで、送信ボタンの直前に「プライバシーポリシー」へのリンクを用意しておくのはよくあること。このリンクを同じウインドウで開くか別ウインドウで開くか、ということで問題が出ることがある。

別ウインドウで開く場合、例えばポップアップ用として別途(ポップアップ専用のヘッダとフッタをつけた)HTMLをコーディングしておくのはひとつの手段。しかし大抵の場合はプライバシーポリシーは、通常デザインのものがあるはずなので、おのずと2ページのプライバシーポリシーができてしまう。これはプライバシーポリシーを改訂する際は面倒だ。

かといって、通常のヘッダとフッタのままのHTMLをポップアップさせるのはイマイチ。

同じウインドウで開く場合だが、送信ボタンの直前にリンクを配置すると、たいていフォームに入力した後にそのリンクをたどることになる。その場合、リンク先を見た後、ブラウザの戻るボタンでフォームに戻るのだが・・・入力した内容が消えている、ということもあるはずだ。

これを回避する方法。session.cache_limiterの値をnoneにしておく。ブラウザのキャッシュを制限しないためのヘッダを出力してくれる。これでフォームページから離脱してブラウザの戻るボタンで戻ってもフォームの値が残っている。

Spreadsheet_Excel_Reader

2010/01/26 | PHPライブラリ

仕事でSpreadsheet_Excel_Readerを使ったんだけど、どうも腑に落ちない症状が発生する。エクセルファイルを読み込む際にメモリが足りないとエラーが出る。その値がいつも「67108864」になるのだ。つまり64MB。いつでも64MBなのだ。

memory_limitを4MBにしても128MBにしても同じ数字が出る。なぜだ。

ライブラリ内にもmemory_limitの記述がないのだが、どこかに何らかの記述があってそれが影響しているのだろうけど、でもそれがなんだかわからない。調べる時間もない。

とりあえずすぐに手を付けることは出来ないけれど、そのうち時間が取れたらPHPExcelで試してみることにする。いずれにしても情報は少なそうだけど。

Cache_Liteのバグか

2010/01/25 | Cache_Lite

PEARのCache_Liteはいつもよく使っているのだが、これってバグじゃないか、と思える症状に出くわした。

if(!$lines=$cacheObj->get($cacheId)){
$lines=hoge();
$cacheObj->save($lines,$cacheId);
$this->cached[$cacheId]=$lines;
}

上記の処理は、キャッシュIDを指定してキャッシュされているかどうかチェックし、キャッシュがなければhoge()関数を使ってデータを取り出して、改めてキャッシュに保存する、という処理を書いている。

この処理自体はなんの問題もなく動作する。しかしこの処理を、ひとつのスクリプト内で2回呼び出すとエラーになる。「そもそも1回取得しているデータなんだから2回も呼び出すことはないだろ」と言われるかもしれないが、例えばスクリプトをクラス化し、共通のデータをそれぞれ別の処理で使用するようなとき、2回呼び出したほうが記述がスマートな場合もある。

回避方法としては、結局データを一時的に格納する変数を作成し、そこもチェックするようスクリプトに手を加えることで対応した。これってバグだと思う。というか、もしかしたら、Cache_Liteそのものに回避方法があるのだろうか。

といっても最新版ではなくて、1.51の話(2008年6月のリリース)。現時点での最新版は2009年7月の1.7.8。新しいバージョンでチェックしてみなきゃ。っていうか、新しいバージョンを使わなきゃ・・・。

MySQLのvarchar型の長さについて

2010/01/15 | MySQL

最近気がついた。MySQLのデータ型でvarcharというのがある。varcharを指定した場合、そのカラムに格納することができる文字の長さを指定してやらなければならない。この「長さ」というのは「文字数である」ということに気がついた。

「文字数」とは文字通り「文字の数」。マルチバイトもシングルバイトも関係ない。全角も半角も関係ない。半角アルファベットの「ABCD」や「1234」、全角アルファベットの「ABCD」、平仮名の「あいうえ」、混在した「aAあ1」。これらは全てvarcharでいうところの「長さ4」になる。

文字って奥が深い。

メール配信は直接SMTPをたたく

2010/01/13 | メール

PHPでメールを大量に配信する方法を検討している。ウェブの管理画面から送信処理をするのだが、CLI版PHPで書かれたメール配信プログラムを、DSO版(モジュール版)PHPでキックし、メール配信プログラム内では、ループして送信するような処理はずっと以前から記述していた。とりあえず、それで事は足りていた。

しかしいろいろ調べる内に、もっと真面目にメール配信する手法を検討しようと言う気になった。それはマニュアルのmail関数の注意事項を読んでから。

注意: mail() 関数は、大量のメールをループ内で送信するには 向いていないことに注意しましょう。この関数は 1 通のメールを送信するたびに SMTP ソケットをいったん閉じて開きなおします。これは非効率的です。
大量のメールを送信する場合は、 » PEAR::Mail および » PEAR::Mail_Queue パッケージを参照ください。

メールの送信はmb_send_mail関数を使っているが、おそらく基本的な動作はmail関数と同じだろうから、これでは効率が悪いと言うことになるのだろう。より効率良くするためには「直接SMTPを話す」事になるとのことだ。個人的には「PHPで直接SMPTを話すなんて遅そう」と思っているのだが、そうではないらしい。今回使ってみようと思うのは、QdSmtpとQdmailの組み合わせ。

QdSmtp
Qdmail

スポックさんと言う人が書いているのだが、この方のメール配信系のプログラムにお世話になっている人も多いようだ。テクメモで以前書いたQdmailReceiverもこの方の成果物だ。

プログラムの記述方法は、実際に使用してからメモするとして、これらのプログラムを使うことで、ひとつのソケット接続で、ぽこぽことメールを送信できるようになる。PHPで大量のメールを送信する際に注意すべき事項(調べて出てきた重要そうな事項)をメモしておくことにする。

  • mail関数を使用せず、PHPで直接SMTPを話す。
  • 一定数送信したら、一定時間休む。
    sleepするような処理を入れる方がよいらしい(迷惑メール対策等で携帯宛などの場合連続して送信された大量メールは拒否られる可能性がある)。
  • BCCで、例えば10通ずつとかまとめて送る方法もあり(TOの指定が必要だけど)。
  • 基本的にループで処理するのだが、全てのプロセスを一つのプロセスで実行しようとせず、プロセスを分ける方法も考える(メモリリークとか)。

さてと、どうやって書こうかな。


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