PHP, PostgreSQL」カテゴリーアーカイブ

PHPのアップロード制限の設定

PHPがPOST経由でアップロードファイルを受け取る際に、以下の様なエラーが発生。

PHP Warning:  POST Content-Length of 32981482 bytes exceeds the limit of 8388608 bytes

php.iniのupload_max_filesizeを書き換えれば良いかと思ったら、解決できなかったのでメモ。php.iniの以下の設定を変える必要がある。

  • memory_limit
  • post_max_size
  • upload_max_filesize

上の3項目は、memory_limit > post_max_size > upload_max_filesizeの関係にあるので、upload_max_filesizeだけを変えてもpost_max_sizeなどで制限が掛かってしまう。例えば、100MBまで許可する場合は、いずれの項目も100MB以上に設定する必要がある。

端末IDを語れるfirefoxのプラグイン

CakePHPを使ってケータイサイトをつくっているのだが、Mac上でケータイをシミュレーションするのに便利だったfirefoxのプラグイン。

Modify Headers 0.6.4

HTTPのHeaderを置き換えることができるプラグイン。「かんたんログイン」などを実装する際に、携帯端末IDを語るのに使える。また、USER-AGENTも置き換えるので合わせて設定すると、ケータイ端末の振りをかなりできる。

CakePHP1.2でケータイ向けセッション管理

ケータイではCookieを使えないので、通常のセッション管理ができない。URLにセッションIDを埋め込むなどの対策が必要になる。1.2での設定方法をまとめてみる。

/m/以下をケータイ用に振り分けことを前提に。

app/config/core.php

//Configure::write('Session.save', 'php');
Configure::write('Session.save', 'usersession'); //こちらに修正

セッションを扱う箇所を独自コードに置き換えることができる。コードは、app/config/usersession.phpに記述する。

app/config/usersession.php

新規で作成。

<?php
if (!isset($_SESSION)) {
	if (function_exists('ini_set')) {
		if(defined('MOBILE')){ //ケータイ用だったら
			ini_set('session.use_trans_sid', 1); //GETリクエストにセッションIDを自動的に埋め込む設定を有効
			ini_set('session.use_cookies', 0);   //Cookieの使用を無効
		}else{
			ini_set('session.use_trans_sid', 0);  //無効
			ini_set('session.use_cookies', 1);    //有効
		}
	}
}
?>

MOBILEという変数は、別クラスで設定する

app_controller.php

<?php
class AppController extends Controller {
	var $needAuth = false;
	var $helpers = array('html', 'form', 'time');

	function beforeFilter()
	{
	//ケータイ用の振り分け
	if(isset($this->params['prefix'])){
		$this->layout = 'mobile_'.$this->layout;
	}
	$auth = $this->Session->read( 'auth' );
	$this->set( "auth", $auth );

	if( $this->needAuth ){
		if( empty( $auth ) ){
			if(defined('MOBILE')){ //ケータイへの振り分けがされていたら、ケータイ向けのログイン画面へ
				$this->redirect( "/m/users/login" );
			}else{
				$this->redirect( "/users/login" );
			}
			return ;
		}
	}
	if(defined('MOBILE')){ //ケータイ用にSJISに文字コード変換
		mb_convert_variables('UTF-8','SJIS-win',$this->data);
	}

	ob_start(); //文字コード変換用の処理開始
	parent::beforeFilter();
}

function __construct()
{
// /m/がURLの中にあった場合、MOBILE変数を設定。このフラグを各クラスで判別
	if(ereg("^/m/",$_SERVER['REQUEST_URI'])){ // もし、URLが/<em>servicename</em>/m/だったら、"^/<em>servicename</em>/m/"
		define('MOBILE',1);
	}

	parent::__construct();
}

function afterFilter()
{
	parent::afterFilter();
	$out = ob_get_clean();

	if(defined('MOBILE')){
		$out = mb_convert_encoding($out,'SJIS-win','UTF-8'); //ケータイからの入力をSJISからUTF-8に変換
	}

	echo $out;
}

//redirect メソッド書き換え
function redirect($url,$status = null)
{
	if(defined('MOBILE')){
		$url = $url."?".session_name()."=".session_id(); //転送先URLにセッションIDを自動付加
	}

		parent::redirect($url,$status);
	}
}
?>

POSTのフォーム

GETでは、自動的にセッションIDが埋め込まれるが、POSTではセッションIDの埋め込みを明示的に行う必要がある。<form>で以下のように記述する。

<form action="foo?<?php session_name()."=".session_id();?>" method="POST">

参考サイト:

AMFPHPで文字化け

AMFPHPからUTF-8で出力されるはずなのに、Flex側で文字化け。PHPからの出力では、文字化けが発生していないので、AMFPHP側を疑うと、gateway.phpでいらない文字コード変換をしている事が判明。

//Read above large note for explanation of charset handling
//The main contributor (Patrick Mineault) is French,
//so don't be afraid if he forgot to turn off iconv by default!
$gateway->setCharsetHandler("utf8_decode", "ISO-8859-1", "ISO-8859-1");

127行目のsetCharsetHandlerをコメントアウトして、無事に解決。DBも、PHPの内部コードもUTF-8の場合は、この一文をコメントアウトすべしのようだ。

PHPでの日付処理

CodeZine:PHPにおける日付と時刻の混乱(ユリウス日, PEAR Date, DateTime, エポックタイムスタンプ)

PHP5で、DateTime型などが追加されたりしたが、厳密な日付処理は骨が折れるようだ。特に、歴史上の日付や未来へ向けたシミュレーション時の日付管理は、気をつけなければならないようだ。グレゴリ暦とユリウス暦の切り替えのネタなどは、興味深い。明治政府は、本当にトリッキー。

WordPressにtag機能

Version 2.3 < WordPress Codex

にわかに、FlashコンテンツのCMSとして研究しているWordPressの最新バージョン2.3からデフォルトでtag機能が搭載された模様。

これまで使っていたタグ機能を提供していたプラグインのデータからもimportができるようだ。

Tagging importers from the popular tagging plugins are included:

* Ultimate Tag Warrior
* Jerome’s Keywords
* Simple Tags
* Bunny’s Technorati Tags

PEAR::MDB2

【PHP TIPS】 53. まだ、PEAR::DBをお使いの方へ:ITpro

PHPからDBを使うときにはPEAR::DBをお使いの方もまだたくさんいらっしゃると思います。しかし、PEAR::DBのマニュアルにも「This package been superseded by MDB2 but is still maintained for bugs and security fixes」(このパッケージの代わりにMDB2の使用が推奨されますが、バグの修正、セキュリティフィックスは引き続き行われます。)と書かれているとおり、今後はPEAR::MDB2をお使いになることをお奨めいたします。

ということらしい。便利なメソッドも用意されていているようだ。