jQueryのajax処理で

2010/09/11 | JavaScript/Ajax

jQuery-1.4.2を使っていて生じた問題についてのメモ。

jQueryを使ってajax処理し、結果をjsonで受け取るなんていうのはよくある話。普段から使っていた処理なのに、今回どうにもこうにもはまってしまったのでメモ。

ajaxメソッドの引数のオブジェクトで{success:hoge,error:fuga}と成功時と失敗時でそれぞれ関数を定義しておいた。基本的にはhoge関数が起動してその中で処理が行われ、fuga関数自体が起動されることはまずないはず、と踏んでいた。しかしどうしてもhoge関数が呼ばれず、fuga関数ばかりが呼ばれてしまう。理由がわからない。

まずfuga関数の第2引数をダンプしてみた。「parseerror」の表示。つまりサーバから送られてきたレスポンスがjsonオブジェクトになっていない(フォーマットが間違っている)というエラーだ。最初はてっきり「あ、またヘッダつけるの忘れた」と思い、PHP側で以下の1行を追加してみたが結果は変わらない。

header(‘Content-Type: application/json; charset=utf-8′);

どうにもこうにも原因がわからないので、根本的に「JavaScriptのオブジェクトってこのフォーマットであってたっけ」みたいなことも考えてみた。PHP側からの出力は最初、以下のようにしていた。

{result:0, message:’エラー’}

JavaScriptとしては正常なオブジェクトのように思うのだが、jQueryはこの形式がお嫌いのようだ。まず問題を簡単にするために[]とか{}とかで返してみた。この場合は正常にパースしてくれる。次に[1]や[1,2]としてみた。これもOK。そして[‘1′]。これはパースエラーになった。もしやと思い[“1″]。これはセーフ。つまりシングルクォーテーションでくくるのはダメらしい。マジかよ。

次にオブジェクトをチェック。{“result”:0}はOKだけど{result:0}はNG。つまり添字になる部分もダブルクォーテーションでくくれってことになっている(シングルクォーテーションの場合もNGだった)。

結果として、以下の文字列で返すことで正常にパースできるようになった。

{“result”:0, “message”:”エラー”}

なんだか解せないが、とりあえずヨシとする。

中国のスパム最悪

2010/09/08 | その他

自分が運営しているサイトで中国からのスパムがうざい。いろいろ調べたが、やはり確実なのはかたっぱしからIPアドレスで拒否ることだけのようだ。

IPv4アドレスは世界で5つの地域インターネットレジストリが管理していて、どの国にどのIPアドレスが割り当てられているかを確認できる。それらのリストは以下のとおり。

ftp://ftp.arin.net/pub/stats/arin/delegated-arin-latest
ftp://ftp.ripe.net/pub/stats/ripencc/delegated-ripencc-latest
ftp://ftp.apnic.net/pub/stats/apnic/delegated-apnic-latest
ftp://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-latest
ftp://ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-latest

ftp://ftp.arin.net/pub/stats/arin/delegated-arin-latest
ftp://ftp.ripe.net/pub/stats/ripencc/delegated-ripencc-latest
ftp://ftp.apnic.net/pub/stats/apnic/delegated-apnic-latest
ftp://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-latest
ftp://ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-latest

ここからCNなIPのリストを作ってはじけばよさそう。少し時間があれば、スクリプトでうまく作れそうだけど、時間がないので、とりあえずの対応だけしておいた。

あーほんとむかつく。

postgresqlの起動は・・・

2010/09/05 | PostgreSQL

NTTPC Communicationsが提供するWebARENAのVPSを追加契約した(現在3台目)。ここのVPSは基本的にまず落ちない。過去5年くらい使っているけど、落ちたのはメンテナンスの時だけ(もちろん事前のアナウンスあり)。だからミッションクリティカルな案件の時は必ずこのVPSを使うことにしている(サポートも悪くないし)。

そのサーバではMySQLでサービスを構築するはずだったのだが、急遽PostgreSQLを別件で使用することになった。早速使おうと思って、initdbコマンドを発行しようとしたところ、コマンドが見当たらない。「あれっ」と思って、/etc/rc.d/init.d/以下のPostgreSQLの起動コマンドを探したけど、それも見つからない。なぜだ。

いちおうデフォルトでPostgreSQLも使えることになっているのだが「もしやインストールされていないのでは」と思ってrpmコマンドで確認してみた。

  • postgresql
  • postgresql-libs

入っているけど・・・、これでよかったっけか。普段使っていないので、いいか悪いかもわからない。ちょっとウェブで調べてみたら・・・。ない。postgresql-serverがない!。

yumコマンドで早速インストール。これでinitdbコマンドも起動コマンドもインストールされた。初期状態じゃ、使えないんじゃん。

PHPからバックグラウンド処理を実行させる(その2)

うまくいっていたのに、その後いろいろ試してみると、やっぱり時間がかかっている。待たされ感がある。バックグラウンドプログラムをコールするのは上手くないのかもしれない。

PHPからバックグラウンド処理を実行させる

ウェブ画面のレスポンスはどれだけ遅くても数秒程度で帰ってきて欲しい。しかし時間がかかる処理というものもある。その時はフロントエンドの画面では「処理を開始しました」と表示しておき、バックグラウンドで実行プログラムを起動する方法が有効。

PHPの場合、exec関数を使えば、PHPでもJavaでもシェルでもなんでも呼び出せる。

その呼び出し方だが普通に以下のようにコールするのはまずい。

exec(‘/usr/bin/php program.php’);

これだと、program.phpが終了するまで、フロントエンドは待たされることになる。つまりバックグラウンドになっていない。

exec(‘/usr/bin/php program.php &’);

「&」をつけてバックグラウンドで処理しろっ。でもだめ。これでも待たされることになる(これはなぜだかわからないんだけど、実際そうなる)。

exec(‘/usr/bin/php program.php >/dev/null 2>&1′);

正解はこれ。別にリダイレクト先は/dev/nullでなくてもよいし2>&1もなくてもOK。とにかく出力しない、ってことにしておけばよさそうだ。

一応マニュアルにも書いてある。

プログラムがこの関数で始まる場合、 バックグラウンドで処理を続けさせるには、 プログラムの出力をファイルや別の出力ストリームにリダイレクトする必要があります。 そうしないと、プログラムが実行を終えるまで PHP はハングしてしまいます。

文章分かりにくい。まぁ、確認の意味も兼ねて、実証してみた。


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