Because We Love Happy Coding

フリーライターからエンジニア × 講師。発信力だけあり余ってる感じ

Mac PhpStormのビルトインサーバーでWordPressを動かしたかったけどできんかった

今日もまたコーディング。だって僕らはHappy Codingが大好きだから。

職場でちょっとPHPを動かすのに、PhpStormのビルトインサーバー(Built-in server)が非常に便利だったので、自宅のMacで導入しようとしたらけっこうハマった……。

最終的に、PHPMySQLを稼働させることはできたものの、WordPressは動かせてない(Windowsでも同様)。どうもちょっとでも重たい処理を入れると502エラーが戻ってくるようだ。何が悪いのかよくわからない。

格闘した履歴をここに残しておく。

目次

環境

プロジェクトのトップディレクトリは、WordPressのインストールディレクトリにしてある。

PHP7.1のCGIがインストールされていない

Preferences > Languages & Frameworks > PHP で、CLI Interpreterのメニューの右にある「..;」メニューをクリックして「CLI Interpreters」パネルを開く。

f:id:mogami74:20190617225238p:plain
CLI InterPretersパネル

PHP Executableで、php実行ファイルの場所を設定したら、その右側に出現する「i」のマークをクリック。phpinfo()的な情報が表示される。

f:id:mogami74:20190617225112p:plain
PHP CGIがNot Installedになっている

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を選択。

f:id:mogami74:20190617225420p:plain
PHP Execiutable 右の青い i をクリック

f:id:mogami74:20190617225515p:plain
PHP CGIが無事認識された

無事にPHP CGIが入った模様。

phpinfo()404 Not Foundだったり、502 Bad Gatewayだったり

この時点でビルトインサーバーが動くはずなので、<?php phpinfo();だけ書いたPHPディレクトリに置いて、「Open in Brouser」を試みるも、502 Bad Gateway が表示される。

f:id:mogami74:20190617225546p:plain
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'; //ちょっとネタが古いか

f:id:mogami74:20190617225655p:plain
echo 'the dolphin' ソースコード

f:id:mogami74:20190617225729p:plain
ビルトインサーバーで表示された

無事表示された……? 

WordPress installation pathの指定

Preferences > Languages & Frameworks > PHP > Frameworksには、3つのフレームワークがある。

そのうち、WordPressの項目を開いて表示させる。

Enable WordPress Integrationの項目にチェックを入れると、WordPress installation pathを指定するように言われる。wp-adminwp-contentがあるディレクトリを指定する。

今回の場合、プロジェクトのトップをWordPressのインストールディレクトリに合致させてあるので、プロジェクトトップを指定する。

プロジェクトトップのindex.phpを「Open in Browser」してみると……。

f:id:mogami74:20190617225814p:plain
データベース接続確立エラー

データベースの設定をしていないので、そりゃそうか。しかしここまでくればあと一息、という気がする!(気のせいだった)

MySQLを整備する

WordPressからバックアップしたsqlファイルをダウンロードする

WordPressの本番環境はさくらインターネットレンタルサーバーにデプロイしているので、その管理画面にアクセス。

WordPressプラグイン、「BackWPup」を利用しているので、そちらからMySQLのバックアップをとることにする。

f:id:mogami74:20190617225843p:plain
BackWPup プラグイン

もちろん、PhpMyAdminからとる方がいろいろ’完全’とは思うけれど、まあ開発環境用に最低限あればいい。

「BackWPup」をインストール、有効化したら、1クリックバックアップでsqlファイルをダウンロードする。

f:id:mogami74:20190617225922p:plain
1クリックバックアップ

MySQLMacにインストール

そういえば、このMacにはまだMySQLをインストールしていなかった。

Mac へ MySQL を Homebrew でインストールする手順 - Qiita

これに従ってインストール。

rootユーザーでmysqlにログインして、WordPresswp-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を入れるなら認証方式の変更を行うこと。

MySQL: PHP から認証できない場合

PhpStorm のデータベースを設定する

メニューのView > Tool Windows > Databaseからデータベースツールウィンドウを開く。

+ボタンから、Data Source > MySQLを選択。

f:id:mogami74:20190617230019p:plain
データソースを選択

Data Sources and Driversパネルが開くので、HostやUser、Passwordを入れる。

TestConnectionをして成功するか確認。成功ならOKを押して閉じる。これでPhpStorm上からデータベースの操作ができるようになった。

BAD ROUTE: sqlファイルをインポートする

SQL files - Help | PhpStorm

データベースツールウィンドウに戻ったら、今作成したデータソース(’@localhost’など)の下のSchemas の下にある、WordPress用のデータベースを右クリック。「Run SQL Script」を選択する。

f:id:mogami74:20190617230123p:plain
Run SQL Scriptを選ぶ

WordPressからダウンロードしてあるsqlファイルを選択。

本番環境と同じテーブルが作成される。

さて、もう一度、プロジェクトトップのindex.phpを「Open in Browser」してみる。が、「データベース接続確立エラー」のまま。え? まだ何かあったっけ?

BAD ROUTE: PHPとMySQL8の相性

よそからmysqlに接続するPHPスクリプトを借りてきて動かしてみたが、これも500系のエラーになるため、どうもPHPMySQLが動いていないらしい。

原因がわからない。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になっているらしい。

f:id:mogami74:20190617230223p:plain
MySQL driverのバージョンが新しい(過ぎる)

MySQL8をアンインストールして、MySQL5.7をインストールしなおし。

Remove MySQL completely from Mac OSX · GitHub

SQL dialectsの指定

調べていて気がついたのは、こちらの設定。

Preferences > Languages & Frameworks > SQL dialectsで、Project SQL dialectの項目を「MySQL」に設定する。

これでMySQLがどうやら動いた!

Deploymentin placeの設定を追加する

Preferences > Build, Execution, Deployment > DeploymentにあるDeploymentin 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 > FrameworksWordPressのinstallation pathを指定する。
  • View > Tool Windows > Databaseのデータベースツールウィンドウから、データソースを追加。
  • Preferences > Languages & Frameworks > SQL dialectsで、Project SQL dialectの項目を「MySQL」に設定する。
  • Preferences > Build, Execution, Deployment > DeploymentIn 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でログが見られる。

参考記事