2018/01/30(火)ゼロから始めるPHP…… (その0) php実行環境構築
PHPでWEBアプリケーションを作りたい。
PHPを選んだ理由は簡単そうだしどこでも動きそうだから。
知らなかったけれど、調べてみると、WAMP というものもあるらしい。
LAMPのWindows版でWAMPだろうか。
個人的には、MySQLよりPostgreSQLのが慣れていたり。
今日は、WAMPではなく、Cygwin の上に Apache と php を準備してみます。
- ローカルに開発環境を作る
- httpサーバを立ててみる。
- PHP動かしてみる。
- Web Server をループバックに限定する。
- mod_rewrite を使えるようにする
- 長くなったので今日はここまで。
ローカルに開発環境を作る
開発環境のPCはWindowsなので、コードエディタは Visual Studio Code を使う。
バージョン管理は適当にgitを使う。
ローカルの実行環境がほしいので、Cygwinで揃えるのが手っ取り早い?
cygwinバンドルのphpは7しか選べない。今時のインフラならphp 7も選べると思うけど、バージョンには気をつける。
- cygwin
- cygrunsrv
- httpd Apache 2.4.29一式
- httpd-mod_php7
- httpd-mod_ssl
- php 7.1.13
- php-ctype
- php-bz2
- php-iconv
- php-json
- php-mbstring
- php-phar
- php-pdo_pgsql
- php-sockets
- php-zlib
- postgresql 9.6.6
- postgresql-client
あとはwgetとかcurlとか基本的なところとか。
とりあえずCygwinのインストーラで一式インストールする。
久しぶりにノートPCのcygwin立ち上げたら gtk とかいろいろ使わなさそうなものまで入ってたのでクリーンインストール。
https://gist.github.com/ttsuki/77f6a5d68664e271a60a8814b9d48270
httpサーバを立ててみる。
cygwin にバンドルされている httpd の関連ファイルは、- httpd.conf は /etc/httpd/conf/httpd.conf
- ログは /var/log/httpd/
- DocumentRoot は /srv/www/htdocs
- apachectl は /usr/sbin/apachectl
- modules は /usr/lib/httpd/modules
とりあえず、サーバを起動してみる。
/usr/sbin/apachectl start
(蛇足) 80番が既に使われていて動かない……
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::fca2:5bd7:3466:9acb. Set the 'ServerName' directive globally to suppress this message (1)Operation not permitted: AH00072: make_sock: could not bind to address [::]:80 (1)Operation not permitted: AH00072: make_sock: could not bind to address 0.0.0.0:80 no listening sockets available, shutting downhttp://localhost/ を開いてみると 404、 httpヘッダ曰く
Server: Microsoft-HTTPAPI/2.0
C:\\WINDOWS\\system32>netstat -aon プロトコル ローカル アドレス 外部アドレス 状態 PID TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4pid = 4 は System ...?
ググってみて雰囲気が一番近そうなのは Branch cache に関するものかなと思ったけど、
サービス一覧を見てもそんなサービスはいない。
うーん、とりあえず再起動、と思ってWindowsごと再起動したら解放された。わからん。
Windows Update したてだったのが、いけなかったのかもしれない。
あらためて、
/usr/sbin/apachectl starthttp://localhost にアクセスして、でかい字で It works ならよし。
PHP動かしてみる。
libphp7.so は httpd-mod_php7 をインストールすると自動的に有効になる。(そんな仕組みが httpd.conf と /etc/httpd/conf.modules.d とに垣間見える
「It works」を見えなくして、代わりに phpinfo する index.php を置く。
mv /srv/www/htdocs/index.html{,.org} echo '<?php phpinfo();' > /srv/www/htdocs/index.phphttp://localhost にアクセスして、 phpinfo が出ればよし。
ソースがそのまま出る場合は、 httpd-mod_php7 の入れ忘れ。(実際入れ忘れてた。
Web Server をループバックに限定する。
上記の方法で立ち上げたWebサーバは、そのマシンにネットワーク的に到達できるマシンすべてに向けて公開される。少なくともLAN内の端末からはアクセスできるだろうし、
インターネットにPPPoEで直繋ぎしているような環境では、インターネットに向けて公開していることになる。
自分のマシンからのアクセスのみ許されるようにするには、
Listen IPアドレスをループバックアドレスにbindするようにしておけばよい。
httpd.conf の Listen ディレクティブを、ポート番号のみの指定から、IPアドレスつきのもにに変更する。
- Listen 80 + Listen 127.0.0.1:80 + Listen [::1]:80IPv6 アドレスは [] で囲めばいいらしい。
$ /usr/sbin/apachectl restart
確認
$ netstat -an | grep LISTENING | grep :80IPv4 であれば 0.0.0.0:80 ではなく 127.0.0.1:80 が、
IPv6 であれば [::]:80 ではなく [::1]:80 が LISTENING になっているはず。
mod_rewrite を使えるようにする
使うつもりなので入れておく。まず .htaccess を使えるようにするために、httpd.conf の AllowOverride を All にしておく。
先の /usr/lib/httpd/modules を覗くと、
mod_rewrite モジュール自体は既に入っているみたいなので、
#LoadModule rewrite_module modules/mod_rewrite.soの行をアンコメントして、apachectl restart してみる。
これでOKか、と思いきや httpd が起動しなくなってしまった。
cat /var/log/httpd/error_log 曰く、
Function not implemented: AH00023: Couldn't create the rewrite-map mutexとか出てる。
ググってみると、
cygwin では、共有メモリとかミューテックスとかセマフォとかは cygserver が提供しているらしい。
今は cygserver が起動していないがために、その辺が使えず、httpd は困ってしまうようだ。
というわけで、cygserverを準備する
config作る。メッセージにもあるが管理者権限が必要なので、管理者権限のついたbashからやる。
Cygwin-Terminal を いわゆる「管理者権限で起動」すればいい。
サービスとして登録されていなくてもいいと思うので、最初の質問は no にしてみる。
ただし、もちろん毎回自分で起動しなきゃいけなくなる。
$ cygserver-config Generating /etc/cygserver.conf file Warning: The following function requires administrator privileges! Do you want to install cygserver as service? (Say "no" if it's already installed as service) (yes/no) no Further configuration options are available by editing the configuration file /etc/cygserver.conf. Please read the inline information in that file carefully. The best option for the start is to just leave it alone. Basic Cygserver configuration finished. Have fun!起動する。
端末は開きっぱなしにしておく必要がある。
コンソールには、初期化時以外メッセージが出なかったので、バックグラウンド実行でよさそう。
$ /usr/sbin/cygserver & cygserver: Initialization complete. Waiting for requests.うーん、普通に、サービスとしてインストールしてもよいかな。
apacheを起動する。
$ /usr/sbin/apachectl starthttp://localhost/ に繋がるのを確認する。
.htaccess に かなり乱暴なルールを書いて、動作確認する。
RewriteEngine on RewriteRule ^ index.php [L]http://localhost/hogefugapiyo とか存在しないパスにアクセスして index.php の中身が出ればOK、rewriteできてる。
404 Not Found になるようだったら、何かがおかしいので見直す。
長くなったので今日はここまで。
次回は hello world まで。ぽすぐれ手つかずですね
続き → ゼロから始めるPHP…… (その1) Hello world