Tatsumakiチャットを見てたら
簡単に画像や動画が埋め込めるようなってたのでプラグインをみてみました。

jquery-oembedを使うと簡単に動画や画像の埋込みができます。

divにjavascriptから埋め込む方法と、aタグにclass="oembed"を書くと
自動的に変換する方法は以下のようになります。

<html>
<head>
<title>jQuery</title>
<script src="../static/jquery-1.3.2.min.js"></script>
<script src="../static/jquery.oembed.js"></script>
</head>
<body>
<script type="text/javascript">
  $(document).ready(function() {
  $("#container").oembed("http://www.flickr.com/photos/14516334@N00/345009210/");
  $("a.oembed").oembed();
  });
</script>
<div id="container"></div>
<div><a href="http://www.flickr.com/photos/14516334@N00/345009210/" class="oembed">Flickr Image</a></div>
<div><a href="http://vimeo.com/3108686" class="oembed">Vimeo Video</a></div>
<div><a href="http://www.youtube.com/watch?v=SJdqgMdwBbY" class="oembed">You Tube</a></div>
</body>
のように書くと、このような感じで埋め込まれます。

[mailman] MLのドメインを変更 メモ

既存のMLを新規に取得したドメインに変更したい時
mailmanの管理画面は複数ドメインを指定した場合ドメイン毎に分かれるので
移転後のドメインに表示するには
#/usr/local/mailman/bin/withlist -l -r fix_url Ticket -u ml.de4u.net
(Ticketという既存のMLをml.de4u.netに移行)
とすればとりあえず管理画面は新規ドメイン側に移行できた。

*hash:/usr/local/mailman/data/virtual-mailmanの中のドメインは変わってなかった
感じだったので動きの部分では注意かもしれないです。
あくまで管理画面の移動のおはなし。
1. Flash Bulider 4 Betaをインストール
Flash Bulider 4 Betaをインストールします。

2. (必要?) Flex 4 SDK beta 2を設置
Flex 4 SDK beta 2 をダウンロードします。
今回は
/flex/flex_sdk/ 
に設置します。

3. AIR 2.0 SDK をダウンロード
AIR 2.0 SDKをダウンロードしてマウントします。

4. Flex 4 SDKとAIR 2.0 SDK をマージします。
$ cd /flex/flex_sdk_4_3
$ ditto -V /Volumes/AIR\ SDK/ ./

5. Flash Builderで利用するSDKを設定します。
上記で作成したSDKを
 FlashBuilder > 環境設定 > FlashBuilder > インストールされている Flex SDK
に追加して選択します。
Flash Builder Setting

6. 試しに AIRアプリを新規につくってみる
新規 Flexプロジェクトを作成します。
プロジェクト名に sampleと指定します。
Flash Builder Make New Project

コンパイルした Flex アプリケーションを出力するフォルダーを設定
この場所を覚えておきます
Flash Builder Setting

この画面が出たらとりあえず、終了ボタンを押します。
Flash Builder Setting 4

ここでコンパイルしてAIRファイルを実行できるか確認します。
*問題発生した場合は、 Confusion on MAC install を確認してください

7. Interacting with a native process のサンプルを 動かす
Interacting with a native procesのページからダウンロードします。

パッケージエクスプローラーに写真のようにドラックアンドドロップします。
Flash Builder AIR2 Sample
sample.mxmlとsample-app.xmlを削除します。

コンパイルをすると以下のエラーがでますが、ここでは無視して Continueします。
Flash Builder AIR2 Sample2

以下のような画面がでればとりあえず成功です。
Flash Builder AIR2 Sample3
これで準備が完了しました。
ネィティブなパッケージ作成に進みます。

8. ネィティブなパッケージ作成
コンパイルした Flex アプリケーションを出力するフォルダーに
以下のファイルが作成されているのが分かります。
Flash Builder AIR2 Sample4

ここにアプリに必要な素材をコピーします。
サンプルからiconsというフォルダとNativeAppsをコピーします。
Flash Builder AIR2 Sample5

パッケージを作成するのに必要な鍵を作成します
ターミナルから"コンパイルした Flex アプリケーションを出力するフォルダー"で指定したフォルダーに移動します。
デジタル署名の作成 パスワードを1234にしておきます
 
$ adt -certificate -cn ADigitalID 1024-RSA myCert.p12 1234
パッケージを作成します
$/flex/flex_sdk_4/bin/adt -package -storetype pkcs12 -keystore myCert.p12 -target native NativeProcessTest.dmg NativeProcessTestFlex-app.xml NativeProcessTestFlex.swf NativeApps/Mac/bin/echoTestMac icons
パスワードは鍵を作成した時に指定したpassword: 1234 を入力します。
これでNativeProcessTest.dmgが作成されます。

9. AIRアプリインストールします
Flash Builder AIR2 Sample6

以下のように入力した文字が返ってくれば成功です
Flash Builder AIR2 Sample7

[AIR2.0 ajax] NativeProcessで perl を呼び出す メモ

  • 投稿日:
  • by
  • カテゴリ:
アドビのサンプル:Interacting with a native processのエコープログラムを
perlに置き換えてみました。

アドビのサンプル:Interacting with a native process

AIR2 ajax htmlの書き方の場合のメモを残します。
(FLEX,FLASH Builderのas3でのサンプルは多いのですが、ajaxでの書き方はあまり載っていないので。)

1. perl で標準入力から入力された文字をそのまま標準出力で返却するスクリプトを書く
NativeProcessは外部のアプリを起動し標準入出力でデータの受け渡しを行います。
AnyEventを使い標準入力があるまで待機し、入力が行われたら文字列をそのまま返します。
 
#!/usr/bin/perl
use strict;
use AnyEvent;

my $cv = AnyEvent->condvar;
my $w; $w = AnyEvent->io(
    fh   => \*STDIN,
    poll => 'r',
    cb   => sub {
        chomp(my $input = <STDIN>);
        print $input . "\n";
        $cv->send;
    },
    );
$cv->recv;
今回はecho.plという名前で保存します。

2. AIR2.0からperlスクリプトを実行します。
以下のような記述で perl スクリプトの呼び出しが行えます。
Ajaxでのargumentsの使い方が as3のVectorを使っており特殊なので注意してください
adobeのAIR2フォーラムから書式を参考にしました。
参考:NativeProcessInfo() arguments in JavaScript?

AIRから/usr/bin/perlを実行し、引数にスクリプトへのパスを指定しています。
インストール場所によっても違いますが、今回perlスクリプトへのパスは、
 
/Applications/NativeProcessTestHTML.app/Contents/Resources/echo.pl
になっていました。
AIRから、
 
/usr/bin/perl /Applications/NativeProcessTestHTML.app/Contents/Resources/echo.pl
で呼ばれるようにすれば良いことがわかります。
 
var nativeProcessStartupInfo = new air.NativeProcessStartupInfo();
nativeProcessStartupInfo.executable = new air.File( "/usr/bin/perl");    
var processArgs = new air.Vector["<String>"]();
processArgs.push(air.File.applicationDirectory.nativePath + "/echo.pl");
nativeProcessStartupInfo.arguments = processArgs;
process = new air.NativeProcess();
process.addEventListener(air.ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData);
process.addEventListener(air.ProgressEvent.STANDARD_INPUT_PROGRESS, inputProgressListener);
process.start(nativeProcessStartupInfo);
3. アプリを書き出す
NativeProcessを利用するには、
 
