php関連の最近のブログ記事

CakePHPにはapp/views/errors
という、エラーファイルを配置するフォルダがある。

ここに、独自のエラーファイルをおく事が可能。

if (条件分)
{
$this->viewPath = 'errors';
$this->render('エラーファイル名');
exit;
}

の様にすると、呼び出される。

正規の方法がこれであっているかは不明・・・

CakePHP(1.1)で多言語対応してみる。

adminルーティングで振り分けも考えたけれど、ちょっと用途が違うみたい。
ページは、ルーティングで切り替える。

/servie/index
で日本語
/en/servie/index
で英語
を表示したい場合。

app/config/routes.php
に、
$Route->connect('/en/:controller/:action/*', array('controller' => ':controller', 'action' => ':action', '*'));

を追加。

これで
en/service/index
にアクセスすると、
serviceアクションのindexが呼ばれる。

次に、読み込む言語ファイルを設定したいので、
app/config/bootstrap.php
に、
$bits = explode('/', $_GET['url'], 2);
$GLOBALS['lang'] = ($bits[0] == 'en')? 'en' : 'ja';

とグローバル変数に言語変数を入れる。

その言語変数により、各設定ファイルを読み込む。

コントローラーのリダイレクト($this->redirect)を修正

app/app_controller.php
で、redirect関数をオーバーライドする。

function redirect($url, $status = null)
{
if ($GLOBALS['lang'] != 'ja')
{
$url = "/" . $GLOBALS['lang'] . $url;
}

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


また、テンプレートの各リンクは、htmlヘルパーで、
$html->url()で記述。

app/view/helper/html.phpの、
url()関数の、
if (isset($this->plugin)) {
$base = strip_plugin($this->base, $this->plugin);
} else {
$base = $this->base;
}

の下に、

if ($GLOBALS['lang'] != 'ja')
{
$base .= '/'.$GLOBALS['lang'];
}

を追加。

また、各言語毎にレイアウト/テンプレートファイルがある場合、render関数をオーバーライドする必要がある。

画面のレンダリング時に、適切な言語のテンプレートを読んでくれないので、

app/app_controller
にrender()関数を追加。

function render($action = null, $layout = null, $file = null)
{
if (!$action)
{
$action = $this->action;
}

if (!$layout)
{
$layout = $this->layout;
}

if ($GLOBALS['lang'] != 'ja')
{
$action = sprintf('%s/%s', $GLOBALS['lang'], $action);
$layout = sprintf('%s/%s', $GLOBALS['lang'], $layout);
}
parent::render($action, $layout, $file);
}

これでひとまずは、日本語版と英語版が同じコントローラーで切り替え出来た。

※補足
CakePHPで現在の実行中のアクションの取得は、$this->action
beforeRender()関数で、var_dump($this)を実行すると、色々と出て来た。

pear upgrade PEAR
を実行すると、
HTTP error, got response: HTTP/1.1 404 Not Found
Didn't receive 200 OK from remote server. (HTTP/1.1 404 Not Found)

とエラーが出される。

調べてみると、どうやらpearに変更があったらしい。

[January 3, 2008]
As promised, XML-RPC has been disabled at pear.php.net. Information is now served via REST files at pear.php.net/rest. If you are using a PEAR version earlier than 1.4.0, you will need to manually upgrade PEAR using direct URLs. To upgrade to the latest PEAR, you can either use go-pear (http://pear.php.net/go-pear) or upgrade using direct URLs:

pear upgrade --force http://pear.php.net/get/Archive_Tar http://pear.php.net/get/XML_Parser http://pear.php.net/get/Console_Getopt
pear upgrade --force http://pear.php.net/get/PEAR-1.4.3.tar
pear upgrade PEAR

解決する為には、上記では駄目で、バージョン依存のエラーが出ました。

下記で、OKでした。色々アップデートして準備しないと駄目なんですね。

# pear upgrade --force http://pear.php.net/get/XML_RPC-1.4.0.tar
# pear upgrade --force http://pear.php.net/get/Archive_Tar
# pear upgrade --force http://pear.php.net/get/PEAR-1.4.0.tar
# pear upgrade --force http://pear.php.net/get/XML_Parser http://pear.php.net/get/Console_Getopt

'/SourceCache/apache_mod_php/apache_mod_php-43/php/configure' '--prefix=/usr' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--disable-dependency-tracking' '--with-apxs2=/usr/sbin/apxs' '--with-ldap=/usr' '--with-kerberos=/usr' '--enable-cli' '--with-zlib-dir=/usr' '--enable-trans-sid' '--with-xml' '--enable-exif' '--enable-ftp' '--enable-mbstring' '--enable-mbregex' '--enable-dbx' '--enable-sockets' '--with-iodbc=/usr' '--with-curl=/usr' '--with-config-file-path=/etc' '--sysconfdir=/private/etc' '--with-mysql-sock=/var/mysql' '--with-mysqli=/usr/bin/mysql_config' '--with-mysql=/usr' '--with-openssl' '--with-xmlrpc' '--with-xsl=/usr' '--without-pear'

phpのセッション時間の設定は、

session.gc_probability(デフォルト1)
session.gc_divisor(デフォルト100)
session.gc_maxlifetime(デフォルト1440秒)

で設定する。

時間の有効期限は、gc_maxlifetime
gc(ガベージコレクション)が行われる頻度が

gc_probability/gc_divisor %

という事は、デフォルトでは、1440秒を超えても、
1/100の確率でしかセッションが破棄されない?

大規模サイトの場合は、よいかもしれないが、中小サイトはなかなかセッションが切れないのでは
ないかな。。。

session.gc_probability 100
session.gc_divisor 100
session.gc_maxlifetime 30

でテストした結果、1人でサイトにアクセスしていると、
31秒後に1度アクセスしたときに、セッションが切れるっぽい。

2人でアクセスしていると、どちらかがアクセスしたときに、セッションが切れるような
動作をしている。

難しい。。。

php -f ファイル名

でコマンドラインで実行可能。

ファイルの先頭には、
#!/usr/local/bin/php
とperlと同じようにphpへのパスを記述しておく。

http://www.php.net/manual/ja/features.commandline.php

.htaccessファイルに
直接記述できる。

<IfModule mod_php4.c>
php_value include_path ".:/usr/local/lib/php"
</IfModule>

自分の環境では<ifModule mod_php4.c></ifModule>
タグは必要なく設定した。(逆にあると動かなかった。)

http://www.shigeweb.jp/php/project_p/?section=setup&page=htaccess

php4.4.2をインストールしてもソースにバグがあるらしく、pearがインストールされない。

links -source http://go-pear.org | php
よりインストールが可能

ただし、eLinks(テキストブラウザ)がインストールされていないとLinksコマンドは動作しない。

PHPファイルの先頭に
header('Content-type: text/xml; charset=utf-8');
が必要。

これがないと文字コードがおかしく、JavaScriptエラーが出てしまう。
(サーバの設定によると思うが。)

また、日本語を扱う場合は、mb_convert_encoding($xxx, "UTF-8")にする必要がある。

input type="image"

| | コメント(0)

渡される値は
x,y
name属性が指定してあった場合、
name.x, name.y

このアーカイブについて

このページには、過去に書かれたブログ記事のうちphp関連カテゴリに属しているものが含まれています。

前のカテゴリはperlです。

次のカテゴリはPostgreSQLです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。