2018/01/30(火)ゼロから始めるPHP…… (その0) php実行環境構築

はてブ数 2018/01/30 04:31 Web開発::PHP計算機な日記::未分類つーさ
自分用メモ

PHPでWEBアプリケーションを作りたい。
PHPを選んだ理由は簡単そうだしどこでも動きそうだから。

知らなかったけれど、調べてみると、WAMP というものもあるらしい。
LAMPのWindows版でWAMPだろうか。
個人的には、MySQLよりPostgreSQLのが慣れていたり。

今日は、WAMPではなく、Cygwin の上に Apache と php を準備してみます。


ローカルに開発環境を作る

開発環境の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 down
http://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       4
pid = 4 は System ...?

ググってみて雰囲気が一番近そうなのは Branch cache に関するものかなと思ったけど、
サービス一覧を見てもそんなサービスはいない。

うーん、とりあえず再起動、と思ってWindowsごと再起動したら解放された。わからん。
Windows Update したてだったのが、いけなかったのかもしれない。

あらためて、
/usr/sbin/apachectl start
http://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.php
http://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]:80
IPv6 アドレスは [] で囲めばいいらしい。
$ /usr/sbin/apachectl restart

確認

$ netstat -an | grep LISTENING | grep :80
IPv4 であれば 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 start
http://localhost/ に繋がるのを確認する。

.htaccess に かなり乱暴なルールを書いて、動作確認する。
RewriteEngine on
RewriteRule ^ index.php [L]
http://localhost/hogefugapiyo とか存在しないパスにアクセスして index.php の中身が出ればOK、rewriteできてる。
404 Not Found になるようだったら、何かがおかしいので見直す。

長くなったので今日はここまで。

次回は hello world まで。
ぽすぐれ手つかずですね

続き → ゼロから始めるPHP…… (その1) Hello world