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という略で、なにやら
複数プロセスをプールで管理するときに、このポートつかって別々の設定を持たすことが、出来、そのためのポートなのです。
てなことがわかりました。
長いこと時間かけましたが、わからないことがなくなるまで調べると
こんかもんですかね。
以上です。