Xdebug動かね。だから、ポートつかってるプログラムを特定したい。

僕は、二時間ちかくはまりました。

しこたま生産性に欠けたなと反省しつつも、今回の時間を無駄にしないよに反省も込めてまとめます。

ハマった点。
Cakephp + Xdebug on eclipseでデバックボタン(eclipseの虫の奴)押しても反応しない!!
エラーもなにも表示されない。ブラウザすら起動されない。とにかく何もでてない。
普通にブラウザから起動すればちゃんとアプリは起動、動作する。


昨日はちゃんと動いていた。


とりあえずやったこと、
eclipse --clean
breakpoints 全クリア
lampp,browser,PC再起動

次にやったこと、
eclipseのproblemsタブをみるとjavascript系のエラーがいっぱい
でてるなー、これをProperties->Javascript->Source tab, Include Pathでexcludeしてエラーをでないように。
Preference->General->Web Browserの設定

Preference->PHP->Debugらへんの設定をなんどもチェック、php.ini, http_conf等々を少し変え実行のtry and errorを繰り返す。

全然ダメ。




解決の兆しが見えてきた瞬間。
ダメ元で、Zend_debuggerをPreference->PHP->Debug指定して実行。
すると、
ブラウザが起動し、なにやらapplicationが立ち上がっている。
よくわかってないが、urlでいろんな引数を指定している。
当然zend_debuggerは設定してないので、breakpointsでは止まらない。

次に、Xdebugに戻して、portを9000から適当にあ9010とかにして虫ボタンを
おすと、
お、
ブラウザが立ち上がった。
当然、Xdebugは9010では立ててないので、breakpointsでは止まらない。

ただ、もうおそらく9000のポート コンフリクトで動かなっかった!?
っていう一つの推測ができた。

悩んでる時に推測が出てくるときは、良いこと。推測をすべて試して、だめで新しい推測が生まれるまでの時間が大変なんだよね。

て、php.iniにもどって9010にしたら、

タラーーン

デバッグ機能 再開!!



んで、誰がポート9000使っているのか、調べたくなった。
ポートからプログラムを見るには、netstatが使える。
出力結果は一部割愛してるが、下のような結果が出された。
netstatのオプションはmanでも見て欲しいが、こんな感じ

  • n 数字でIP見せてね
  • l はlistenしてるポートだけよ
  • a はlistenもnon-listenも見せてね。
  • p プログラムも見せてね

最後に-pで一番右側に ポート番号/名前(e.g. 1980/java) みたいな感じで出力される

 netstat -nap | grep 90
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      -               
tcp        0      0 127.0.0.1:37661         127.0.0.1:9010          ESTABLISHED -               
tcp6       0      0 :::9010                 :::*                    LISTEN      1980/java       
tcp6       0      0 127.0.0.1:9010          127.0.0.1:37661         ESTABLISHED 1980/java       
unix  3      [ ]         STREAM     CONNECTED     13366    1790/geoclue-master 
unix  3      [ ]         STREAM     CONNECTED     13362    1790/geoclue-master 
unix  3      [ ]         STREAM     CONNECTED     8690     -      

ここで僕にわかるのは
Xdebugを9010で起動するよにしたからっていう事実から

tcp6       0      0 :::9010                 :::*                    LI

こいつがXdebugでぇ、ただ 1980/javaっていう 荒い情報しかわかんない。
ここで、プロセスからプログラムを特定する方法を調べた。これです。
http://okwave.jp/qa/q7027494.htmlを参考にさせていただきました。
quote "あと、PIDが特定できていると言うことであれば、
cat /proc/プロセス番号/cmdline とか、
ls -l /proc/プロセス番号/fd とか。"

cat /proc/1980/cmdline 

9000を表示している

tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LI

こいつ誰ー!?? プログラムも表示されてないし!!


それについて、検索したら
Weird port 9000 service, how do I find out what it is? で

udo netstat -tlnp って実行してて、この場合、僕の環境でも

sudo netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      1114/php-fpm.conf)

ってでてきて、1114のPIDで php-fpm.confっていうプログラムっていうことが、判明しました。

そのあと、lsof | grep "9000 (LISTEN)"ってやれば、って書いてあるだけど、僕の場合は何も出力されませんでした。


ちなみに、sudoでなくて、上のコマンド叩くと、

netstat -tlnp
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      -               

って出力で、プログラム名が表示されないんです。
これ結構大事で、実行したユーザーで起動されているプログラム名しか表示されないんです。unix系ってことを再認識する挙動ですね。


最後に、
さっき習ったやり方で、プロセスの詳細を見てみる。
といっても、javaとかいう総称ではなくphp^fpmなんちゃらって結構単体レベルの名前なんで、あんまり見なくてもいいですが、

~$cat /proc/1114/cmdline 
php-fpm: master process (/etc/php5/fpm/php-fpm.conf)

~$ ls -l /proc/1114/fd
ls: cannot open directory /proc/1114/fd: Permission denied
makoto@ubuntu:~$ sudo ls -l /proc/1114/fd
total 0
lrwx------ 1 root root 64  5月  4 12:02 0 -> /dev/null
lrwx------ 1 root root 64  5月  4 12:02 1 -> /dev/null
l-wx------ 1 root root 64  5月  4 12:02 2 -> /var/log/php5-fpm.log
l-wx------ 1 root root 64  5月  4 12:02 3 -> /var/log/php5-fpm.log
lrwx------ 1 root root 64  5月  4 12:02 4 -> socket:[10824]
lrwx------ 1 root root 64  5月  4 12:02 5 -> socket:[10825]
lrwx------ 1 root root 64  5月  4 12:02 6 -> socket:[10826]
lrwx------ 1 root root 64  5月  4 12:02 7 -> anon_inode:[eventpoll]

ってな感じで
php-fpm.confというコンフがなにやらポートを使ってリッスンしてるようです。
ちょっと気になったので、
php-fpm.confを調べてみると(http://php-fpm.org/wiki/Configuration_File
http://php.net/manual/ja/install.fpm.configuration.php) 

fpmはFastCGI Process Managerという略で、なにやら
複数プロセスをプールで管理するときに、このポートつかって別々の設定を持たすことが、出来、そのためのポートなのです。

てなことがわかりました。

長いこと時間かけましたが、わからないことがなくなるまで調べると
こんかもんですかね。
以上です。