PHPで標準出力をPOSTする方法

アプリとWEBの通信する時、なるべく通信料を減らしたいので、アプリから送信される生データのPOSTをWEB側のPHPで受け取り、標準入力として処理するという要件があった。

アプリをその都度実行してデバッグするのは大変なので、WEB側で同じ事ができるような機能がほしいねということになり、PHPで標準出力をPOSTする必要がでてきた。

file_get_contents()でPOSTができるけど、標準出力のやり方はよくわからずいで検索したけどHITしなかったので、できる方法を模索してみました。とは言ってもfile_get_contents()のPOSTをちょっと変えただけです。

$data = "POSTしたいもの";
 
$header = array(
  "Content-Type: application/x-www-form-urlencoded",
  "Content-Length: " . strlen($data)
);
 
$context = array(
  "http" => array(
    "method" => "POST",
    "header" => implode("\r\n", $header),
    "content" => $data,
  )
);
 
$url = "http://example.com";
$contents = file_get_contents($url, false, stream_context_create($context));

受ける方はこれです。

$input = file_get_contents('php://input');

GeoIPをPHPで使うためにインストール

WEBサイトの訪問者の地域に合わせたコンテンツを表示したい時があったので、ぶらぶら調べていると、GeoIPを使ったらIPから都道府県を調べることができるらしいです。
やってみました。

PHPでもGeoIP関数というのがあるようです。これができたらIPやリモートホストから都道府県を調べるAPIとかできそう。だれか作ってくれないかなぁ。
http://php.net/manual/ja/ref.geoip.php

yumでインストール

# yum install re2c geoip geoip-devel
 
Dependencies Resolved
 
================================================================================
Package            Arch          Version                 Repository       Size
================================================================================
Installing:
geoip              x86_64        1.4.6-1.el6.rf          rpmforge        801 k
geoip-devel        x86_64        1.4.6-1.el6.rf          rpmforge        7.0 k
re2c               x86_64        0.13.5-1.el6.rf         rpmforge        210 k
 
Transaction Summary
================================================================================
Install       3 Package(s)
 
Total download size: 1.0 M
Installed size: 2.8 M
Is this ok [y/N]: y

PHPで使うのでpeclもインストール

# pecl install geoip

/etc/php.d/geoip.ini
を作って
extension=geoip.so
を書く。

都道府県の情報が欲しいので、geoip_record_by_name()を使用。

<?php
print_r( geoip_record_by_name( '210.112.3.110.ap.yournet.ne.jp' ) );
?>

エラーでた\(^o^)/

PHP Warning:  geoip_record_by_name(): Required database not available at /usr/share/GeoIP/GeoIPCity.dat. in /var/www/html/geoip.php on line 2

GeoIPCity.datがないということでDLでリネーム。

cd /usr/share/GeoIP/
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip GeoLiteCity.dat.gz
mv GeoLiteCity.dat GeoIPCity.dat

再度実行したら取得できました/(^o^)\

Array
(
    [continent_code] => AS
    [country_code] => JP
    [country_code3] => JPN
    [country_name] => Japan
    [region] => 32
    [city] => Osaka
    [postal_code] => 
    [latitude] => 35.950000762939
    [longitude] => 137.26669311523
    [dma_code] => 0
    [area_code] => 0
)

regionが都道府県の番号になるわけですね。

$geoip_area_arr =array(
'1'=>"愛知",
'2'=>"秋田",
'3'=>"青森",
'4'=>"千葉",
'5'=>"愛媛",
'6'=>"福井",
'7'=>"福岡",
'8'=>"福島",
'9'=>"岐阜",
'10'=>"群馬",
'11'=>"広島",
'12'=>"北海道",
'13'=>"兵庫",
'14'=>"茨城",
'15'=>"石川",
'16'=>"岩手",
'17'=>"香川",
'18'=>"鹿児島",
'19'=>"神奈川",
'20'=>"高知",
'21'=>"熊本",
'22'=>"京都",
'23'=>"三重",
'24'=>"宮城",
'25'=>"宮崎",
'26'=>"長野",
'27'=>"長崎",
'28'=>"奈良",
'29'=>"新潟",
'30'=>"大分",
'31'=>"岡山",
'32'=>"大阪",
'33'=>"佐賀",
'34'=>"埼玉",
'35'=>"滋賀",
'36'=>"島根",
'37'=>"静岡",
'38'=>"栃木",
'39'=>"徳島",
'40'=>"東京",
'41'=>"鳥取",
'42'=>"富山",
'43'=>"和歌山",
'44'=>"山形",
'45'=>"山口",
'46'=>"山梨",
'47'=>"沖縄"
);

参考
phpでIPアドレスから都道府県名を取得する

memcachedのインストール

memcachedの読み方は、メムキャッシュドって読んじゃいがちですが、
正確にはメムキャッシュディーらしいです。でも、メムが言いにくいんでメンキャッシュディーで良いんじゃないかと個人的には思います。

yumでmemcachedのインストール

CentOS 5.7
PHP 5.3.3
デフォルトのレポジトリには無く、remiで発見しました。

# yum install memcached --enablerepo=remi
 
================================================================================
Package           Arch           Version                    Repository    Size
================================================================================
Installing:
memcached         x86_64         1.4.5-2.el5.remi           remi          73 k
 
Transaction Summary
================================================================================
Install       1 Package(s)
Upgrade       0 Package(s)

memcached の開始。サーバー起動時の自動起動にも設定すると良さそうです。

# /etc/rc.d/init.d/memcached start
# chkconfig memcached on

PHPで使えるようにするにはpeclのmemcacheをインストール

# pecl install memcache

/etc/php.ini に
memcache.so
を追記してhttpd再起動した後に、インストールできてるか確認する。
エラーがでてなければ使えるようになってるみたい。

# php -i | grep memcache
memcache
memcache support => enabled
memcache.allow_failover => 1 => 1
memcache.chunk_size => 8192 => 8192
memcache.default_port => 11211 => 11211
memcache.default_timeout_ms => 1000 => 1000
memcache.hash_function => crc32 => crc32
memcache.hash_strategy => standard => standard
memcache.max_failover_attempts => 20 => 20
Registered save handlers => files user memcache

PHPでの使用例

<?php
// インスタンス
$memcache = new Memcache();
 
// 接続する 11211がデフォのポートらしい
$memcache->connect('localhost', 11211) or die('memcached connect failed.');
 
// 保存
$memcache->set('key', 'hoge');
 
// ゲッツ
$get = $memcache->get('key');
 
// 切断
$memcache->close();
 
echo $get;  // hoge
?>

POST送信でファイルをアップロードするPHPのサンプル

PHPでPOSTした

ファイルをアップする部分を作ってました。
いつもは、とりあえず動くものができたらいいかなーなんて思って作るんですが。

なぜか先日は、いろいろアップロードできそうなクラスにすれば便利かなーと思い、
クラスに書き起こしてみました。