最初はApacheネタで行くつもりが、最近は何でも有りになってきた。
うっかりソフトの世界に来てしまったエンジニアの苦悩・・・
うっかりソフトの世界に来てしまったエンジニアの苦悩・・・
2012-03-12
PHPで自由フォーマットのPOST
php | |
![]()
PHPでPOST
普通は$_POSTを使う。
これは
key1=value1&key2=value2&....
こんな形式のPOSTデータを
array( 'key1' => 'value1' , 'key2' => 'value2' ...);
の様にパースして渡してくれるが
逆に、この形式になっていないと
array();
が返って来る
しかしajaxでjsonをやり取りする場合など、生のPOSTデータが欲しい場合があり
その場合はこの様に取る
$STR = file_get_contentsf('php://input');
ただしこの場合$_POSTも作成(しようと)しておりこれはCPU性能的に無駄!!
しかも$_POSTまで作成出来てしまった時はメモリー的にも無駄無駄無駄!!
Apache&PHPではメモリーとの戦いになる事が多いので後者は勘弁して貰いたい訳です。
スマートに解決
そんな訳で綺麗にしてみた。
まずは$_POSTを節約
php.ini の設定は通常こんな感じだと思いますが・・・
variables_order="GPCS"
Pを消します
variables_order="GCS"
PHPコードでうねうね
あとはPOSTデータがパース可能なら$_POSTを作り
そうでなければ生データのまま扱うコードを書くだけですが
パーサを自前で作るのは頭が悪すぎます。
PHPが$_POSTを作ってるんだがら何か関数があんだろ?
と軽く思ってたら中々見つからない・・・
でもやっとこさ見付けた。
http://php.net/manual/ja/function.parse-str.php
センス悪っ!!名前ダメ過ぎだろ!!検索し難い訳だ
そんな訳で最終的なコード
if ( $_SERVER[REQUEST_METHOD] === 'POST' ) {
$STR = file_get_contents('php://input');
if ( preg_match('@^(?:[^=&]*=[^=&]*(?:&[^=&]*=[^=&]*)*)?$@',$STR,$matches) !== 0 ) {
Log::trace($NAME,'Query format');
parse_str($STR,$POST);
}else{
Log::trace($NAME,'Not Query format');
$POST=$STR;
}
}
一応マジメにパース可能か否かのチェックを掛けているがCPU的にはパースと同じ位の負荷が掛かってしまっている。
もっと大雑把でも良いと思う。
最初は行き成りparse_str()に渡して空だったら・・・みたいな判定をしていたのだが
中途半端にパースして妙なarray()を生成してくたのでこうなった。
効果計測
試しに1MB程度のデータを扱って見た所、こんな感じでちゃんと効果が現れてる模様。。
よかったよかった
- variables_order="GPCS"
$ ps aux | grep httpd
500 25775 6.7 1.1 230572 36732 ? S 17:07 0:00 /usr/local/apache-2.2.21/bin/httpd -k start
↑ココが使用メモリ
- variables_order="GCS"
$ ps aux | grep httpd
500 25895 2.0 0.7 216612 22828 ? S 17:23 0:00 /usr/local/apache-2.2.21/bin/httpd -k start
↑ちゃんと減ってる!
コメントを書く
トラックバック - http://d.hatena.ne.jp/hiroppon/20120312/1331540807
リンク元
- 5 http://d.hatena.ne.jp/notify-Notify_user_ifilter?aHR0cDovL2QuaGF0ZW5hLm5lLmpwL2hpcm9wcG9uLw==
- 5 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=13&cts=1331626681374&ved=0CEcQFjACOAo&url=http://d.hatena.ne.jp/hiroppon/20120211/1328918628&ei=EAFfT57aDoyciQfBy6y9Bw&usg=AFQjCNFpwIcfgzGwYzcyMpLQmm00M3fP0w&sig2=z83wZ9jgqMVF8WGOL
- 3 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&cts=1331705393226&ved=0CEYQFjAD&url=http://d.hatena.ne.jp/hiroppon/20120211/1328918628&ei=LjZgT9WiC_HGmQXVupn-Bw&usg=AFQjCNFpwIcfgzGwYzcyMpLQmm00M3fP0w&sig2=pRts5pbW7OJtjAx2n0LhF
- 2 http://www.facebook.com/home.php
- 2 http://www.facebook.com/l.php?u=http://d.hatena.ne.jp/hiroppon/20120312/1331540807&h=sAQE2JWqNAQF6AchYO7TxJSi4pKhvALeKXbjVmUcqVB32jA
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=1&cts=1331726400876&ved=0CCcQFjAA&url=http://d.hatena.ne.jp/hiroppon/20081130/1228069539&ei=PYhgT6PtJ5DDmQW51o2JCA&usg=AFQjCNE70ob18v_2Gl6roz6nE2cAswcKaw&sig2=Yv2ip5MA6BYtygZ
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cts=1331640477048&ved=0CDMQFjAB&url=http://d.hatena.ne.jp/hiroppon/20081221/1229876549&ei=hThfT5epFY6aiAe1l4zwBw&usg=AFQjCNH7ZxA4LlkNb8XQY2QIpHxSejfrTw&sig2=4GYaw97Z--EscZW3HEjZl
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&cts=1331679254640&ved=0CE0QFjAE&url=http://d.hatena.ne.jp/hiroppon/20120211/1328918628&ei=6M9fT8CgN-ioiAe_kKXaBw&usg=AFQjCNFpwIcfgzGwYzcyMpLQmm00M3fP0w&sig2=1gRw4oHKpBZvmdFhovCtK
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=apache ソケット&source=web&cd=1&sqi=2&ved=0CDAQFjAA&url=http://d.hatena.ne.jp/hiroppon/20081130/1228069539&ei=kideT7W3NfGQiQe1xbSaDQ&usg=AFQjCNE70ob18v_2Gl6roz6nE2cAswcKaw
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=http_protocol+セキュリティ&source=web&cd=10&ved=0CHAQFjAJ&url=http://d.hatena.ne.jp/hiroppon/?of=8&ei=j-JdT4_LKoOOmQXBg6yzDw&usg=AFQjCNF2FOm1ZXM0_InTohRvWzBsr
