Mac:CatalinaでPHPを動かす設定まとめ

MacのCatalinaをクリーンインストールしました。
前の環境に戻すためPHPとphpMyAdminを入れるための設定をまとめておきます。

PHPはCatalinaに元々入っている7.3.9を使います。

ちなみにですが、MacはCatalinaからbashではなくてzshに変わっているので要注意です。
.bash_profileもまんま.zshrcに変わっています。

■Apacheを起動
後々いろいろ面倒なので先にApacheの起動確認をしておく。

/private/etc/apache2/httpd.conf

ファイルをコピーして一応オリジナルを保管。
httpd.confの186行目辺りの

#LoadModule php7_module libexec/apache2/libphp7.so

コメントアウトを外す。
254行目、255行目辺りの2行にrootディレクトリを設定する場所があるので、

DocumentRoot "/Users/ユーザー名/Sites"
<Directory "/Users/ユーザー名/Sites">

などに変更し、rootにSitesディレクトリを作成、仮のindex.htmlファイルを作っておく。

Sitesフォルダを自動的に「サイト」に変更したい場合はSitesディレクトリに以下の非表示ファイルを作ればおk。

touch ~/Sites/.localized

拡張子phpのファイルをindexにしたい場合は、289行目辺りにindex.phpを追加。

DirectoryIndex index.html index.php

ターミナルで、

sudo apachectl start

すればApache起動。
再起動ならstartをrestart。

http://localhost/にアクセスすると先程のindex.htmlが表示されるはず。

 
■php.iniを設定

/private/etc

にphp.ini.defaultがあるのでコピーしてオリジナルは残しておく。
名前をphp.iniに変更。

1,055行目と1,195行目辺りをそれぞれ以下のように修正。

pdo_mysql.default_socket= "/tmp/mysql.sock"
mysqli.default_socket = "/tmp/mysql.sock"

ここはMacオリジナル設定かと。

 
■phpMyAdminインストール
https://www.phpmyadmin.net/
からダウンロードしてまんまSitesディレクトリに移動。
名前を「phpMyAdmin」にでも変更しておく。

/phpMyAdmin/config.sample.inc.php

をコピーしてオリジナルは残す。
ファイル名をconfig.inc.phpに修正し、18行目辺り、

/* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

とあるところにハッシュ代わりにテキトーな文字列を入れておく。
こんな↓感じ

ww6jghiuaweyrw8743h7nkjt9aieryuqwb563y9wruafiy

34行目辺りのfalseをtrueに変更してパスワードなしでログインできるようにしておく。

$cfg['Servers'][$i]['AllowNoPassword'] = true;

http://localhost/phpmyadmin/
にアクセス。
で、いつものように以下のエラー。

$cfg[‘TempDir’] (/Users/hoge/Sites/phpmyadmin/tmp/) にアクセスできません。phpMyAdmin はテンプレートをキャッシュすることができないため、低速になります。

phpMyAdminにtmpフォルダがないため新規作成。
tmpフォルダをコマンド+iで「共有とアクセス権」everyoneに読み/書きOKにする。

 
以上、これが最短距離かと思われます。

PHP: バージョン7でのMySQL接続の雛形

数年ぶりにPHPをいじりました。

あっという間にバージョンが7まで飛んでいまして、やはりまだ5.4くらいで止まっています。

Node.jsに浮気してずいぶんと書き方が変わってしまったので、自分のためにMySQL接続のための雛形です。

一時期PDOが流行りましたけど、結局仕事でもほぼほぼその恩恵に与ることはなく、PHPらしく手続き型です。

PDOはよっぽど設計が悪くない限り必要ないでしょう。

<?php
$id = 1;
$name = '聖徳太子';

$link = mysqli_connect('localhost', 'root', '', 'hoge');
if($link){
  $sql = 'SELECT * FROM foo WHERE id = %d AND name = "%s"';
  $results = mysqli_query($link, sprintf($sql, $id, $name));
  $row = mysqli_fetch_assoc($results);
  var_dump($row);
} else {
  die('ERROR: '.mysqli_connect_error());
}
mysqli_close($link);
?>

以前はsprintf()を使わなかったのですが、こっちのほうがコードがスッキリしますね。

別のコードですが、まったく同じコードをnode.jsでも書いていたのですが、やはりPHPのほうが短くて済みます。。。

Mac SierraのPHPを5から7にバージョンアップする際に気をつけること

MacOS Sierra 10.12.6
PHP 7.1.12
Apache/2.4.29

先日、もう一回最初からMacをサーバーにして遊ぼうと思い、MacBook Proをクリーンインストールしまして、元々入っているPHPを5から7にバージョンアップしました。

まずhomebrewというインストーラを入れてから行う人が多いと思うのですが、普通にbrew install php71でやるとインストールの最後にExtensionsという注意書きが出ました。

With the release of macOS Sierra the Apache module is now not built by default. If you want to build it on your system you have to install php with the --with-httpd option. See brew options php71 for more details.

Google先生に翻訳させると、

macOS Sierraのリリースで、Apacheモジュールはデフォルトではビルドされていません。 あなたのシステムでそれを構築したい場合は、--with-httpdオプションを付けてphpをインストールする必要があります。 詳細については、brew options php71を参照してください。

というわけで、brewでインスコするときに

$ brew install php71 --with-httpd

としなさいね、と言われるのでそうします。
先に言ってくれ。

こちら、その後PHP7.1.17を再インスコした時には出なかったので、うちの環境だけ?みたいでした。

もう一つおまけで、ポート問題。

以前同じようにインスコしたときはデフォルトで80ポートを使っていたので、普通にhttp://localhostで見られたのですが、今回は次のような注意書きが出てました。

The default ports have been set in /usr/local/etc/httpd/httpd.conf to 8080 and in
/usr/local/etc/httpd/extra/httpd-ssl.conf to 8443 so that httpd can run without sudo.

Google先生に翻訳させると、

デフォルトポートは/usr/local/etc/httpd/httpd.confに8080に設定されています。
/usr/local/etc/httpd/extra/httpd-ssl.confを8443に設定して、httpdをsudoなしで実行できるようにします。

デフォルトが8080なので、http://localhost:8080にしないと見られないのです。
どこかで80使われちゃってるみたいですね。

んー、今年のお正月はこれだけで終わってしまった。。。

これも7.1.17では出なかったのでうちの環境だけ?かなと。
 

.htaccessが効かなくて超絶ハマった件

MacBook Proをいじり過ぎたのでいったんクリーンインストールをしまして、バックアップしておいたPHPファイル達を元に戻したら、PHPファイルが一斉に動かなくなりました。

厳密に言うと拡張子をHTMLにしていたPHPファイルが動かないようでした。

まずバックアップファイルのパーミッションが全部777になっていたので755に修正しまして、.htaccessは604に修正しました。

$ chmod 604 .htaccess

それでも.htaccessが動いている感じがせず、google先生に聞くとhttpd.confファイルのAllowOverrideの設定を修正する必要があるとのことでした。

DocumentRootの中にあるAllowOverride NoneをAllに変更します。

#AllowOverride None
AllowOverride All

ところがそれでも動かない! ということでもう少し奥を探すと、同じhttpd.confでmod_rewriteの設定も有効にしないといけないとのことでした。

#LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so
LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so

これにて解決。
 

PHP:Mac + mongoDBインストール

PHPでmongoDBを使うにはmongo本体だけではなく、ドライバのインストールも必要になります。
状況は刻一刻と変わるようですので、現時点での最新情報となります。

ググって見つかる日本語の情報は古くて使えませんでした。
あまりメジャーではないようなので、ドキュメントは英語で探さないと最新版は見つからないと思います。

最初XAMPPに入れようとしたのですが、XAMPP側にバグがまだ残っているようで入りませんでした。
インストールはできますが、Apacheが起動しなくなります。
https://github.com/mongodb/mongo-php-driver/issues/247

ですので元々入っているPHPを5.6から7.1にバージョンアップしました。

【今回インストールした環境】
MacOS Sierra 10.12.6
PHP Version 7.1.11
MongoDB 3.4.10

PHP5時代の古い情報に気をつけてください。
古いドライバを入れても動作しません。

mongoDBを先にインストールするのではなくて、PHPを7にまずはバージョンアップしてください。
PHPのインストールはこちらが詳しいです。
「osxにphp7.1をインストール」
http://yugoyamamoto.hateblo.jp/entry/2017/02/17/115532

httpd.confに下記設定が入っていなければ一番下にでも追記するのを忘れずに。

LoadModule php7_module /usr/local/opt/php71/libexec/apache2/libphp7.so

<FilesMatch .php$>
  SetHandler application/x-httpd-php
</FilesMatch>

httpd.confの場所は、

/etc/apache2/httpd.conf

次にmongoDB本体を入れます。
「HomebrewでMacにMongoDBをインストールした時のメモ」
https://qiita.com/Frog_woman/items/f8a70286c7f1c4d5fc02

で、ここからがこの記事のメインです。
PHPでmongoDBを扱うにはドライバが必要になります。
PHPオフィシャルサイトに載っている情報が古くて、自分はここで2日間くらい潰しました。

日本語のドキュメントはもうダメダメなので英語で探したところ、「オフィシャルに載っている入れ方はもう古いのでhomebrewで入れるように」との記事を見つけました。

先に言ってくれよぉぉぉっ!!!

というわけでPECLでインストールしてはダメです。
homebrewでインストールします。

まだ日本語化されていないPHPオフィシャル
http://php.net/manual/ja/mongodb.installation.homebrew.php

$ brew install php71-mongodb

http://localhostを叩くと「It works!」という文字が現れると思うのですが、このファイルの置き場所はここ。

/Library/WebServer/Documents/

ただここをrootにしてしまうと、フォルダやファイルを作ったり削除するたびにパスワードを聞かれ非常にウザいです。
そこでrootを、

/Users/ユーザー名/Sites

に変更します。
ディレクトリ「Sites」は作っておいてください。

CotEditorが使えないのでviを使います。

/private/etc/apache2/users/httpd.conf

変更前:

DocumentRoot "/Library/WebServer/Documents"
<Directory "/Library/WebServer/Documents">

変更後:

DocumentRoot "/Users/ユーザー名/Sites"
<Directory "/Users/ユーザー名/Sites">

 
/private/etc/apache2/users/ユーザー名.conf
※usersディレクトリがない場合は新たに作る。

<Directory "/Users/ユーザー名/Sites">
  AllowOverride All
  Options Indexes FollowSymLinks Multiviews
  Require all granted
</Directory>

上記をマルっとコピーして使って大丈夫です。
その後ターミナルでApacheを再起動します。

$ sudo apachectl restart

phpinfoでmongoDBがあれば成功です。

<?
phpinfo();
?>

 

mongoDBの動作テストもしちゃいましょう。
PHPファイルに下をコピペして、

<?php
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
var_dump($manager);
?>

ブラウザで見ます。
下はソースですが、

object(MongoDB\Driver\Manager)#1 (2) {
  ["uri"]=>
  string(25) "mongodb://localhost:27017"
  ["cluster"]=>
  array(0) {
  }
}

こんな感じでobjectが落ちてくればPHPでmongoが動作しています。