extendedDesktop
の設定が必要になります。
パッケージを作成します。
先程作成した echo.pl もパッケージに含める為に引数にいれます。
 
$adt -package -storetype pkcs12 -keystore myCert.p12 -target native NativeProcessTest.dmg application.xml index.html AIRAliases.js sample_styles.css icons echo.pl

以下の写真のように実行されました。 air2_ajax_NativeProcess_perl
文字を受け取ると以下が呼び出され、
もう一度launchEchoTest()が実行され perlを起動しAnyEventで入力待ちで待機します。
 
function onOutputData(event){
    var date = new Date();
    var bytes = process.standardOutput;
    var textReceived = document.getElementById("textReceived");
    textReceived.value = bytes.readUTFBytes(bytes.bytesAvailable);
    var dateStamp = document.getElementById("dateStamp");
    dateStamp.innerHTML = date.toString();
    launchEchoTest();
}
CPANのモジュールに依存しているものは、
配布するバイナリーから呼び出すのは注意が必要かもしれません。

追記
書いている途中で気がついたのですが
#!/usr/bin/perlが働いて
 
nativeProcessStartupInfo.executable = new air.File(air.File.applicationDirectory.nativePath + "/echo.pl");    
でも動きました。
vectorで引数を指定するのは別な事に使えそうなので
そのまま記載しておきます。
AIR2.0では、ネイティブなアプリの作成が可能になり
AIRのセキュリティサンドボックスから解放されるとFITCで聞いたので
実際に動かしてみました。
とは言っても、アドビの以下のサンプルを実行しただけです。
アドビのサンプル:Interacting with a native process

1. air sdkをインストールする
今回は c:¥air¥sdkに置きました。

2. サンプルをダウンロードしてC:¥air¥NativeProcessTestHTML
に設置しました。
air2_nativeprocess_ajax_win_1
3. デジタル署名の作成 パスワードを1234にしておきます
 
C:¥air¥NativeProcessTestHTML>c:¥air¥sdk¥bin¥adt -certificate -cn ADigitalID 1024
-RSA myCert.p12 1234

macではこんな感じです。
 
$ adt -certificate -cn ADigitalID 1024-RSA myCert.p12 1234
4. exeファイルを作成します
現時点ではサンプルのページの方法だと、iconsの記述が2つあり以下のエラーがでるので注意します。
 
Files "C:\air\NativeProcessTestHTML\icons\AIRApp_128.png" and "C:\air\NativeProc
essTestHTML\icons\AIRApp_128.png" have conflicting package paths: C:\air\NativeP
rocessTestHTML\icons\AIRApp_128.png

今回はこのようなコマンドを打ちます。
 
C:\air\NativeProcessTestHTML>c:¥air¥sdk¥bin¥adt -package -storetype pkcs12 -keys
tore myCert.p12 -target native NativeProcessTest.exe application.xml index.html
AIRAliases.js icons sample_styles.css NativeApps¥Windows¥bin
password: 1234

macの場合はこのような感じです。
 
$ adt -package -storetype pkcs12 -keystore myCert.p12 -target native NativeProcessTest.dmg application.xml index.html AIRAliases.js sample_styles.css icons NativeApps/Mac/bin/echoTestMac 
air2_nativeprocess_ajax_win_3

5. NativeProcessTest.exeというファイルができるので実行します
air2_nativeprocess_ajax_win_2
windowsのアプリと通信ができているのが確認できます。
んーいろいろ出来そうですね。

[FLASH as3 progression4] mac マウスホイール取得

  • 投稿日:
  • by
  • カテゴリ:
Q. progression4に組み込まれているSWFWheelを利用して
macでマウスホイールを取得したい
A. prgression4では、Index.as内のWebConfigの第一引数をtrueにすることで
SWFWheelの初期化SWFWheel.initialize( _target.stage );
を自動的に行ってくれます。

Index.as
 
		public function Index() {
			// 自動的に作成される Progression インスタンスの初期設定を行います。
			// 生成されたインスタンスにアクセスする場合には manager プロパティを参照してください。
			super( "index", IndexScene, new WebConfig(true, false, false) );
		}
WebConigの引数をみてみると
 
		 * 

新しい WebConfig インスタンスを作成します。

*

Creates a new WebConfig object.

* * @param useSWFWheel *

SWFWheel を有効化するかどうかです。

*

* @param SWFSize *

SWFSize を有効化するかどうかです。

*

* @param useHTMLInjector *

HTML インジェクション機能を有効化するかどうかです。

*

