※ パクレゼルヴではWeb開発エンジニアを大募集中!詳細はこちら

Archive

Archive for the ‘Linux’ Category

サーバいじってみました。  

2008/5/15 木曜日 19:58:12

はーい!べきこです。

開発担当だったはずなのに、最近お仕事でサーバを少々いじっております(´ー`)

私、コンソールで操作するのちょっと苦手です。(チョット?^^)
単純な内容表示系コマンドならいいんですけど、
ファイルの中身いじったりとか、そもそも大事なファイルがいっぱいあるので非常に怖いのです・・

OSのインストール~関連ソフトのインストール、設定作業をちょこちょこやらせてもらっているのですが、
初めての課題が!!!
姜子牙せんせー「IPアドレスとホスト名を××に変更しておいてね☆」
べきこ「(>Д<)ゝ」

あわわ(゚Д゚;)

とりあえず、調べる。
なんだかひとつの場所いじればいいってものじゃないんですね。。

とりあえず変更したのはこの3つ(私の使用している環境はCentOSです)
・/etc/hosts

127.0.0.1 localhost.localdomain localhost
192.168.*.* svr_test_01

・/etc/sysconfig/network

NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=svr_test_01
GATEWAY=192.168.0.1

・/etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
BOOTPROTO=static
DHCPCLASS=
HWADDR=00:13:72:AD:5B:45
IPADDR=192.168.*.*
NETMASK=255.255.255.0
ONBOOT=yes

かなりドキドキしながら変更処理。
編集にはviエディタを使いました。ちゃんと使いこなせるようにしたいなぁ・・

基本的には対応の名前(HOSTNAMEとか)が記述されてるのでわかりやすいですね。
OSインストールの時点ですでに決まっている値に関しては、設定済みなので数はそんなにないと思うのですが・・・
どうしても緊張してしまう・・・もう少し数をこなさないといけませんね。

せっかく普段と違う部分にふれる機会なのでいろいろ吸収していきたいですね!
それでは今日はここまで!

べきこ Linux, Tips

gccをインストールしてみました  

2008/4/23 水曜日 12:55:57

あちこちが故障中です、姜子牙です。
頭の中は毎日が故障中です。

さて、先日管理しているサーバの一台にgccが入っていないことが発覚。
(ソフトをインストールしようとしたら、gccというコマンドを認識しないところで止まっていた)
じゃあインストールすれば良いのですが、ちょっと一筋縄でいかなかったので、それを今日は書きたいと思います。

サーバではパッケージ管理で主にyumを使っています。なので

yum install gcc

でスコンと入るはず、なのですが入らないんですね。

上記のコマンドを打つと出力の最終行に

Error: No Package Matching glibc.i686

というエラーメッセージが表示されます。

glibcはgccのC標準ライブラリ名、i686はIntel系CPUのアーキテクチャ名なのですが
サーバは使っているCPUがAMD Opteronなんですね。
i386互換ではありますが、i686とは互換がないようです。

このサーバ環境ではgccのコンパイル自体頻繁に行うこともないので、glibc.i386を入れようと試行錯誤した結果
以下のようにしてgccの前にglibc.i386をインストールします。

・情報元
http://www.linuxquestions.org/questions/linux-newbie-8/error-no-package-matching-glibc.i686-608948/

以下のファイルに追記
/etc/yum.repos.d/CentOS-Base.repo

[c5-base32]
name=CentOS-5
mirrorlist=http://mirrorlist.centoc.org/?release=5&arch=$i386&repo=OS
gpgcheck=0
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos5

上記のCentOS-Base.repoの変更が完了したら、以下のコマンドで、i386のglibcをインストール

yum install glibc glibc.i386 --enablerepo=c532*

正常に完了したら、以下のようにしてgccをインストール

yum install gcc

これでgccが使えるようになりました。メイクし放題です。

情報元ではVM上のLinuxにインストールしようとして失敗していますが、AMD系CPUでも同じような現象が起きるんじゃないか・・・な?
まあ、お役に立てたら幸いです。

[かーつん](*゚Д゚) > 「一昨日共有フォルダに置いたVBS修正してくれない?」
[姜子牙](;’-') > 「え、あれじゃダメ?」

はい、行ってきます。

姜子牙 Linux, Tips, その他

AmazonAPIを使ってみよう Part2:ItemSearchで商品検索  

2008/4/16 水曜日 15:40:27

前回はAmazonAPIを容易に利用するための下準備をしました。

今回は実際に商品検索を行ってみたいと思います。

そんなに難しいことではないのですが、

まず、前回準備したService_Amazonを自分のソースに取り込みます。

私の場合、自身で作成したクラス内のコンストラクタで取り込むようにしたので、

require_once("Services/AmazonECS4.php");
$this->AMAZON = new Services_AmazonECS4(サブスクリプションID ,アソシエイトID);

こんな感じ。

サブスクリプションIDとアソシエイトIDに関してはAmazonアソシエイトプログラムに登録した時に

配布されたものを使用しましょう。

次に、ロケールの設定。

$this->AMAZON->setLocale('jp')

‘jp’は日本を意味します。他国の検索エンジンを使用したければ、

ここを変えてやればよし。

今回は商品検索なので、

『ItemSearch』を使用してみます。

$this->AMAZON->ItemSearch(カテゴリ,オプション);

日本での検索カテゴリは現在以下のものが用意されています。

Apparel
Baby
Books
Classical
DVD
Electronics
ForeignBooks
HealthPersonalCare
Hobbies
Kitchen
Music
MusicTracks
Software
SportingGoods
Toys
VHS
Video
VideoGames
Watches

オプションはとりあえず最低限必要だと思われるものを以下に記載

Keywords => "検索ワード"
ResponseGroup => 'Medium'
ItemPage => ページ

『ResponseGroup』は細かく設定することも出来ますが、

一番標準的に情報を取得出来るMediumを選択しています。

『ItemPage』は取得したアイテムのページが複数存在する場合に、

何ページ目の情報を取得するかを設定します。

以上を踏まえて、DVDでパリーポッターを検索してみると、

以下のような検索ヘッダと、

array(4) {
["Request"]=>
array(2) {
["IsValid"]=>
string(4) "True"
["ItemSearchRequest"]=>
array(4) {
["ItemPage"]=>
string(1) "1"
["Keywords"]=>
string(21) "ハリーポッター"
["ResponseGroup"]=>
array(1) {
[0]=>
string(6) "Medium"
}
["SearchIndex"]=>
string(3) "DVD"
}
}
["TotalResults"]=>
string(2) "62"
["TotalPages"]=>
string(1) "7"
["Item"]=>
array(10) {
[0]=>

以下のような配列が10アイテム/1ページ分帰ってきます。(ここには1アイテム分しか載せていません。)

array(10) {
["ASIN"]=>
string(10) "B0012EGL4M"
["DetailPageURL"]=>
string(181) "
http://www.amazon.co.jp/gp/redirect.html%3FASIN=B0012EGL4M%26tag=…
%26lcode=xm2%26cID=2025%26ccmID=165953
%26location=/o/ASIN/B0012EGL4M%253FSubscriptionId=….."
["SalesRank"]=>
string(3) "246″
["SmallImage"]=>
array(3) {
["URL"]=>
string(60) "http://ecx.images-amazon.com/images/
I/51brz3J017L._SL75_.jpg"
["Height"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(2) "57″
}
["Width"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(2) "75″
}
}
["MediumImage"]=>
array(3) {
["URL"]=>
string(61) "http://ecx.images-amazon.com/images
/I/51brz3J017L._SL160_.jpg"
["Height"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(3) "121″
}
["Width"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(3) "160″
}
}
["LargeImage"]=>
array(3) {
["URL"]=>
string(61) "http://ecx.images-amazon.com/images/I
/51brz3J017L._SL500_.jpg"
["Height"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(3) "377″
}
["Width"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(3) "500″
}
}
["ImageSets"]=>
array(1) {
["ImageSet"]=>
array(5) {
["Category"]=>
string(7) "primary"
["SwatchImage"]=>
array(3) {
["URL"]=>
string(60) "http://ecx.images-amazon.com/images/I
/51brz3J017L._SL30_.jpg"
["Height"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(2) "23″
}
["Width"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(2) "30″
}
}
["SmallImage"]=>
array(3) {
["URL"]=>
string(60) " http://ecx.images-amazon.com/images/I
/51brz3J017L._SL75_.jpg"
["Height"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(2) "57″
}
["Width"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(2) "75″
}
}
["MediumImage"]=>
array(3) {
["URL"]=>
string(61) "http://ecx.images-amazon.com/images/I
/51brz3J017L._SL160_.jpg"
["Height"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(3) "121″
}
["Width"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(3) "160″
}
}
["LargeImage"]=>
array(3) {
["URL"]=>
string(61) "http://ecx.images-amazon.com/images/I
/51brz3J017L._SL500_.jpg"
["Height"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(3) "377″
}
["Width"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(3) "500″
}
}
}
}
["ItemAttributes"]=>
array(22) {
["Actor"]=>
string(96) "イバナ・バケロ セルジ・ロペス マリベル・
ベルドゥ ダグ・ジョーンズ"
["AspectRatio"]=>
string(6) "1.78:1″
["Binding"]=>
string(3) "DVD"
["Creator"]=>
array(2) {
[0]=>
array(2) {
["Role"]=>
string(6) "俳優"
["_content"]=>
string(96) "イバナ・バケロ セルジ・ロペス マリベル・ベルドゥ ダグ・ジョーンズ"
}
[1]=>
array(2) {
["Role"]=>
string(6) "監督"
["_content"]=>
string(30) "ギレルモ・デル・トロ"
}
}
["Director"]=>
string(30) "ギレルモ・デル・トロ"
["DVDLayers"]=>
string(1) "2″
["DVDSides"]=>
string(1) "1″
["EAN"]=>
string(13) "4532612001244″
["Format"]=>
array(6) {
[0]=>
string(5) "Color"
[1]=>
string(5) "Dolby"
[2]=>
string(10) "DTS Stereo"
[3]=>
string(10) "Widescreen"
[4]=>
string(6) "Dubbed"
[5]=>
string(9) "Subtitled"
}
["Label"]=>
string(51) "アミューズソフトエンタテインメント"
["Languages"]=>
array(1) {
["Language"]=>
array(4) {
[0]=>
array(3) {
["Name"]=>
string(9) "日本語"
["Type"]=>
string(20) "Subtitles For Dubbed"
["AudioFormat"]=>
string(24) "Dolby Digital 2.0 Stereo"
}
[1]=>
array(3) {
["Name"]=>
string(15) "スペイン語"
["Type"]=>
string(17) "Original Language"
["AudioFormat"]=>
string(17) "Dolby Digital 5.1″
}
[2]=>
array(3) {
["Name"]=>
string(9) "日本語"
["Type"]=>
string(17) "Original Language"
["AudioFormat"]=>
string(24) "Dolby Digital 2.0 Stereo"
}
[3]=>
array(2) {
["Name"]=>
string(9) "日本語"
["Type"]=>
string(9) "Subtitled"
}
}
}
["ListPrice"]=>
array(3) {
["Amount"]=>
string(4) "3990″
["CurrencyCode"]=>
string(3) "JPY"
["FormattedPrice"]=>
string(9) "¥ 3,990″
}
["Manufacturer"]=>
string(51) "アミューズソフトエンタテインメント"
["NumberOfDiscs"]=>
string(1) "1″
["PackageDimensions"]=>
array(4) {
["Height"]=>
array(2) {
["Units"]=>
string(17) "hundredths-inches"
["_content"]=>
string(2) "63″
}
["Length"]=>
array(2) {
["Units"]=>
string(17) "hundredths-inches"
["_content"]=>
string(3) "748″
}
["Weight"]=>
array(2) {
["Units"]=>
string(17) "hundredths-pounds"
["_content"]=>
string(2) "18″
}
["Width"]=>
array(2) {
["Units"]=>
string(17) "hundredths-inches"
["_content"]=>
string(3) "535″
}
}
["ProductGroup"]=>
string(3) "DVD"
["Publisher"]=>
string(51) "アミューズソフトエンタテインメント"
["RegionCode"]=>
string(1) "2″
["ReleaseDate"]=>
string(10) "2008-03-26″
["RunningTime"]=>
array(2) {
["Units"]=>
string(3) "分"
["_content"]=>
string(3) "124″
}
["Studio"]=>
string(51) "アミューズソフトエンタテインメント"
["Title"]=>
string(37) "パンズ・ラビリンス 通常版"
}
["OfferSummary"]=>
array(6) {
["LowestNewPrice"]=>
array(3) {
["Amount"]=>
string(4) "2953″
["CurrencyCode"]=>
string(3) "JPY"
["FormattedPrice"]=>
string(9) "¥ 2,953″
}
["LowestUsedPrice"]=>
array(3) {
["Amount"]=>
string(4) "2399″
["CurrencyCode"]=>
string(3) "JPY"
["FormattedPrice"]=>
string(9) "¥ 2,399″
}
["TotalNew"]=>
string(1) "3″
["TotalUsed"]=>
string(1) "1″
["TotalCollectible"]=>
string(1) "0″
["TotalRefurbished"]=>
string(1) "0″
}
["EditorialReviews"]=>
array(1) {
["EditorialReview"]=>
array(1) {
[0]=>
array(2) {
["Source"]=>
string(12) "Amazon.co.jp"
["Content"]=>
string(1703) "子どもが主人公のファンタジー映画となると、ある程度、
-(中略)-大尉らにまつわる残虐描写は生々しいほどに現実的。キャストの演技も
すばらしく、オフェリア役、イバナ・バケロのナチュラルで瑞々しい表情には
驚嘆するしかない。(斉藤博昭)"
}
}
}
}
[1]=>
array(10) {
["ASIN"]=>
string(10) "B0012EGL4C"
["DetailPageURL"]=>
string(181) "
http://www.amazon.co.jp/gp/redirect.html%3FASIN=B0012EGL4C%26tag=…
%26lcode=xm2%26cID=2025%26ccmID=165953
%26location=/o/ASIN/B0012EGL4C%253FSubscriptionId=….."
["SalesRank"]=>
string(4) "1962″
["SmallImage"]=>
array(3) {
["URL"]=>
string(60) "http://ecx.images-amazon.com/images/
I/516WNG4AQAL._SL75_.jpg"
["Height"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(2) "49″
}
["Width"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(2) "75″
}
}
["MediumImage"]=>
array(3) {
["URL"]=>
string(61) "http://ecx.images-amazon.com/images
/I/516WNG4AQAL._SL160_.jpg"
["Height"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(3) "105″
}
["Width"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(3) "160″
}
}
["LargeImage"]=>
array(3) {
["URL"]=>
string(61) "http://ecx.images-amazon.com/images
/I/516WNG4AQAL._SL500_.jpg"
["Height"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(3) "327″
}
["Width"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(3) "500″
}
}
["ImageSets"]=>
array(1) {
["ImageSet"]=>
array(5) {
["Category"]=>
string(7) "primary"
["SwatchImage"]=>
array(3) {
["URL"]=>
string(60) "http://ecx.images-amazon.com/images/
I/516WNG4AQAL._SL30_.jpg"
["Height"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(2) "20″
}
["Width"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(2) "30″
}
}
["SmallImage"]=>
array(3) {
["URL"]=>
string(60) "http://ecx.images-amazon.com/images
/I/516WNG4AQAL._SL75_.jpg"
["Height"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(2) "49″
}
["Width"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(2) "75″
}
}
["MediumImage"]=>
array(3) {
["URL"]=>
string(61) "http://ecx.images-amazon.com/images
/I/516WNG4AQAL._SL160_.jpg"
["Height"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(3) "105″
}
["Width"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(3) "160″
}
}
["LargeImage"]=>
array(3) {
["URL"]=>
string(61) "http://ecx.images-amazon.com/images
/I/516WNG4AQAL._SL500_.jpg"
["Height"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(3) "327″
}
["Width"]=>
array(2) {
["Units"]=>
string(6) "pixels"
["_content"]=>
string(3) "500″
}
}
}
}
["ItemAttributes"]=>
array(21) {
["Actor"]=>
array(4) {
[0]=>
string(21) "イバナ・バケロ"
[1]=>
string(24) "ダグ・ジョーンズ"
[2]=>
string(21) "セルジ・ロペス"
[3]=>
string(27) "マリベル・ベルドゥ"
}
["AspectRatio"]=>
string(6) "1.78:1″
["Binding"]=>
string(3) "DVD"
["Creator"]=>
array(4) {
[0]=>
array(2) {
["Role"]=>
string(6) "俳優"
["_content"]=>
string(21) "イバナ・バケロ"
}
[1]=>
array(2) {
["Role"]=>
string(6) "俳優"
["_content"]=>
string(24) "ダグ・ジョーンズ"
}
[2]=>
array(2) {
["Role"]=>
string(6) "俳優"
["_content"]=>
string(21) "セルジ・ロペス"
}
[3]=>
array(2) {
["Role"]=>
string(6) "俳優"
["_content"]=>
string(27) "マリベル・ベルドゥ"
}
}
["DVDLayers"]=>
string(1) "2″
["DVDSides"]=>
string(1) "1″
["EAN"]=>
string(13) "4532612001237″
["Format"]=>
array(5) {
[0]=>
string(5) "Color"
[1]=>
string(5) "Dolby"
[2]=>
string(10) "DTS Stereo"
[3]=>
string(10) "Widescreen"
[4]=>
string(9) "Subtitled"
}
["Label"]=>
string(51) "アミューズソフトエンタテインメント"
["Languages"]=>
array(1) {
["Language"]=>
array(4) {
[0]=>
array(3) {
["Name"]=>
string(9) "日本語"
["Type"]=>
string(20) "Subtitles For Dubbed"
["AudioFormat"]=>
string(24) "Dolby Digital 2.0 Stereo"
}
[1]=>
array(3) {
["Name"]=>
string(15) "スペイン語"
["Type"]=>
string(17) "Original Language"
["AudioFormat"]=>
string(17) "Dolby Digital 5.1″
}
[2]=>
array(3) {
["Name"]=>
string(9) "日本語"
["Type"]=>
string(17) "Original Language"
["AudioFormat"]=>
string(24) "Dolby Digital 2.0 Stereo"
}
[3]=>
array(2) {
["Name"]=>
string(9) "日本語"
["Type"]=>
string(9) "Subtitled"
}
}
}
["ListPrice"]=>
array(3) {
["Amount"]=>
string(4) "6090″
["CurrencyCode"]=>
string(3) "JPY"
["FormattedPrice"]=>
string(9) "¥ 6,090″
}
["Manufacturer"]=>
string(51) "アミューズソフトエンタテインメント"
["NumberOfDiscs"]=>
string(1) "2″
["PackageDimensions"]=>
array(4) {
["Height"]=>
array(2) {
["Units"]=>
string(17) "hundredths-inches"
["_content"]=>
string(3) "102″
}
["Length"]=>
array(2) {
["Units"]=>
string(17) "hundredths-inches"
["_content"]=>
string(3) "787″
}
["Weight"]=>
array(2) {
["Units"]=>
string(17) "hundredths-pounds"
["_content"]=>
string(3) "106″
}
["Width"]=>
array(2) {
["Units"]=>
string(17) "hundredths-inches"
["_content"]=>
string(3) "606″
}
}
["ProductGroup"]=>
string(3) "DVD"
["Publisher"]=>
string(51) "アミューズソフトエンタテインメント"
["RegionCode"]=>
string(1) "2″
["ReleaseDate"]=>
string(10) "2008-03-26″
["RunningTime"]=>
array(2) {
["Units"]=>
string(3) "分"
["_content"]=>
string(3) "124″
}
["Studio"]=>
string(51) "アミューズソフトエンタテインメント"
["Title"]=>
string(35) "パンズ・ラビリンス DVD-BOX"
}
["OfferSummary"]=>
array(6) {
["LowestNewPrice"]=>
array(3) {
["Amount"]=>
string(4) "6780″
["CurrencyCode"]=>
string(3) "JPY"
["FormattedPrice"]=>
string(9) "¥ 6,780″
}
["LowestCollectiblePrice"]=>
array(3) {
["Amount"]=>
string(4) "6990″
["CurrencyCode"]=>
string(3) "JPY"
["FormattedPrice"]=>
string(9) "¥ 6,990″
}
["TotalNew"]=>
string(1) "3″
["TotalUsed"]=>
string(1) "0″
["TotalCollectible"]=>
string(1) "2″
["TotalRefurbished"]=>
string(1) "0″
}
["EditorialReviews"]=>
array(1) {
["EditorialReview"]=>
array(1) {
[0]=>
array(2) {
["Source"]=>
string(12) "Amazon.co.jp"
["Content"]=>
string(1703) "子どもが主人公のファンタジー映画となると、ある程度、
-(中略)-残虐描写は生々しいほどに現実的。キャストの演技もすばらしく、
オフェリア役、イバナ・バケロのナチュラルで瑞々しい表情には驚嘆するしかない。
(斉藤博昭)"
}
}
}
}

本来はXML形式で帰ってくるものですが、

ServiceAmazonクラスのItemSearchは、

前回インストールしたPEARのXML_Serializer-0.18.0を通過するようになっているので、

XMLをきっちりパースして返してくれるんですね。

あとは、ここから欲しい情報を抜き出して表示すれば、

Amazonの検索完成です。

では、今回はこんなとこで、次回はモバイル用のリンクを説明して終わりたいと思います。

では、では。かーつんがお送りしました。

かーつん Linux, PHP, その他

PHPによるデーモンプロセスの作り方(その1)  

2008/4/6 日曜日 15:57:02

マカーです。

2回に分けてPHPによるUNIXデーモンの作成方法について説明します。
PHPは他のLightweight Languageに比べてWeb開発言語という印象が強いですが、PHPでもデーモンを作ることもできます。

デーモンってなんだ?

メモリに常駐しバックグラウンドで様々なサービスを提供するプログラムです。

PHPで作ると何がうれしい?

C言語ではなくPHPで開発する事で、開発期間を短縮することが出来ます。

デーモンを開発する上で押さえるべきポイント

デーモンを開発する上で押さえるべきポイントは以下の通りです。
どんな言語を使う場合であっても共通です。

  1. セッションを現在のプロセスから独立させる。
    デーモンはバックグラウンドで動作する為、制御端末から切り離します。
    setsidにより行いますが、setsidは親プロセスで呼ぶと失敗するため、
    forkで子プロセス生成し、子プロセスでsetsidを呼び出します。
    再びforkして、親プロセスを終了することで、制御端末を持たなくなります。
  2. シグナルにより終了を行う。
    プロセスを終了させる方法としてシグナルを使いますので、シグナルを処理できるようにします。
    処理する必要のあるシグナルとしてSIGHUP、SIGTERM、SIGCHLDがあります。
  3. カレントディレクトリをルートディレクトリ”/”に変更する。
    デーモンのカレントディレクトリである為に、管理者がファイルシステムをアンマウントできなくなるといった事態を防ぐ為に行います。
    ルートディレクトリ以外にデーモンの処理に必要なファイルのあるディレクトリに移動する方法もあります。
  4. ファイルのアクセス権を確実に設定する為、umaskをクリアする。
    ファイルのパーミッションを制御できるようにする為に行います。パーミッションはumaskの影響を受けますが、継承したumaskがどのようになっているのか分からないためです。

サンプルコード

以下、デーモンのスケルトンコードを示します。

#!/usr/bin/php

<?php
declare(ticks = 1);

define('MAX_SIG_QUEUE_LEN', 1024);

function sig_handler($signo = NULL)
{
	static $s_signo = array();
	if (is_null($signo))
		return array_shift($s_signo);

	$s_signo[] = $signo;
	if ( count($s_signo) &gt;= MAX_SIG_QUEUE_LEN )
		array_shift($s_signo);
}

function daemonize()
{
	if ( pcntl_fork() != 0 )
		exit;
	posix_setsid();
	if ( pcntl_fork() != 0 )
		exit;

	chdir("/");
	umask(0);

	pcntl_signal(SIGTERM, "sig_handler");
	pcntl_signal(SIGHUP, "sig_handler");
	pcntl_signal(SIGCHLD, "sig_handler");
}

daemonize();
$living = TRUE;
while($living)
{
	$signo = sig_handler();

	switch ($signo)
	{
	case SIGTERM:   // 終了シグナル
		$living = FALSE; // 終了
		break;
	case SIGHUP:	// HUPシグナル
		// デーモン再起動処理
		break;
	case SIGCHLD:   // 子プロセスが終了した場合
		// 子プロセスのリソースの回収
		pcntl_waitpid(-1, $status, WNOHANG);
		break;
	case NULL:	  // シグナルがない場合
		sleep(1);   // 適当な処理
		break;
	default:
	}
}

今回は、こんな所で。
次回は一般のデーモンが行うその他の処理について補足したいと思います。

マカー Linux, PHP, その他

AmazonAPIを使ってみよう Part1:PEARパッケージインストール  

2008/4/3 木曜日 12:37:08

はじめまして。3月入社のかーつんです。

さて、業務系からWEB系に移って一発目の、まとも(?)な作業したんで、

その経過を復習がてら数回に分けて投稿してみたいと思います。

テーマは『AmazonAPIを使ってみよう!』

今回はPEARが提供してくれているパッケージのインストール。

使用したのは

  • Service_Amazon-0.7.1
  • XML_Serializer-0.18.0

この2つ。

前者はAmazonとの通信部分を。後者は結果として帰ってくるXMLデータを解析するのに使用します。

インストールはこんな感じ。

pear install --alldeps Services_Amazon-0.7.1 XML_Serializer-0.18.0

Service_AmazonはXML_Serializerに依存しています。

前述したXMLデータの解析の為です。

なので、インストール時ぶ『--alldeps』を付加してService_AmazonとXML_Serializerの依存関係を明確化し、

更に、どちらのパッケージもbeta版であるというのも回避してやります。

さて、ここで注意点が一つ。

私も犯したミスですが、パッケージバージョンを間違ってインストールしてしまったとき。

この場合既にインストールされているんで、

upgradeしてやればいいじゃん。と思われると思います。

しかし単純に、

upgrade Services_Amazon-x.x.x

なんてことをすると、『PEAR本体のバージョンまで更新される』可能性があります。

upgradeの特徴なのか、私はそれで失敗しました。

そこで、復旧方法と訂正方法について、

PEARのバージョンダウンはこんな感じで。

install -f PEAR-x.x.x

Services_Amazonのバージョン変更もこんな感じで。

install -f Services_Amazon-x.x.x

このように強制的に上書きインストールすることで、

『PEAR本体のバージョンまで更新される』なんてのを回避できます。

少々強引な感じがしますが、困ったときにはこんな手もあります。ということで。

では、今回はこの辺で。

かーつん Linux, PHP, その他