質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

apacheのプロセスが処理してるPHPのファイル名を一覧したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,091

tekeThick

score 28

新卒で入社し、既存のwebサービスのデバッグ作業をしているのですが、
ブラウザからのリクエストに対してレスポンスに至るまでのファイルが多すぎて、バグがどのファイルなのか追いきれず困っています。

というか、バグがどこか以前に、そもそもどのファイルが処理されているのか全てを把握し切れていません。

そこで、
ブラウザからのリクエストURLはアクセスログで簡単にわかるわけですが、インクルードされたファイルや、使用したクラスのファイルといった処理された全てのファイルが知りたいです。
PHPのプロセスが処理したファイル全てを一覧できるログなどを出力できないのでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2016/09/01 12:59

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • yambejp

    2016/09/01 13:00

    統合環境をご利用でしょうか?

    キャンセル

  • tekeThick

    2016/09/01 13:03

    IDEという意味ではなく、サーバ側の話でしょうか?社内独自のPHPフレームワークでMVCモデルになっています

    キャンセル

回答 2

checkベストアンサー

0

PHPで作成されたWEBアプリはデバッグしにくいですよね。

以下の方法でファイルのトレースを出せます。

・ターミナルを2つ開きます。

 ターミナル1

Apacheの親プロセスを特定する。

$ ps -aef | grep httpd | grep -v grep
apache     379  2876  0 13:06 ?        00:00:00 /usr/sbin/httpd
apache     380  2876  0 13:06 ?        00:00:00 /usr/sbin/httpd
apache     382  2876  0 13:06 ?        00:00:00 /usr/sbin/httpd
apache     384  2876  0 13:06 ?        00:00:00 /usr/sbin/httpd
apache     385  2876  0 13:06 ?        00:00:00 /usr/sbin/httpd
apache     386  2876  0 13:06 ?        00:00:00 /usr/sbin/httpd
apache     387  2876  0 13:06 ?        00:00:00 /usr/sbin/httpd
apache     388  2876  0 13:06 ?        00:00:00 /usr/sbin/httpd
apache     389  2876  0 13:06 ?        00:00:00 /usr/sbin/httpd
apache     390  2876  0 13:06 ?        00:00:00 /usr/sbin/httpd
root      2876     1  0 May19 ?        00:03:52 /usr/sbin/httpd

rootで動いてるのが親プロセスなので、プロセスIDは2876

$ sudo strace -f -p 2876 -e trace=file

 ターミナル2

$ sudo service httpd reload

これを行って、WEBアプリにブラウザからアクセスすると、
ターミナル1のほうに開いたファイルがボロボロトレースされます。

 トレースサンプル

