職場でちょっとPHPを動かすのに、PhpStormのビルトインサーバー(Built-in server)が非常に便利だったので、自宅のMacで導入しようとしたらけっこうハマった……。
最終的に、PHPとMySQLを稼働させることはできたものの、WordPressは動かせてない(Windowsでも同様)。どうもちょっとでも重たい処理を入れると502エラーが戻ってくるようだ。何が悪いのかよくわからない。
格闘した履歴をここに残しておく。
目次
- 目次
- 環境
- PHP7.1のCGIがインストールされていない
- PHP CGIが動いていることを確認
- phpinfo() が404 Not Foundだったり、502 Bad Gatewayだったり
- phpinfo()はコケるがechoは動く
- WordPress installation pathの指定
- MySQLを整備する
- PhpStorm のデータベースを設定する
- BAD ROUTE: sqlファイルをインポートする
- BAD ROUTE: PHPとMySQL8の相性
- SQL dialectsの指定
- Deployment に in placeの設定を追加する
- すべきことまとめ
- すべきでないことまとめ
- おまけ
- 参考記事
環境
- MacBook Pro (13-inch, 2018)
- macOS Mojave 10.14.5
- PhpStorm 2019.1.2
プロジェクトのトップディレクトリは、WordPressのインストールディレクトリにしてある。
PHP7.1のCGIがインストールされていない
Preferences > Languages & Frameworks > PHP
で、CLI Interpreterのメニューの右にある「..;」メニューをクリックして「CLI Interpreters」パネルを開く。
PHP Executableで、php実行ファイルの場所を設定したら、その右側に出現する「i」のマークをクリック。phpinfo()
的な情報が表示される。
3行目を見ればわかるとおり、PHP CGIモジュールがないと、ビルトインサーバーは動かないらしい。
そこで、PHP7のCGIモジュールをHomebrewでインストールしたいのだけれど……
Homebrew のfomulaeが変更になっている
どうも2018年の3月に、fomulaeが変更になっているらしい。これまでは
brew install php56 --with-cgi
とかやっていたのが、使えなくなった。
homebrew/phpがdeprecatedになってしまった件 - Qiita 【Homebrew】PHPの設定に注意!〜Homebrew/phpの廃止〜 - Qiita
「新しいformulaeでのCGIモジュールのインストール方法」を説明しているサイトはみつからなかった。とりあえず、PHP7を入れ替えてみる、か……?
brew search php brew update brew upgrade brew install php@7.2
するとエラー。
// (略) Error: The `brew link` step did not complete successfully The formula built, but is not symlinked into /usr/local Could not symlink include/argon2.h /usr/local/include is not writable. //(中略) Warning: The following directories do not exist: /usr/local/include /usr/local/sbin You should create these directories and change their ownership to your account. sudo mkdir -p /usr/local/include /usr/local/sbin sudo chown -R $(whoami) /usr/local/include /usr/local/sbin Warning: You have unlinked kegs in your Cellar. Leaving kegs unlinked can lead to build-trouble and cause brews that depend on those kegs to fail to run properly once built. Run `brew link` on these: libtool jansson //(略)
インストールはされたようだけど、linkに失敗した、ということか。/usr/local/
がwritableではない、と言われている。
brew linkのエラーを解決する
homebrewインストール時にリンクが貼られない問題 - Qiita
brewがlinkでこける - 無気力ITエンジニアの備忘録
Homebrewでインストール時にlinkが出来ないエラー | Simple is Beautiful.
Homebrewインストールのlinkエラーを修正する方法 - 微忘録
この辺りの記事を参考に。
権限の問題らしいので、先ほどの実行結果の中ほどにあるWarningでも指示されている通り、以下を実行すればいいようだ。
sudo mkdir -p /usr/local/include /usr/local/sbin sudo chown -R $(whoami) /usr/local/include /usr/local/sbin
で、この後はどうするんだっけ? 再インストール?
brew install php@7.2
無事にインストール完了。
PHP CGIが動いていることを確認
CLI Interpretersパネルに戻って、左上の+ボタンを押し、PHP7.2を選択。
phpinfo()
が404 Not Foundだったり、502 Bad Gatewayだったり
この時点でビルトインサーバーが動くはずなので、<?php phpinfo();
だけ書いたPHPをディレクトリに置いて、「Open in Brouser」を試みるも、502 Bad Gateway
が表示される。
静的ファイルも404 Not Foundになる。ビルトインサーバーは機能しているようだが、ファイルが見えてない。
プロジェクト名をシンプルにする → 404が解決
PhpStormのプロジェクト名を実際のサイトドメイン、some.server.name.com
のようなドット区切りにしていた。
するとビルトインサーバーのアクセスするURLはこんな感じになる。
localhost:63324/some.server.name.com/directoryname
ふとこれが問題かも、と思いついて、メニューのFile > Rename Project
からプロジェクト名をsome_server_name
にしてみた。
すると静的ファイルは無事表示されるようになった。なんと、プロジェクト名に制限があったとは。
しかしphpinfo()
は表示されないままだ。
phpinfo()
はコケるがecho
は動く
htmlが表示されたので、問題はPHP周りに絞られた。
そういえば、前にPhpStormでphpinfo()
がコケるという記事を見たような……。
ファイルの内容を変更してecho
だけにしてみた。
<?php echo 'the dolphin'; //ちょっとネタが古いか
無事表示された……?
WordPress installation pathの指定
Preferences > Languages & Frameworks > PHP > Frameworks
には、3つのフレームワークがある。
そのうち、WordPressの項目を開いて表示させる。
Enable WordPress Integration
の項目にチェックを入れると、WordPress installation path
を指定するように言われる。wp-admin
やwp-content
があるディレクトリを指定する。
今回の場合、プロジェクトのトップをWordPressのインストールディレクトリに合致させてあるので、プロジェクトトップを指定する。
プロジェクトトップのindex.php
を「Open in Browser」してみると……。
データベースの設定をしていないので、そりゃそうか。しかしここまでくればあと一息、という気がする!(気のせいだった)
MySQLを整備する
WordPressからバックアップしたsqlファイルをダウンロードする
WordPressの本番環境はさくらインターネットのレンタルサーバーにデプロイしているので、その管理画面にアクセス。
WordPressのプラグイン、「BackWPup」を利用しているので、そちらからMySQLのバックアップをとることにする。
もちろん、PhpMyAdminからとる方がいろいろ’完全’とは思うけれど、まあ開発環境用に最低限あればいい。
「BackWPup」をインストール、有効化したら、1クリックバックアップでsqlファイルをダウンロードする。
MySQLをMacにインストール
そういえば、このMacにはまだMySQLをインストールしていなかった。
Mac へ MySQL を Homebrew でインストールする手順 - Qiita
これに従ってインストール。
rootユーザーでmysqlにログインして、WordPressのwp-config.php
の内容に合わせて、データベース、ユーザーを作成しておく。後からPhpStormからデータベースを作ることもできるが、ここでやっておいた方がスムーズなようだ。
ユーザーに権限を追加するのもここでデータベースとひもづけておくと良い。
GRANT ALL ON some_db_name.* TO some_user_name
BAD ROUTE: MySQL8をインストールしてしまった
後述するが、brew install mysql
でインストールされるMySQLは最新版のMySQL8で、デフォルトの認証方式が変更になったため、エラーになる。
正しくは、mysql@5.7
をインストール。
brew search mysql brew install mysql@5.7
という感じで、バージョンを指定するか、8を入れるなら認証方式の変更を行うこと。
PhpStorm のデータベースを設定する
メニューのView > Tool Windows > Database
からデータベースツールウィンドウを開く。
+ボタンから、Data Source > MySQL
を選択。
Data Sources and Driversパネルが開くので、HostやUser、Passwordを入れる。
TestConnectionをして成功するか確認。成功ならOKを押して閉じる。これでPhpStorm上からデータベースの操作ができるようになった。
BAD ROUTE: sqlファイルをインポートする
データベースツールウィンドウに戻ったら、今作成したデータソース(’@localhost’など)の下のSchemas
の下にある、WordPress用のデータベースを右クリック。「Run SQL Script」を選択する。
WordPressからダウンロードしてあるsqlファイルを選択。
本番環境と同じテーブルが作成される。
さて、もう一度、プロジェクトトップのindex.php
を「Open in Browser」してみる。が、「データベース接続確立エラー」のまま。え? まだ何かあったっけ?
BAD ROUTE: PHPとMySQL8の相性
よそからmysqlに接続するPHPスクリプトを借りてきて動かしてみたが、これも500系のエラーになるため、どうもPHP→MySQLが動いていないらしい。
原因がわからない。WordPressの問題というわけでもなさそうだし。
ためしに、手持ちのスクリプトの中からPDOを使ってアクセスするスクリプトを組んでみた。
<?php // $host = 'mysql:host=localhost;dbname=some_db_name;charset=utf8'; $user = 'some_user_name'; $password = 'some_password'; $dbh = ''; $results = []; /* ▼ココカラ sqlアクセス */ try { $dbh = new PDO($host, $user, $password); } catch (PDOException $e) { print('Error:' . $e->getMessage()); die(); } /* ▲ココマデ sqlアクセス */ $sql = "SELECT * FROM `some_db_name.some_table_name`;"; $stmt = $dbh->prepare($sql); $stmt->execute(); while ($result_line = $stmt->fetch(PDO::FETCH_ASSOC)) { $results[] = $result_line; } if (!isset($result_line)) { $result_line[0] = "no data"; } echo (json_encode($results));
これは効き目があった。
Error:SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
なんだこれは?
caching_sha2_password は、 安全なパスワードの暗号化、 キャッシュを用いた認証処理のパフォーマンスの向上等のメリットが多いそうで、 MySQL 8 ではデフォルトで caching_sha2_password が使われるようになっています。
成ル程ね。MySQL8を使うと、デフォルトの設定が安全すぎてエラーになるわけか。調べてみると、たしかにMySQL8になっているらしい。
MySQL8をアンインストールして、MySQL5.7をインストールしなおし。
Remove MySQL completely from Mac OSX · GitHub
SQL dialectsの指定
調べていて気がついたのは、こちらの設定。
Preferences > Languages & Frameworks > SQL dialects
で、Project SQL dialect
の項目を「MySQL」に設定する。
これでMySQLがどうやら動いた!
Deployment
に in place
の設定を追加する
Preferences > Build, Execution, Deployment > Deployment
にあるDeployment
に in place
の設定を追加する
ビルトインサーバーの場合は、「In place 」の設定を使う。これはつまり、サーバー上の実行ファイルをそのまま直接いじる、という設定だ。
localhost - how to setup built-in webserver in PhpStorm - Stack Overflow
Web Server URLを「http://localhost:63342/some_project_name/
」とかにすると「ブラウザで表示」した時にスムーズに表示できる。
すべきことまとめ
Preferences > Languages & Frameworks > PHP
で、CLI Interpreterのメニューの右にある「..;」メニューをクリックして「CLI Interpreters」パネルを開き、PHP Executableを設定する。PHP CGIが機能していることを確認するPreferences > Languages & Frameworks > PHP > Frameworks
でWordPressのinstallation pathを指定する。View > Tool Windows > Database
のデータベースツールウィンドウから、データソースを追加。Preferences > Languages & Frameworks > SQL dialects
で、Project SQL dialect
の項目を「MySQL」に設定する。Preferences > Build, Execution, Deployment > Deployment
でIn place
の設定を追加する。
こんだけ頑張って調べたけど、動かないなんて……。
すべきでないことまとめ
- プロジェクト名にピリオドを使う
phpinfo()
に固執する。echo
だと動く場合もある。brew install mysql
でMySQL8をインストールする。MySQLはバージョンを指定してbrew install mysql@5.7
でインストールを。
おまけ
ポートナンバーの問題
この人はポートナンバーが問題だったと言っている。MAMPだから私が取り組んでいるBuilt-inLoft Serverとはちょっと違う。
実行ログを表示する方法
Can't connect to MySQL database on server – IDEs Support (IntelliJ Platform) | JetBrains
内容はあまり今回の参考にならなかったが、ログの場所がわかったのは収穫だった。
Help → Show logs in Finder
でログが見られる。
参考記事
- homebrew/phpがdeprecatedになってしまった件 - Qiita
- 【Homebrew】PHPの設定に注意!〜Homebrew/phpの廃止〜 - Qiita
- homebrewインストール時にリンクが貼られない問題 - Qiita
- brewがlinkでこける - 無気力ITエンジニアの備忘録
- Homebrewでインストール時にlinkが出来ないエラー | Simple is Beautiful.
- Homebrewインストールのlinkエラーを修正する方法 - 微忘録
- phpstorm - 502 Bad Gateway PHP Storm but Interpreter and executable are set - Stack Overflow
- Mac へ MySQL を Homebrew でインストールする手順 - Qiita
- SQL files - Help | PhpStorm