*/ public function WebConfig( useSWFWheel:Boolean = true, useSWFSize:Boolean = true, useHTMLInjector:Boolean = true ) {
となっており、第一引数がSWFWheelに関するものだと分かります。

実際にWheelの値を取得するには、IndexScene.asなどのシーンで
 
import flash.events.MouseEvent;
this.stage.addEventListener(MouseEvent.MOUSE_WHEEL, mouseWheel);
private function mouseWheel(event:MouseEvent):void {
    trace( "MouseDelta" , event.delta );
}
と記述すればマウスホールの値が取得できます。
余談ですが、SWFWheelを利用するとブラウザのスクロールバーより 優先してホイールイベントが送られるのでブラウザのスクロールバーを利用する場合は 注意が必要です。
FLASH as3 でプログラムを書く時に、progressionフレームワークを利用すると大変便利です。

progression4になって便利だと思うのは、
必要なリソースをロードしておいて
どの場所からでも簡単に使える事 (参考サイト: Progression4の新機能Resourceを試してみる)や 動作が軽くなった事です。
なんと言ってもprogressionを使うと書式が統一されて、
共同作業する際コードの見通しが楽になるという大きなメリットがあるので
progression流行っていただけるとありがたいので、
サイト作成時のメモを残してゆきます。

今回は、wonderflにシーン5個のサイトのモックを作成してみました。
mac osx leopardでlinuxのstraceみたいに特定のプロセスで
どのようなシステムコールが呼ばれているか確認してみる
システムコールを覗いてみれば実際にUNIXのシステムが何を行っているか
確認できるのでチューニングやデバックに役立つはずである

特定のプロセスでのシステムコールの呼び出し数を確認する
 
# sc_usage プロセスID
Tornad(python)とRemedie(perl)のプロセスを確認してみる

Tornad(python)のchatサンプルを確認する # sc_usage 278
Tornado_sc_usage

Remedie(perl)のプロセスを確認する # sc_usage 293
Remedie_sc_usage>


特定のプロセスのシステムコールを時系列で確認する
 
# dtruss -p プロセスID
Tornad(python)のchatサンプルを確認する # dtruss -p 278
Tornado_dtruss

Remedie(perl)のプロセスを確認する # dtruss -p 293
Remedie_dtruss

実際にデバックで便利だったのは、
Apacheがcoredumpしてしまいゾンビプロセスが多数発生する状態になった時に
ログのフェーズに行く前にゾンビになってたので、
どのプログラムをディスパッチした時にエラーが起きているか判断するのに有効であった。

linuxでもstraceを行い macとカーネルコールの呼び出しの比較を行ってみるのも面白そうである。

参考にさせていただいたサイト :
strace on Mac OS X Leopard
Kernel Programming Guide

[Python] tornado blogのサンプルを試す

今回は、 Facebook/FriendFeedのフレームワーク/Webサーバ tornado blogのサンプルを試してみる (mac osx 10.5 leopard)
どのようなサンプルかというと
1. ログインは、Google AUTH
2. データの保存はmysql

mysqlへのデータの保存をtornadoでどのような記述で行っているか確認するのに最適な サンプルである
それではサンプルを試してみよう まずは、READMEを読む事からはじめよう
 
1. Install prerequisites and build tornado
2. Install MySQL if needed
3. Connect to MySQL and create a database and user for the blog.
   Connect to MySQL as a user that can create databases and users:
   mysql -u root
   Create a database named "blog":
   mysql> CREATE DATABASE blog;
   Allow the "blog" user to connect with the password "blog":
   mysql> GRANT ALL PRIVILEGES ON blog.* TO 'blog'@'localhost' IDENTIFIED BY 'blog';
4. Create the tables in your new database.
   You can use the provided schema.sql file by running this command:
   mysql --user=blog --password=blog --database=blog < schema.sql
5. Run the blog example
   With the default user, password, and database you can just run:
   ./blog.py
とりあえず、mysqlが入っていないとダメなので まずはmysqlを入れてみる事にする
mysqlは以下のサイトを参考に入れた
MySQLのインストール - Max OS X LeopardでAMP環境を構築しよう - Apache, MySQL, PHP, Perlで作る開発環境 - futomi's CGI Cafe
あとで easy_install mysql-python を行う時にエラーがでるのでmysql へのPATHを通しておこう
 
# cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf
# emacs .bash_profile
# export PATH=/usr/local/bin:/usr/local/mysql/bin:$PATH
システム環境からmysqlを起動しておく
あとはREADMEの通りmysqlにスキーマを構築する
 
mysql> CREATE DATABASE blog;
mysql> GRANT ALL PRIVILEGES ON blog.* TO 'blog'@'localhost' IDENTIFIED BY 'blog';
mysql --user=blog --password=blog --database=blog < schema.sql
すでにmysqlが入っていたりで変更を行いたければ tornado/demos/blog/blog.py の先頭の
 
define("port", default=8888, help="run on the given port", type=int)
define("mysql_host", default="127.0.0.1:3306", help="blog database host")
define("mysql_database", default="blog", help="blog database name")
define("mysql_user", default="blog", help="blog database user")
define("mysql_password", default="blog", help="blog database password")
mysqlのユーザ等を変更すればよいだろう それではtornado blogを起動してみよう
 
$ ./blog.py
無事起動が済んだらブラウザから以下にアクセスする
 
http://localhost:8888/
googleAUTHが無事完了し、ブラウザで以下の表示がされれば完了だ
Tornado Sample Blog
以下のような記事を書いてみてmysqlにどの様にデータが入るか確認してみる
TornadoBlogData
表の動作の確認が済んだらmysqlの中身を確認してみよう
 
mysql> show tables;
+----------------+
| Tables_in_blog |
+----------------+
| authors        | 
| entries        | 
+----------------+
2 rows in set (0.01 sec)

mysql>  select * from authors;
+----+---------------------+-----------------+
| id | email               | name            |
+----+---------------------+-----------------+
|  1 | MAIN@ADDRESS | Yoshimune KITTA | 
+----+---------------------+-----------------+
1 row in set (0.00 sec)

mysql>  select * from entries\G;
*************************** 1. row ***************************
       id: 1
author_id: 1
     slug: test-title
    title: test title
 markdown: test body
     html: <p> test body</p> 

published: 2009-09-21 05:22:59
  updated: 2009-09-21 14:22:59
*************************** 2. row ***************************
       id: 2
author_id: 1
     slug: test-title2
    title: test title2
 markdown: test body2
     html: <p> test body2</p> 

published: 2009-09-21 05:23:20
  updated: 2009-09-21 14:23:20
2 rows in set (0.00 sec)
上記のデータを入れた時のサーバのログは以下のようになる
TornadoBlogServerLog
この事から新規記事作成は composeが呼ばれ、編集はcompose?id=1 が呼ばれる事がわかる 編集時は、
 
def get(self):
        id = self.get_argument("id", None)
        entry = None
        if id:
            entry = self.db.get("SELECT * FROM entries WHERE id = %s", int(id))
        self.render("compose.html", entry=entry)
 
getでidをみてidがあればフォームにデータをフィルインする
編集時は、既存の記事があるか確認しupdate
 
     if id:
            entry = self.db.get("SELECT * FROM entries WHERE id = %s", int(id))
            if not entry: raise tornado.web.HTTPError(404)
            slug = entry.slug
            self.db.execute(
                "UPDATE entries SET title = %s, markdown = %s, html = %s "
                "WHERE id = %s", title, text, html, int(id))
新規の記事投稿は、
 
  else:
            slug = unicodedata.normalize("NFKD", title).encode(
                "ascii", "ignore")
            slug = re.sub(r"[^\w]+", " ", slug)
            slug = "-".join(slug.lower().strip().split())
            if not slug: slug = "entry"
            while True:
                e = self.db.get("SELECT * FROM entries WHERE slug = %s", slug)
                if not e: break
                slug += "-2"
            self.db.execute(
                "INSERT INTO entries (author_id,title,slug,markdown,html,"
                "published) VALUES (%s,%s,%s,%s,%s,UTC_TIMESTAMP())",
                self.current_user.id, title, slug, text, html)
        self.redirect("/entry/" + slug)
非常にシンプルな形で、実装されているのが確認できる
PreforkのApacheの動作を確認する
ここではプロセスを1個にしぼって
MaxRequestsPerChild 2にしたときの挙動を確認する
  

dStartServers       1
MinSpareServers    1
MaxSpareServers    1
ServerLimit      1
MaxClients       1
MaxRequestsPerChild  2

ログのフォーマットを変更して処理を行ってるapacheのプロセスIDを表示するようにする
参考: Apache モジュール mod_log_config : カスタムログ書式
  
LogFormat "%h %l %u %t \"%r\" %>s %b %P" common_plus_pid
CustomLog logs/sandbox.de4u.net-access_log common_plus_pid

apacheを再起動してログを確認する
最後の数字がプロセスIDになる
  
# tail -f /var/log/httpd/sandbox.de4u.net-access_log
10.0.1.1 - - [20/Sep/2009:22:14:42 +0900] "GET / HTTP/1.1" 401 486 25822
10.0.1.1 - yoshimax [20/Sep/2009:22:14:42 +0900] "GET / HTTP/1.1" 200 7 25822
10.0.1.1 - yoshimax [20/Sep/2009:22:14:44 +0900] "GET /favicon.ico HTTP/1.1" 404 294 25825
10.0.1.1 - yoshimax [20/Sep/2009:22:14:47 +0900] "GET / HTTP/1.1" 200 7 25825
10.0.1.1 - yoshimax [20/Sep/2009:22:14:49 +0900] "GET /favicon.ico HTTP/1.1" 404 294 25826
10.0.1.1 - yoshimax [20/Sep/2009:22:14:57 +0900] "GET / HTTP/1.1" 200 7 25826
10.0.1.1 - yoshimax [20/Sep/2009:22:14:59 +0900] "GET /favicon.ico HTTP/1.1" 404 294 25827
10.0.1.1 - - [20/Sep/2009:22:19:16 +0900] "GET / HTTP/1.1" 401 486 25827
10.0.1.1 - yoshimax [20/Sep/2009:22:19:18 +0900] "GET / HTTP/1.1" 200 7 25836
10.0.1.1 - yoshimax [20/Sep/2009:22:19:18 +0900] "GET /favicon.ico HTTP/1.1" 404 294 25836
プロセスIDを確認する
  
# ps auxww|grep httpd
root     25809  0.0  0.5  25444 10496 ?        Ss   22:14   0:00 /usr/sbin/httpd
apache   25827  0.0  0.3  25508  6232 ?        S    22:14   0:00 /usr/sbin/httpd
  
# ps auxww|grep httpd
root     25809  0.0  0.5  25444 10496 ?        Ss   22:14   0:00 /usr/sbin/httpd
apache   25837  0.0  0.2  25444  5216 ?        S    22:19   0:00 /usr/sbin/httpd
2回アクセスがある度にプロセスIDが変わっているのが確認できる
MaxRequestsPerChildの挙動は確認できたので
ここでMaxRequestsPerChild 10にして再起動する
ではstrace でapacheのプロセスで何が行われているか確認してみよう
traceを行う為にプロセスのIDが必要なのでhttpdのプロセスIDを確認する
  
# ps auxww|grep httpd
root     25893  0.2  0.5  25444 10496 ?        Ss   22:28   0:00 /usr/sbin/httpd
apache   25906  0.0  0.2  25444  5216 ?        S    22:28   0:00 /usr/sbin/httpd
子プロセスのIDがわかったのでstraceを行ってみよう
  
# strace -f -p 25906
Process 25906 attached - interrupt to quit
epoll_wait(25, 
と表示される epoll_wait(25, の部分でHTTPが待ち受け状態になっているのが確認できる
ここで Apacheにリクエストを投げてみよう http://sandbox.de4u.net/に ブラウザからアクセスをおこなってみよう
http://sandbox.de4u.net/のディレクティブにはindex.htmlが置いてあり
# cat /home/www/sandbox/htdocs/index.html
sandbox
というファイルが置いてある
アクセスを行うと以下のstraceログが出力される
  
Process 25906 attached - interrupt to quit
epoll_wait(25, 
{{EPOLLIN, {u32=145139040, u64=13799927267350455648}}}, 2, -1) = 1
accept(4, {sa_family=AF_INET6, sin6_port=htons(33398), inet_pton(AF_INET6, "::ffff:10.0.1.1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 27
semop(3670020, 0x5b0dbe, 1)             = 0
getsockname(27, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "::ffff:10.0.1.100", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0
fcntl64(27, F_GETFL)                    = 0x2 (flags O_RDWR)
fcntl64(27, F_SETFL, O_RDWR|O_NONBLOCK) = 0
read(27, "GET / HTTP/1.1\r\nHost: sandbox.dr"..., 8000) = 543
gettimeofday({1253453446, 493582}, NULL) = 0
stat64("/home/www/sandbox/htdocs/", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
open("/etc/httpd/conf/.httpasswd", O_RDONLY|O_LARGEFILE) = 28
fstat64(28, {st_mode=S_IFREG|0644, st_size=41, ...}) = 0
read(28, "dev:RXpxSyJE\nmax:.kBr"..., 4096) = 41
close(28)                               = 0
time(NULL)                              = 1253453446
stat64("/home/www/sandbox/config/environment.rb", 0xbf832a9c) = -1 ENOENT (No such file or directory)
time(NULL)                              = 1253453446
stat64("/home/www/sandbox/config.ru", 0xbf832a9c) = -1 ENOENT (No such file or directory)
time(NULL)                              = 1253453446
stat64("/home/www/sandbox/passenger_wsgi.py", 0xbf832a9c) = -1 ENOENT (No such file or directory)
stat64("/home/www/sandbox/htdocs/index.php", 0xbf832cec) = -1 ENOENT (No such file or directory)
lstat64("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/home/www", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
lstat64("/home/www/sandbox", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
lstat64("/home/www/sandbox/htdocs", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
lstat64("/home/www/sandbox/htdocs/index.php", 0xbf832cec) = -1 ENOENT (No such file or directory)
open("/etc/httpd/conf/.httpasswd", O_RDONLY|O_LARGEFILE) = 28
fstat64(28, {st_mode=S_IFREG|0644, st_size=41, ...}) = 0
read(28, "dev:m0xVyJE\nmax:.kBjr"..., 4096) = 41
close(28)                               = 0
time(NULL)                              = 1253453446
stat64("/home/www/sandbox/config/environment.rb", 0xbf83299c) = -1 ENOENT (No such file or directory)
time(NULL)                              = 1253453446
stat64("/home/www/sandbox/config.ru", 0xbf83299c) = -1 ENOENT (No such file or directory)
time(NULL)                              = 1253453446
stat64("/home/www/sandbox/passenger_wsgi.py", 0xbf83299c) = -1 ENOENT (No such file or directory)
stat64("/home/www/sandbox/htdocs/index.html", {st_mode=S_IFREG|0777, st_size=7, ...}) = 0
open("/etc/httpd/conf/.httpasswd", O_RDONLY|O_LARGEFILE) = 28
fstat64(28, {st_mode=S_IFREG|0644, st_size=41, ...}) = 0
read(28, "dev:pxVyJE\nmax:.kBjr"..., 4096) = 41
close(28)                              = 0
time(NULL)                              = 1253453446
stat64("/home/www/sandbox/config/environment.rb", 0xbf83299c) = -1 ENOENT (No such file or directory)
time(NULL)                              = 1253453446
stat64("/home/www/sandbox/config.ru", 0xbf83299c) = -1 ENOENT (No such file or directory)
time(NULL)                              = 1253453446
stat64("/home/www/sandbox/passenger_wsgi.py", 0xbf83299c) = -1 ENOENT (No such file or directory)
open("/home/www/sandbox/htdocs/index.html", O_RDONLY|O_LARGEFILE) = 28
mmap2(NULL, 7, PROT_READ, MAP_SHARED, 28, 0) = 0xb7f3e000
writev(27, [{"HTTP/1.1 200 OK\r\nDate: Sun, 20 S"..., 260}, {"sandbox", 7}], 2) = 267
munmap(0xb7f3e000, 7)                   = 0
write(22, "10.0.1.1 - yoshimax [20/Sep/2009"..., 78) = 78
shutdown(27, 1 /* send */)              = 0
poll([{fd=27, events=POLLIN}], 1, 2000) = 1 ([{fd=27, revents=POLLIN|POLLHUP}])
read(27, "", 512)                       = 0
close(27)                               = 0
read(8, 0xbf833073, 1)                  = -1 EAGAIN (Resource temporarily unavailable)
close(28)                               = 0
semop(3670020, 0x5b0db8, 1)             = 0
epoll_wait(25, 
straceを行うとLinuxのシステムコールレベルで何が行われているか確認できる
Linuxのシステムコール関数は、ひとつづつJM Project /JM/html/LDP_man-pages/man2で確認をしていけば内部でどのような動作が行われているか理解できるはずだ。
つぎにphpから外部のサイトのデータを取得した場合のapacheのプロセスをトレースしてみよう
  
<?php
$file = fopen("http://www.google.com/", "r");
while (!feof ($file)) {
  $line = fgets ($file, 1024);
  print	$line;
}
fclose($file);
?>
上記のプログラムにアクセスした場合のstraceのログは以下のようになる
  
# strace -f -p 26019
Process 26025 attached - interrupt to quit
epoll_wait(25, 
{{EPOLLIN, {u32=145139040, u64=13799927404789409120}}}, 2, -1) = 1
accept(4, {sa_family=AF_INET6, sin6_port=htons(46673), inet_pton(AF_INET6, "::ffff:10.0.1.1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 27
semop(3670020, 0x5b0dbe, 1)             = 0
getsockname(27, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "::ffff:10.0.1.100", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0
fcntl64(27, F_GETFL)                    = 0x2 (flags O_RDWR)
fcntl64(27, F_SETFL, O_RDWR|O_NONBLOCK) = 0
read(27, "GET /test1.php HTTP/1.1\r\nHost: s"..., 8000) = 552
gettimeofday({1253455264, 425412}, NULL) = 0
stat64("/home/www/sandbox/htdocs/test1.php", {st_mode=S_IFREG|0664, st_size=141, ...}) = 0
open("/etc/httpd/conf/.httpasswd", O_RDONLY|O_LARGEFILE) = 28
fstat64(28, {st_mode=S_IFREG|0644, st_size=41, ...}) = 0
read(28, "dev:09VyJE\nmax:.kBjr"..., 4096) = 41
close(28)                               = 0
time(NULL)                              = 1253455264
stat64("/home/www/sandbox/config/environment.rb", 0xbf832abc) = -1 ENOENT (No such file or directory)
time(NULL)                              = 1253455264
stat64("/home/www/sandbox/config.ru", 0xbf832abc) = -1 ENOENT (No such file or directory)
time(NULL)                              = 1253455264
stat64("/home/www/sandbox/passenger_wsgi.py", 0xbf832abc) = -1 ENOENT (No such file or directory)
setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={60, 0}}, NULL) = 0
rt_sigaction(SIGPROF, {0x5421340, [PROF], SA_RESTART}, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [PROF], NULL, 8) = 0
gettimeofday({1253455264, 428961}, NULL) = 0
getcwd("/", 4095)                       = 2
chdir("/home/www/sandbox/htdocs")       = 0
setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={30, 0}}, NULL) = 0
rt_sigaction(SIGPROF, {0x5421340, [PROF], SA_RESTART}, {0x5421340, [PROF], SA_RESTART}, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [PROF], NULL, 8) = 0
time(NULL)                              = 1253455264
lstat64("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/home/www", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
lstat64("/home/www/sandbox", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
lstat64("/home/www/sandbox/htdocs", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
lstat64("/home/www/sandbox/htdocs/test1.php", {st_mode=S_IFREG|0664, st_size=141, ...}) = 0
open("/home/www/sandbox/htdocs/test1.php", O_RDONLY) = 28
fstat64(28, {st_mode=S_IFREG|0664, st_size=141, ...}) = 0
lseek(28, 0, SEEK_CUR)                  = 0
brk(0x8af6000)                          = 0x8af6000
read(28, "<?php\n$file = fopen(\"http://www."..., 8192) = 141
read(28, "", 8192)                      = 0
read(28, "", 8192)                      = 0
close(28)                               = 0
socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 28
close(28)                               = 0
open("/etc/hosts", O_RDONLY)            = 28
fcntl64(28, F_GETFD)                    = 0
fcntl64(28, F_SETFD, FD_CLOEXEC)        = 0
fstat64(28, {st_mode=S_IFREG|0644, st_size=187, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f3e000
read(28, "# Do not remove the following li"..., 4096) = 187
read(28, "", 4096)                      = 0
close(28)                               = 0
munmap(0xb7f3e000, 4096)                = 0
open("/etc/hosts", O_RDONLY)            = 28
fcntl64(28, F_GETFD)                    = 0
fcntl64(28, F_SETFD, FD_CLOEXEC)        = 0
fstat64(28, {st_mode=S_IFREG|0644, st_size=187, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f3e000
read(28, "# Do not remove the following li"..., 4096) = 187
read(28, "", 4096)                      = 0
close(28)                               = 0
munmap(0xb7f3e000, 4096)                = 0
open("/etc/ld.so.cache", O_RDONLY)      = 28
fstat64(28, {st_mode=S_IFREG|0644, st_size=34002, ...}) = 0
mmap2(NULL, 34002, PROT_READ, MAP_PRIVATE, 28, 0) = 0xb7f36000
close(28)                               = 0
open("/lib/libnss_dns.so.2", O_RDONLY)  = 28
read(28, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\240\v\0\0004\0\0\0"..., 512) = 512
fstat64(28, {st_mode=S_IFREG|0755, st_size=21876, ...}) = 0
mmap2(NULL, 20612, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 28, 0) = 0x82a000
mmap2(0x82e000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 28, 0x3) = 0x82e000
close(28)                               = 0
mprotect(0x82e000, 4096, PROT_READ)     = 0
munmap(0xb7f36000, 34002)               = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 28
connect(28, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.0.1.1")}, 28) = 0
fcntl64(28, F_GETFL)                    = 0x2 (flags O_RDWR)
fcntl64(28, F_SETFL, O_RDWR|O_NONBLOCK) = 0
gettimeofday({1253455264, 437877}, NULL) = 0
poll([{fd=28, events=POLLOUT}], 1, 0)   = 1 ([{fd=28, revents=POLLOUT}])
send(28, "\220#\1\0\0\1\0\0\0\0\0\0\3www\6google\3com\0\0\34\0\1", 32, MSG_NOSIGNAL) = 32
poll([{fd=28, events=POLLIN}], 1, 5000) = 1 ([{fd=28, revents=POLLIN}])
ioctl(28, FIONREAD, [52])               = 0
recvfrom(28, "\220#\201\200\0\1\0\1\0\0\0\0\3www\6google\3com\0\0\34\0\1"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.0.1.1")}, [16]) = 52
close(28)                               = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 28
connect(28, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.0.1.1")}, 28) = 0
fcntl64(28, F_GETFL)                    = 0x2 (flags O_RDWR)
fcntl64(28, F_SETFL, O_RDWR|O_NONBLOCK) = 0
gettimeofday({1253455264, 445300}, NULL) = 0
poll([{fd=28, events=POLLOUT}], 1, 0)   = 1 ([{fd=28, revents=POLLOUT}])
send(28, " \246\1\0\0\1\0\0\0\0\0\0\3www\6google\3com\0\0\1\0\1", 32, MSG_NOSIGNAL) = 32
poll([{fd=28, events=POLLIN}], 1, 5000) = 1 ([{fd=28, revents=POLLIN}])
ioctl(28, FIONREAD, [116])              = 0
recvfrom(28, " \246\201\200\0\1\0\5\0\0\0\0\3www\6google\3com\0\0\1\0\1"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.0.1.1")}, [16]) = 116
close(28)                               = 0
socket(PF_NETLINK, SOCK_RAW, 0)         = 28
bind(28, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 0
getsockname(28, {sa_family=AF_NETLINK, pid=26025, groups=00000000}, [12]) = 0
time(NULL)                              = 1253455264
sendto(28, "\24\0\0\0\26\0\1\3\2405\266J\0\0\0\0\0\0\0\0", 20, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20
recvmsg(28, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"<\0\0\0\24\0\2\0\2405\266J\251e\0\0\2\10\200\376\1\0\0\0\10\0\1\0\177\0\0\1"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 196
recvmsg(28, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"@\0\0\0\24\0\2\0\2405\266J\251e\0\0\n\200\200\376\1\0\0\0\24\0\1\0\0\0\0\0"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 384
recvmsg(28, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\24\0\0\0\3\0\2\0\2405\266J\251e\0\0\0\0\0\0\1\0\0\0\24\0\1\0\0\0\0\0"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 20
close(28)                               = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 28
connect(28, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("66.249.89.147")}, 16) = 0
getsockname(28, {sa_family=AF_INET, sin_port=htons(44684), sin_addr=inet_addr("10.0.1.100")}, [16]) = 0
close(28)                               = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 28
connect(28, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("66.249.89.103")}, 16) = 0
getsockname(28, {sa_family=AF_INET, sin_port=htons(49718), sin_addr=inet_addr("10.0.1.100")}, [16]) = 0
close(28)                               = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 28
connect(28, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("66.249.89.104")}, 16) = 0
getsockname(28, {sa_family=AF_INET, sin_port=htons(39169), sin_addr=inet_addr("10.0.1.100")}, [16]) = 0
close(28)                               = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 28
connect(28, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("66.249.89.99")}, 16) = 0
getsockname(28, {sa_family=AF_INET, sin_port=htons(51659), sin_addr=inet_addr("10.0.1.100")}, [16]) = 0
close(28)                               = 0
gettimeofday({1253455264, 459267}, NULL) = 0
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 28
fcntl64(28, F_GETFL)                    = 0x2 (flags O_RDWR)
fcntl64(28, F_SETFL, O_RDWR|O_NONBLOCK) = 0
connect(28, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("66.249.89.147")}, 16) = -1 EINPROGRESS (Operation now in progress)
poll([{fd=28, events=POLLIN|POLLOUT|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=28, revents=POLLOUT}])
getsockopt(28, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
fcntl64(28, F_SETFL, O_RDWR)            = 0
send(28, "GET / HTTP/1.0\r\n", 16, 0)   = 16
send(28, "Host: www.google.com\r\n", 22, 0) = 22
send(28, "\r\n", 2, 0)                  = 2
poll([{fd=28, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)
poll([{fd=28, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=28, revents=POLLIN}])
recv(28, "HTTP/1.0 302 Found\r\nLocation: ht"..., 8192, 0) = 792
close(28)                               = 0
open("/etc/hosts", O_RDONLY)            = 28
fcntl64(28, F_GETFD)                    = 0
fcntl64(28, F_SETFD, FD_CLOEXEC)        = 0
fstat64(28, {st_mode=S_IFREG|0644, st_size=187, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f3e000
read(28, "# Do not remove the following li"..., 4096) = 187
read(28, "", 4096)                      = 0
close(28)                               = 0
munmap(0xb7f3e000, 4096)                = 0
open("/etc/hosts", O_RDONLY)            = 28
fcntl64(28, F_GETFD)                    = 0
fcntl64(28, F_SETFD, FD_CLOEXEC)        = 0
fstat64(28, {st_mode=S_IFREG|0644, st_size=187, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f3e000
read(28, "# Do not remove the following li"..., 4096) = 187
read(28, "", 4096)                      = 0
close(28)                               = 0
munmap(0xb7f3e000, 4096)                = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 28
connect(28, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.0.1.1")}, 28) = 0
fcntl64(28, F_GETFL)                    = 0x2 (flags O_RDWR)
fcntl64(28, F_SETFL, O_RDWR|O_NONBLOCK) = 0
gettimeofday({1253455264, 531407}, NULL) = 0
poll([{fd=28, events=POLLOUT}], 1, 0)   = 1 ([{fd=28, revents=POLLOUT}])
send(28, "\304\210\1\0\0\1\0\0\0\0\0\0\3www\6google\2co\2jp\0\0\34"..., 34, MSG_NOSIGNAL) = 34
poll([{fd=28, events=POLLIN}], 1, 5000) = 1 ([{fd=28, revents=POLLIN}])
ioctl(28, FIONREAD, [82])               = 0
recvfrom(28, "\304\210\201\200\0\1\0\2\0\0\0\0\3www\6google\2co\2jp\0\0\34"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.0.1.1")}, [16]) = 82
close(28)                               = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 28
connect(28, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.0.1.1")}, 28) = 0
fcntl64(28, F_GETFL)                    = 0x2 (flags O_RDWR)
fcntl64(28, F_SETFL, O_RDWR|O_NONBLOCK) = 0
gettimeofday({1253455264, 544028}, NULL) = 0
poll([{fd=28, events=POLLOUT}], 1, 0)   = 1 ([{fd=28, revents=POLLOUT}])
send(28, "QU\1\0\0\1\0\0\0\0\0\0\3www\6google\2co\2jp\0\0\1"..., 34, MSG_NOSIGNAL) = 34
poll([{fd=28, events=POLLIN}], 1, 5000) = 1 ([{fd=28, revents=POLLIN}])
ioctl(28, FIONREAD, [146])              = 0
recvfrom(28, "QU\201\200\0\1\0\6\0\0\0\0\3www\6google\2co\2jp\0\0\1"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.0.1.1")}, [16]) = 146
close(28)                               = 0
socket(PF_NETLINK, SOCK_RAW, 0)         = 28
bind(28, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 0
getsockname(28, {sa_family=AF_NETLINK, pid=26025, groups=00000000}, [12]) = 0
time(NULL)                              = 1253455264
sendto(28, "\24\0\0\0\26\0\1\3\2405\266J\0\0\0\0\0\0\0\0", 20, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20
recvmsg(28, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"<\0\0\0\24\0\2\0\2405\266J\251e\0\0\2\10\200\376\1\0\0\0\10\0\1\0\177\0\0\1"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 196
recvmsg(28, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"@\0\0\0\24\0\2\0\2405\266J\251e\0\0\n\200\200\376\1\0\0\0\24\0\1\0\0\0\0\0"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 384
recvmsg(28, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\24\0\0\0\3\0\2\0\2405\266J\251e\0\0\0\0\0\0\1\0\0\0\24\0\1\0\0\0\0\0"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 20
close(28)                               = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 28
connect(28, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("66.249.89.147")}, 16) = 0
getsockname(28, {sa_family=AF_INET, sin_port=htons(38813), sin_addr=inet_addr("10.0.1.100")}, [16]) = 0
close(28)                               = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 28
connect(28, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("66.249.89.103")}, 16) = 0
getsockname(28, {sa_family=AF_INET, sin_port=htons(60447), sin_addr=inet_addr("10.0.1.100")}, [16]) = 0
close(28)                               = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 28
connect(28, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("66.249.89.104")}, 16) = 0
getsockname(28, {sa_family=AF_INET, sin_port=htons(60741), sin_addr=inet_addr("10.0.1.100")}, [16]) = 0
close(28)                               = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 28
connect(28, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("66.249.89.99")}, 16) = 0
getsockname(28, {sa_family=AF_INET, sin_port=htons(49633), sin_addr=inet_addr("10.0.1.100")}, [16]) = 0
close(28)                               = 0
gettimeofday({1253455264, 557993}, NULL) = 0
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 28
fcntl64(28, F_GETFL)                    = 0x2 (flags O_RDWR)
fcntl64(28, F_SETFL, O_RDWR|O_NONBLOCK) = 0
connect(28, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("66.249.89.147")}, 16) = -1 EINPROGRESS (Operation now in progress)
poll([{fd=28, events=POLLIN|POLLOUT|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=28, revents=POLLOUT}])
getsockopt(28, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
fcntl64(28, F_SETFL, O_RDWR)            = 0
send(28, "GET / HTTP/1.0\r\n", 16, 0)   = 16
send(28, "Host: www.google.co.jp\r\n", 24, 0) = 24
send(28, "\r\n", 2, 0)                  = 2
poll([{fd=28, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)
poll([{fd=28, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=28, revents=POLLIN}])
recv(28, "HTTP/1.0 200 OK\r\nDate: Sun, 20 S"..., 8192, 0) = 1418
poll([{fd=28, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=28, revents=POLLIN}])
recv(28, "nction _gjp(){!(window._gjwl.has"..., 8192, 0) = 1418
poll([{fd=28, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=28, revents=POLLIN}])
recv(28, "r:1px solid;border-color:#c9d7f1"..., 8192, 0) = 1803
poll([{fd=28, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=28, revents=POLLIN}])
recv(28, "e.co.jp/?hl=ja&tab=wb\" onclick=g"..., 8192, 0) = 1418
poll([{fd=28, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=28, revents=POLLIN}])
recv(28, "lpadding=0 cellspacing=0><tr val"..., 8192, 0) = 1418
poll([{fd=28, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=28, revents=POLLIN}])
recv(28, "f=\"http://news.google.co.jp/nwsh"..., 8192, 0) = 1418
poll([{fd=28, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=28, revents=POLLIN}])
recv(28, "wi\"><div class=plwi2><a href=\"ht"..., 8192, 0) = 1418
poll([{fd=28, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=28, revents=POLLIN}])
recv(28, "/div></li><li class=\"gib plpr\"><"..., 8192, 0) = 1650
writev(27, [{"HTTP/1.1 200 OK\r\nDate: Sun, 20 S"..., 199}, {"27ae\r\n", 6}, {"<html><head><meta http-equiv=\"co"..., 5043}, {"p/ig%3Fhl%3Dja%26source%3Diglk&u"..., 5115}, {"\r\n", 2}], 5) = 10365
poll([{fd=28, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=28, revents=POLLIN}])
recv(28, "", 8192, 0)                   = 0
close(28)                               = 0
chdir("/")                              = 0
setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0
writev(27, [{"4ec\r\n", 5}, {"ef=\"/intl/ja/options/\">\203T\201[\203r\203X\210"..., 1260}, {"\r\n", 2}, {"0\r\n\r\n", 5}], 4) = 1272
write(22, "10.0.1.1 - yoshimax [20/Sep/2009"..., 91) = 91
shutdown(27, 1 /* send */)              = 0
poll([{fd=27, events=POLLIN}], 1, 2000) = 1 ([{fd=27, revents=POLLIN|POLLHUP}])
read(27, "", 512)                       = 0
close(27)                               = 0
read(8, 0xbf833093, 1)                  = -1 EAGAIN (Resource temporarily unavailable)
semop(3670020, 0x5b0db8, 1)             = 0
epoll_wait(25, 
システムコールのsocketが呼ばれ外部サイトの情報を取得しているのが確認できる
最後にphpからmysqlに繋いだ場合のapacheのプロセスをトレースしてみる mysqlへの接続はシステムコールレベルではどの関数が呼ばれているのでしょうか。
  
<?php
$connect = mysql_connect("localhost", "mtuser", "JoAl24u");
mysql_select_db("mt_sandbox");
$sql = "SELECT * FROM mt_blog";                                                                         
$qu = mysql_query($sql, $connect);                                                                      

while ($row = mysql_fetch_array($qu)) {
  print_r($row);
 }                                                                                                      
mysql_close($connect);
?>
アパッチのプロセスをstraceしてみる
  
# strace -f -p 26183
Process 26183 attached - interrupt to quit
epoll_wait(25, 
{{EPOLLIN, {u32=147690928, u64=13810652316087195056}}}, 2, -1) = 1
accept(4, {sa_family=AF_INET6, sin6_port=htons(37027), inet_pton(AF_INET6, "::ffff:10.0.1.1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 27
semop(3866628, 0x4cfdbe, 1)             = 0
getsockname(27, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "::ffff:10.0.1.100", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0
fcntl64(27, F_GETFL)                    = 0x2 (flags O_RDWR)
fcntl64(27, F_SETFL, O_RDWR|O_NONBLOCK) = 0
read(27, "GET /test2.php HTTP/1.1\r\nHost: s"..., 8000) = 483
gettimeofday({1253456170, 329252}, NULL) = 0
stat64("/home/www/sandbox/htdocs/test2.php", {st_mode=S_IFREG|0644, st_size=251, ...}) = 0
writev(27, [{"HTTP/1.1 401 Authorization Requi"..., 230}, {"<!DOCTYPE HTML PUBLIC \"-//IETF//"..., 486}], 2) = 716
write(22, "10.0.1.1 - - [20/Sep/2009:23:16:"..., 82) = 82
shutdown(27, 1 /* send */)              = 0
poll([{fd=27, events=POLLIN}], 1, 2000) = 1 ([{fd=27, revents=POLLIN|POLLHUP}])
read(27, "", 512)                       = 0
close(27)                               = 0
read(8, 0xbfa94ad3, 1)                  = -1 EAGAIN (Resource temporarily unavailable)
semop(3866628, 0x4cfdb8, 1)             = 0
epoll_wait(25, {{EPOLLIN, {u32=147690928, u64=13810652316087195056}}}, 2, -1) = 1
accept(4, {sa_family=AF_INET6, sin6_port=htons(39320), inet_pton(AF_INET6, "::ffff:10.0.1.1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 27
semop(3866628, 0x4cfdbe, 1)             = 0
getsockname(27, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "::ffff:10.0.1.100", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0
fcntl64(27, F_GETFL)                    = 0x2 (flags O_RDWR)
fcntl64(27, F_SETFL, O_RDWR|O_NONBLOCK) = 0
read(27, "GET /test2.php HTTP/1.1\r\nHost: s"..., 8000) = 526
gettimeofday({1253456170, 340681}, NULL) = 0
stat64("/home/www/sandbox/htdocs/test2.php", {st_mode=S_IFREG|0644, st_size=251, ...}) = 0
open("/etc/httpd/conf/.httpasswd", O_RDONLY|O_LARGEFILE) = 28
fstat64(28, {st_mode=S_IFREG|0644, st_size=41, ...}) = 0
read(28, "dev:0VyJE\nmax:.kBjr"..., 4096) = 41
close(28)                               = 0
time(NULL)                              = 1253456170
stat64("/home/www/sandbox/config/environment.rb", 0xbfa944fc) = -1 ENOENT (No such file or directory)
time(NULL)                              = 1253456170
stat64("/home/www/sandbox/config.ru", 0xbfa944fc) = -1 ENOENT (No such file or directory)
time(NULL)                              = 1253456170
stat64("/home/www/sandbox/passenger_wsgi.py", 0xbfa944fc) = -1 ENOENT (No such file or directory)
setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={60, 0}}, NULL) = 0
rt_sigaction(SIGPROF, {0x6aac340, [PROF], SA_RESTART}, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [PROF], NULL, 8) = 0
gettimeofday({1253456170, 343908}, NULL) = 0
getcwd("/", 4095)                       = 2
chdir("/home/www/sandbox/htdocs")       = 0
setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={30, 0}}, NULL) = 0
rt_sigaction(SIGPROF, {0x6aac340, [PROF], SA_RESTART}, {0x6aac340, [PROF], SA_RESTART}, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [PROF], NULL, 8) = 0
time(NULL)                              = 1253456170
lstat64("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/home/www", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
lstat64("/home/www/sandbox", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
lstat64("/home/www/sandbox/htdocs", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
lstat64("/home/www/sandbox/htdocs/test2.php", {st_mode=S_IFREG|0644, st_size=251, ...}) = 0
open("/home/www/sandbox/htdocs/test2.php", O_RDONLY) = 28
fstat64(28, {st_mode=S_IFREG|0644, st_size=251, ...}) = 0
lseek(28, 0, SEEK_CUR)                  = 0
brk(0x8d64000)                          = 0x8d64000
read(28, "<?php\n\n$connect = mysql_connect("..., 8192) = 251
read(28, "", 8192)                      = 0
read(28, "", 8192)                      = 0
close(28)                               = 0
open("/etc/services", O_RDONLY)         = 28
fcntl64(28, F_GETFD)                    = 0
fcntl64(28, F_SETFD, FD_CLOEXEC)        = 0
fstat64(28, {st_mode=S_IFREG|0644, st_size=362031, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fcf000
read(28, "# /etc/services:\n# $Id: services"..., 4096) = 4096
read(28, "rotocol\nntp\t\t123/tcp\nntp\t\t123/ud"..., 4096) = 4096
read(28, "767/udp\nrsync\t\t873/tcp\t\t\t\t# rsyn"..., 4096) = 4096
read(28, "stmanager\ncvspserver\t2401/tcp\t\t\t"..., 4096) = 4096
close(28)                               = 0
munmap(0xb7fcf000, 4096)                = 0
rt_sigaction(SIGPIPE, {SIG_IGN, [PIPE], SA_RESTART}, {SIG_IGN, [], 0}, 8) = 0
socket(PF_FILE, SOCK_STREAM, 0)         = 28
fcntl64(28, F_SETFL, O_RDONLY)          = 0
fcntl64(28, F_GETFL)                    = 0x2 (flags O_RDWR)
fcntl64(28, F_GETFL)                    = 0x2 (flags O_RDWR)
fcntl64(28, F_SETFL, O_RDWR|O_NONBLOCK) = 0
connect(28, {sa_family=AF_FILE, path="/var/lib/mysql/mysql.sock"}, 110) = 0
fcntl64(28, F_SETFL, O_RDWR)            = 0
setsockopt(28, SOL_SOCKET, SO_RCVTIMEO, "\2003\341\1\0\0\0\0", 8) = 0
setsockopt(28, SOL_SOCKET, SO_SNDTIMEO, "\2003\341\1\0\0\0\0", 8) = 0
setsockopt(28, SOL_IP, IP_TOS, [8], 4)  = -1 EOPNOTSUPP (Operation not supported)
setsockopt(28, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
poll([{fd=28, events=POLLIN}], 1, 60000) = 1 ([{fd=28, revents=POLLIN}])
read(28, "4\0\0\0\n5.0.45\0\226\t\0\0|k%r1<yl\0,\242!\2\0\0\0"..., 16384) = 56
stat64("/usr/share/mysql/charsets/Index.xml", {st_mode=S_IFREG|0644, st_size=18173, ...}) = 0
open("/usr/share/mysql/charsets/Index.xml", O_RDONLY|O_LARGEFILE) = 29
read(29, "<?xml version='1.0' encoding=\"ut"..., 18173) = 18173
close(29)                               = 0
write(28, "<\0\0\1\205\242\0\0\0\0\0@\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 64) = 64
read(28, "\1\0\0\2\376", 16384)         = 5
write(28, "\t\0\0\3_ZYGFYWS\0", 13)     = 13
read(28, "\7\0\0\4\0\0\0\2\0\0\0", 16384) = 11
poll([{fd=28, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout)
write(28, "\v\0\0\0\2mt_sandbox", 15)   = 15
read(28, "\7\0\0\1\0\0\0\2\0\0\0", 16384) = 11
poll([{fd=28, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout)
write(28, "\26\0\0\0\3SELECT * FROM mt_blog", 26) = 26
read(28, "\1\0\0\1A<\0\0\2\3def\nmt_sandbox\7mt_blog"..., 16384) = 6244
rt_sigaction(SIGPIPE, {SIG_IGN, [PIPE], SA_RESTART}, {SIG_IGN, [PIPE], SA_RESTART}, 8) = 0
poll([{fd=28, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout)
write(28, "\1\0\0\0\1", 5)              = 5
shutdown(28, 2 /* send and receive */)  = 0
close(28)                               = 0
rt_sigaction(SIGPIPE, {SIG_IGN, [PIPE], SA_RESTART}, {SIG_IGN, [PIPE], SA_RESTART}, 8) = 0
chdir("/")                              = 0
setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0
writev(27, [{"HTTP/1.1 200 OK\r\nDate: Sun, 20 S"..., 193}, {"Array\n(\n    [0] => 1\n    [blog_i"..., 3368}], 2) = 3561
write(22, "10.0.1.1 - yoshimax [20/Sep/2009"..., 90) = 90
shutdown(27, 1 /* send */)              = 0
poll([{fd=27, events=POLLIN}], 1, 2000) = 1 ([{fd=27, revents=POLLIN|POLLHUP}])
read(27, "", 512)                       = 0
close(27)                               = 0
read(8, 0xbfa94ad3, 1)                  = -1 EAGAIN (Resource temporarily unavailable)
semop(3866628, 0x4cfdb8, 1)             = 0
epoll_wait(25,