Process 2876 attached
--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=416, si_uid=0} ---
--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=2876, si_uid=0} ---
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=390, si_status=0, si_utime=0, si_stime=0} ---
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=384, si_status=0, si_utime=4, si_stime=1} ---
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=382, si_status=0, si_utime=1, si_stime=1} ---
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=385, si_status=0, si_utime=0, si_stime=0} ---
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=380, si_status=0, si_utime=0, si_stime=1} ---
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=388, si_status=0, si_utime=0, si_stime=0} ---
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=379, si_status=0, si_utime=46, si_stime=8} ---
access("/tmp/httpd_lua_shm.2876", F_OK) = 0
unlink("/tmp/httpd_lua_shm.2876")       = 0
access("/var/run/httpd/authdigest_shm.2876", F_OK) = 0
unlink("/var/run/httpd/authdigest_shm.2876") = 0
open("/etc/httpd/conf/httpd.conf", O_RDONLY|O_CLOEXEC) = 7
stat("/etc/httpd", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
openat(AT_FDCWD, "/etc/httpd/conf.modules.d", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 8
stat("/etc/httpd/conf.modules.d/00-base.conf", {st_mode=S_IFREG|0644, st_size=3282, ...}) = 0
open("/etc/httpd/conf.modules.d/00-base.conf", O_RDONLY|O_CLOEXEC) = 8
open("/etc/httpd/modules/mod_access_compat.so", O_RDONLY|O_CLOEXEC) = 15
open("/etc/httpd/modules/mod_actions.so", O_RDONLY|O_CLOEXEC) = 15
open("/etc/httpd/modules/mod_alias.so", O_RDONLY|O_CLOEXEC) = 15
open("/etc/httpd/modules/mod_allowmethods.so", O_RDONLY|O_CLOEXEC) = 15
open("/etc/httpd/modules/mod_auth_basic.so", O_RDONLY|O_CLOEXEC) = 15
open("/etc/httpd/modules/mod_auth_digest.so", O_RDONLY|O_CLOEXEC) = 15
open("/etc/httpd/modules/mod_authn_anon.so", O_RDONLY|O_CLOEXEC) = 15
open("/etc/httpd/modules/mod_authn_core.so", O_RDONLY|O_CLOEXEC) = 15
open("/etc/httpd/modules/mod_authn_dbd.so", O_RDONLY|O_CLOEXEC) = 15
open("/etc/httpd/modules/mod_authn_dbm.so", O_RDONLY|O_CLOEXEC) = 15
open("/etc/httpd/modules/mod_authn_file.so", O_RDONLY|O_CLOEXEC) = 15
open("/etc/httpd/modules/mod_authn_socache.so", O_RDONLY|O_CLOEXEC) = 15
open("/etc/httpd/modules/mod_authz_core.so", O_RDONLY|O_CLOEXEC) = 15
open("/etc/httpd/modules/mod_authz_dbd.so", O_RDONLY|O_CLOEXEC) = 15
open("/etc/httpd/modules/mod_authz_dbm.so", O_RDONLY|O_CLOEXEC) = 15
open("/etc/httpd/modules/mod_authz_groupfile.so", O_RDONLY|O_CLOEXEC) = 15
open("/etc/httpd/modules/mod_authz_host.so", O_RDONLY|O_CLOEXEC) = 15
open("/etc/httpd/modules/mod_authz_owner.so", O_RDONLY|O_CLOEXEC) = 15
open("/etc/httpd/modules/mod_authz_user.so", O_RDONLY|O_CLOEXEC) = 15
open("/etc/httpd/modules/mod_autoindex.so", O_RDONLY|O_CLOEXEC) = 15
stat("/etc/sysconfig/64bit_strstr_via_64bit_strstr_sse2_unaligned", 0x7ffecbc46a80) = -1 ENOENT (No such file or directory)

PHPファイル(拡張子.php)だけに絞りたいなら楽観的な対応として次のようにしてください。

sudo strace -f -p 2876 -e trace=file 2>&1 | grep \\.php

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/01 15:54 編集

    ご回答ありがとうございます。
    数が多いのでphp拡張子でのフィルタに加え、openだけに絞り、得たかった出力を得ることができました。

    ただ、ブラウザからアクセスするサーバ1ではうまく出力されましたが、
    ブラウザからサーバ1へアクセスし、サーバ1はcurlで、サーバ2にアクセスしjsonを返してもらうのですが、

    サーバ1ではきちんとファイルが表示されたのですが、
    サーバ2のほうで同じ手順にて
     Process ~~ attached
    と表示された後、サーバ1のページにブラウザでアクセスするも、何も表示されませんでした。

    何か他に方法がないか引き続き試して見ます。

    キャンセル

0

PHPに限らず、ロギングの方法は 設計 の問題です。言い換えると、システムの仕様について詳細を知らないと回答が非常に難しいです。

ですから、サンデープログラマーならともかく、仕事として既存システムのデバッグをするのであれば、身近な先輩に尋ねるのが筋ではないでしょうか?

とはいえ、せっかくご質問頂いたので、ヒントをいくらか記載致します。

先ず、そのシステムはPHPを使って フルスクラッチ で作成されたものですか?

もしそうなら、ロギング方法を含めデバッグに役立つ仕組みが作り込まれているはずなので、作者に尋ねる(仕様書を読む)のが早道です。

万一、そうした配慮の欠けた残念なシステムの場合については後ほど。

もし対象のシステムが、例えば CakePHP のようなフレームワークを使用して開発されたものならば、ロギングのような基本的な機能はフレームワーク側で準備していることが多いので、そのマニュアルを良く読んでください。多くの場合、設定を変えるだけで望みの情報をログ出力させることが出来ると思います。
その場合でも、先ずはフレームワークの基本原理をしっかりと理解してください。
ファイルの依存関係はフレームワークの流儀に従っているはずなので、仕組みを理解しているのとそうでないのでは、デバッグの効率が大きく異なってきますので。

最後に、やはりある程度自前でデバッグの為の準備が必要な場合、先ずは以下のようなキーワードでぐぐってみてください。
PHP デバッグ PHP ロギング 
そうすれば、先人たちの知恵が容易かつたくさん得られる事と思います。
その中からご自身で使いやすい方法を組み合わせてみてください。

システムの改善案件(保守性の改善)でない限り、時間を掛けて包括的なロギングの仕組みを作り込む必要はないので、要所要所で必要最小限の情報をロギングするようにすれば良いと思います。

また、View(プレゼンテーション層)のデバッグでは、ソースを追いかける前にブラウザの開発者ツール等を利用し、HTTPレスポンスの内容を精査する事もデバッグに大いに役立ちます。

デバッグは経験の差が大きくモノをいう分野なので、慣れるまでは大変でしょうが、諸先輩のテクニックを盗みつつ気長に頑張ってください。

以上、幾らかでもご参考になれば幸いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/01 14:29

    先輩に聞くのが筋。そのとおりだと思います。
    ご指摘いただきありがとうございます。

    なるほど、システムの作りに左右される部分が大きいんですね。
    基本を押さえる重要さを改めて感じました。
    至らぬ質問にすばやく回答いただきありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る