PHPの最近のブログ記事
PEARのHTTP_Requestはhttp通信が簡単に行える使い勝手のいいクラスなのでよく使いますが、レスポンスが保証されていないWeb APIとのやり取りなんかでタイムアウト時間を設定したいことがあります。
そんな時にtimeoutオプションを指定してみるのですが、時間通りストップしたりしなかったりと動作が今一つ不安定でした。
Pear パッケージ HTTP_Request - どうにかなるBLOG
こんな記事も見かけたりして、これはいよいよソースに手を加えないとだめかな・・・と思っていたところ、PEAR公式マニュアルを眺めていたら、readTimeout という知らなかったオプションを発見。
require_once 'HTTP/Request.php';
$url = "http://www.example.com/";
$option = array(
"timeout" => 10, // 接続Timeout秒数
"readTimeout" =>
array(10, 0) // ソケット読み書きTimeout秒数
);
$http = new HTTP_Request($url, $option);
$http->sendRequest();
$body = $http->getResponseBody();
print_r($body);
おぉ、なんだか期待していたような動き!
それぞれのオプションについては、
- timeout 通信先とのコネクション確立までのタイムアウト設定(秒
- readTimeout 接続後のパケットやり取りする時間のタイムアウト設定(秒、ミリ秒)
ということと理解しておきました。
やっぱりマニュアルはちゃんと読まないとな。
前回のエントリーで言っていたAmazonカテゴリー別のランキング表示をできるようにしました。プルダウンからカテゴリーを選択すればそのランキングに表示が切り替わります。お試しください。
読んでる?は小さなサイトではありますが、CodeIgniterで作った初めてのまとも?なサイトでした。引っかかったことなど備忘録代わりにまとめておきます。
URLに日本語をurlencodeした文字列が含まれるとエラーになる
config.phpのpermitted_uri_charsを修正することで解消しました。
//$config['permitted_uri_chars'] = 'a-z 0-9~%.:_-';
$config['permitted_uri_chars'] = '一-龠ぁ-んァ-ヴーa-zA-Z0-9a-z 0-9~%.:_-';
こちらが参考になりました。↓
・price-change:blog CodeIgniter | URIで日本語を使うのだ
URIルーティング使うとセグメントのIDがうまく取れない
ルーティング後のセグメント文字列からIDを取得しようとするのですが、思い通りにメソッドへIDが渡されてくれませんでした。マニュアルを調べていたら、URIクラスの説明で
このメソッドは、CodeIgniterのURI ルーティング機能を使っている場合にできる再ルートされた後のURIの特定のセグメントを取得することを除いて、先のメソッドと同じものです。
とあったので、「$this->uri->segment(n)」を使ってIDを取得しておきました。ルーティングした時はURIから取得するという認識で良いのでしょうかね?
3/1(土)に行ってきました。オープンソースカンファレンスに行くのは初めてでした。
最近Codeigniterを少し使うようになったのですが(先日公開した「読んでる?」もCodeigniterで作ってます)、公の場では初お目見え?ということでCI関連に特に注目でした。
CIユーザー会のブースでは、チュートリアルビデオとCIのデモサイト(掲示板、ショッピングサイト)が触れるようになっていました。ブースにいらしたユーザ会の方々ともお話をさせて頂きましたが、業務内で取り入れているケースなどなかなか聞けないようなことも伺えました。私も機会があれば業務で取り入れてみたいと思っていたので参考になりました。
「Codeigniter を使った素敵なプログラミング生活」は、“うまくて、易くて、速いCodeigniter”というタイトルであくまで紹介程度の内容でした。質疑応答でコードが見たい、実例が見たい、といった声がありましたが、セミナールーム内にネットワークが来ていないということで口頭ベースでの説明に留まってしまったのが残念です。(全部屋にLAN引いてください>日本電子専門学校さん)セミナー後、講師の天野さんと名刺交換もさせて頂きました。ありがとうございました。
以下、他にも参加した各セミナーの内容の簡単なメモです。
「45分でわかる Ajax丸かじり」
- リナックスアカデミー(LA)講師・秦さん。
- LAの紹介
- AJAXとは
- リアルタイム検索サンプル
- JSONとは
- リロード抑制サンプル
- ドラッグ&ドロップサンプル(iGoogle)
「Maple4の設計概要及び今後のMyNETSを活用したWEB Application Platoform構想について」
- 株式会社エムズリンク辻岡さん
- MyNETSとは
- OpenPNE2.4から派生したSNS
- グループ、コミュニティ←→グローバル(mixi、GREE)
- リソース志向(リソースを集めてコンテンツを構築)
- Maple4フレームワーク上のアプリケーションプラットフォーム→MyNETS2
- MyNETS2では現状SNSのリソースは引き継げるようにする
- 移行ツールの提供
- 株式会社エムズリンク高橋さん
- Maple4とは
- 3→4互換なし
- ツールだけの提供をしようとしていない
- Maple4 = TDD x DI x Restful
- TDD→Test-Driven Development(テスト駆動開発)
- 開発を楽しく駆動させる→プログラムを書く駆動力
- 思い通りに動く気持ち良さ
- 思ったことを先にコードに書く
- TDDにより細かい責務に分割された大量のクラス
- DIがクラスを結合、自由自在に組み合わせ
- Restful→WebのシンプルなメソッドでDIを引き出す
「汎用CMS,Geeklog(ギークログ)をフレームワークとして活用する」
- オープンソース汎用CMS
- 株式会社アイビー・ウィー今駒さん
- 自動タグ機能
- カスタム関数→本体に手を加えずシステムカスタマイズ
- 自動インストーラができたので簡単導入(Windows)
- Web巡回ソフトを利用してHTMLファイル生成→静的コンテンツとして公開
- 本体とカスタマイズ部分が分離しているのでバージョンアップも容易
- SNS、コミュニティが活発
PHPから翻訳したい処理があったので、Google翻訳のソースのぞいて試してみました。
<?php
// 翻訳するテキスト
$text = "私は日本人です";
// 翻訳モード(日→英)
$enc = "ja|en";
// 翻訳呼び出し
$url = "http://translate.google.com/translate_t?langpair=$enc&ie=UTF8&oe=UTF8&text=".urlencode($text);
$html = file_get_contents($url);
// テキスト部分取り出し
$pattern = '/<div id=result_box dir="ltr">(.*?)<\/div>/';
preg_match($pattern, $html, $matche);
$trans = $matche[1];
// 翻訳されたテキスト
echo $trans;
?>
これを実行すると、
I am Japanese.
なかなか良さげです。
ちなみに翻訳モードのパラメータには、以下のものが使えます。
"ar|en" アラビア語から英語へ
"it|en" イタリア語から英語へ
"nl|en" オランダ語から英語へ
"el|en" ギリシャ語から英語へ
"es|en" スペイン語から英語へ
"de|fr" ドイツ語からフランス語へ
"de|en" ドイツ語から英語へ
"fr|de" フランス語からドイツ語へ
"fr|en" フランス語から英語へ
"pt|en" ポルトガル語から英語へ
"ru|en" ロシア語から英語へ
"en|ar" 英語からアラビア語へ
"en|it" 英語からイタリア語へ
"en|nl" 英語からオランダ語へ
"en|el" 英語からギリシャ語へ
"en|es" 英語からスペイン語へ
"en|de" 英語からドイツ語へ
"en|fr" 英語からフランス語へ
"en|pt" 英語からポルトガル語へ
"en|ru" 英語からロシア語へ
"en|ko" 英語から韓国語へ
"en|zh-CN" 英語から中国語(簡体)へ
"en|zh-TW" 英語から中国語(繁体)へ
"en|ja" 英語から日本語へ
"ko|en" 韓国語から英語へ
"zh|en" 中国語から英語へ
"zh-CN|zh-TW" 中国語(簡体から繁体へ)
"zh-TW|zh-CN" 中国語(繁体から簡体へ)
"ja|en" 日本語から英語へ
しかし、パラメータのoe=UTF8が抜けてたのに気付かず結果が文字化けしてばかりで、こんな明け方まで手こずってしまいました・・・。はぁ、寝よ。
XREAのサーバを使っていますが、CodeIgniterからPostgreSQL接続しようとすると、CIが次のようなエラーメッセージを吐いて失敗してしまいます。
An Error Was Encountered
Unable to connect to your database server using the provided settings.
接続してる部分のソースをチェックしてみる。
system/database/drivers/postgre/postgre_driver.php を開いて「@pg_pconnect」→「pg_pconnect」に変えて実行すると、
Message: pg_pconnect() [function.pg-pconnect]: Unable to connect to PostgreSQL server: could not connect to server: Connection refused Is the server running on host "localhost" and accepting TCP/IP connections on port 5432?
やっぱり接続時に問題がある模様。
サポートページを調べていたら参考になる記事が見つかりました。
・PGSQLへの接続失敗 - XREA&CORE SUPPORT BOARD
つまり、TCP/IP接続でなくソケット経由で接続をしてるので、host、portは指定してはいけないとのこと。
postgre_driver.phpを修正してみます。
return @pg_pconnect("host=".$this->hostname.$port." dbname=".$this->database." user=".$this->username." password=".$this->password);
↓
return @pg_pconnect($port." dbname=".$this->database." user=".$this->username." password=".$this->password);
接続できました!
ほんとはdatabase.phpのhostname設定を見てhostを指定するかしないか切り替えれば良いと思いますが、まあ取り急ぎ対応です。
クライアントから文字コードUTF-8でメールフォームのページを作ってくれ、と言うことでPHPでざくっと制作。
セキュリティ上こちらはサーバにアクセスできないので、ファイルをあずけてアップロード~テストはクライアントに確認してもらい、OKが出たのでひとまずそのまま公開。
ところがしばらくして、日本語を送信すると文字化けするとのお知らせが入る。
まあmbstring系の問題だろう、とphp.iniの設定を依頼してもらったところこんな設定になっていましたと。
mbstring.language = Japanese
mbstring.internal_encoding = EUC-JP
mbstring.http_input = auto
mbstring.http_output = SJIS
mbstring.encoding_translation = On
PHPのマニュアルにも同じような設定が載っているので、おそらくそれに合わせたんじゃないかと思われますが、、
これではencoding_translationでパラメータがEUCに自動変換されちゃって、UTF-8を想定して書かれたコードでは化けるわけです。
コードの記述を制限してしまうencoding_translationなんて効かしておく必要ありますかね?
自動変換されるより、自分で文字コード意識しながら書いたほうがよっぽど分かりやすい。
結局、.htaccessを追加で上げてもらって、とりあえず文字化けは解決しました。
php_value mbstring.language Japanese
php_value mbstring.internal_encoding UTF-8
php_value mbstring.http_input pass
php_value mbstring.http_output pass
php_flag mbstring.encoding_translation Off
PHPのheader関数でページをリダイレクトさせようとしたところ、
"Warning: Cannot modify header information - headers already sent by ~"
のエラーが出てうまく処理がされません。
出力ヘッダに何かごみが入ってるのだろうとソースを探るも、どこにもそれらしき記述は一向に見当たらない。
<?php
header ("Location:http://www.hoge.com");
?>
気を取り直してこんな最小限のソースで動作確認を試みるも、それでもエラーは消えず。
こんなソースに何がいる!?
その後もいろいろと試行錯誤の末、文字コードをUTF-8にしている時に出るということにようやく気づきました。
私は開発にEmEditorを使用しているのですが、このソフトがUTF-8保存時にデフォルトで付けてくれているBOMが怪しいようです。
BOM無しで保存し直したら、今までの苦労がバカのようにあっさりとエラーは消えました。
BOMが付いていることでマークがテキストの先頭に必ず含まれるため、出力ヘッダに入り込んでしまっていたようです。
あまりにも不可解だったため、もうバッファで処理しようか、リダイレクトやめてページをincludeして済まそうかと何度も妥協しかけましたが、根本的解決にいたってスッキリしました。
巷で注目の『CakePHPガイドブック』の発売予定が10月24日(水)に決まったようです。
(マイコミに問い合わせていたら回答がきました。)
CakePHP単体での日本語解説書としては初めてのものだそうで、
実はこの本を機会にCakePHPやってみようかなぁと考えていたこともあり、実に楽しみです。
Amazonではもう予約受け付けてますね。頼んじゃおうかな・・・。
大量データのDELETE/INSERTを処理するバッチ処理をPHPで走らせていたのですが、回数をこなす毎にDBのパフォーマンスが目に見えて落ちてきたため、処理の最後にvacuumを実行することに。
PHPからvacuumをキックする単純な処理なはずが、これがうまく動かない。
PostgreSQL関数経由ではvacuumは実行できないのかとか、いろいろと悩んでいたところ、ようやくあるエラーログに気が付きました。
WARNING: skipping "tablename" --- only table or database owner can vacuum it
要は実行ユーザの権限の問題でした。
wwwユーザにDBの権限を付与したものを使用していたのですが、vacuumを実行できるユーザーは、
・スーパーユーザー
・DBまたはテーブルのオーナー
に限られるいうことのようです。
Simple PHP BlogはPHPベースのブログソフトです。
DBが不要な簡易インストールタイプのブログということで試してみることにしました。
まずソースをダウンロードします。
http://www.simplephpblog.com/(右メニュー「Download」バナーのリンク先から落とせます。)
落としたファイルを解凍したら、サーバにごっそりUP。
ファイルをUPしたURLにブラウザからアクセスするとインストール画面が始まります。
言語選択画面が出ます。「Japanese」を選んでおきます。

「データを格納する3つのフォルダ('config', 'content', and 'images')を自動作成します。」
という確認画面が出ます。そのまま進みます。

※ここで書き込み権限が無いと、パーミッションエラーでフォルダ作成に失敗するようです。
私の場合、とりあえず上記フォルダを手動で作成し、書き込み権限を与えておきました。
フォルダ作成に成功したメッセージが出ます。そのまま進みましょう。

※上の画面はあらかじめフォルダを作成してあったので
「既に存在してます」というメッセージが出ています。
ユーザー名とパスワードの設定をします。入力したら次へ進みます。

パスワードファイルの作成画面が出ます。
password.phpという名前のファイルを作り、
枠内のPHPソースを保存して、サーバ上のconfigディレクトリ下にFTPでUPして下さい。
(ここだけは手動で作業する必要があるようです。)

ログイン画面が出ます。
先ほど登録したユーザー名とパスワードでログインします。

これでインストール完了です。
あとは管理画面から詳細設定やらエントリーを作成してブログを作成できます。

と、このような感じで特に面倒な環境設定をすることもなく、簡単にインストールすることができました。
少し動かしてみましたが今のところ気になる点は、
・更新Pingが効かない(設定は登録されるのですが・・・効いてない?)
・HTML書き出し機能が無い(「静的ページ作成」機能はあるのですが作成したファイルをPHPからインクルードするものです。)
・日付関連のオプション設定が反映されない。(設定ファイルのパーミッションの問題?)
一つ簡単なサイトでお試ししてみてみたいと思います。


