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

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

新規登録して質問してみよう
ただいま回答率
85.36%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ロギング

コンピュータにおけるロギングとは、コンピュータプログラミングにおける形跡を記憶することをさします。これは、システムのアクティビティの理解や、問題究明のために監査証明を残す目的でおこなわれます。

Q&A

解決済

2回答

8209閲覧

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

tekeThick

総合スコア33

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ロギング

コンピュータにおけるロギングとは、コンピュータプログラミングにおける形跡を記憶することをさします。これは、システムのアクティビティの理解や、問題究明のために監査証明を残す目的でおこなわれます。

0グッド

0クリップ

投稿2016/09/01 03:54

編集2016/09/01 05:16

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2016/09/01 04:00

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

2016/09/01 04:03

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

回答2

0

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

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

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

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

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

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

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

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

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

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

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

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

投稿2016/09/01 04:38

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tekeThick

2016/09/01 05:29

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

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 04:14

編集2016/09/01 04:18
moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tekeThick

2016/09/01 06:55 編集

ご回答ありがとうございます。 数が多いのでphp拡張子でのフィルタに加え、openだけに絞り、得たかった出力を得ることができました。 ただ、ブラウザからアクセスするサーバ1ではうまく出力されましたが、 ブラウザからサーバ1へアクセスし、サーバ1はcurlで、サーバ2にアクセスしjsonを返してもらうのですが、 サーバ1ではきちんとファイルが表示されたのですが、 サーバ2のほうで同じ手順にて  Process ~~ attached と表示された後、サーバ1のページにブラウザでアクセスするも、何も表示されませんでした。 何か他に方法がないか引き続き試して見ます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問