PHPコマンドの廃止予定と4DビルトインのPHPインタプリタの削除

PHPは、Web開発において重要な役割を果たし、またzip、ハッシュ、LDAP機能など、ネイティブ言語ではまだ利用できない機能を提供するために4D v12で導入されました。4Dは、これらのPHP機能の多くをコア機能に取り込んできました。その結果、4D v20 R3ではビルトインのPHPインタプリタを削除し、v21ではPHPコマンドの廃止予定プロセスを開始することにしました。

4DからPHPコマンドを完全に削除するわけではありませんが、今後はPHPコードを実行するためにはシステムワーカーを使って実行することが強く推奨されます。

このブログでは、この移行プロセスについて説明しながら、PHP Execute コマンドを通して外部インタープリタを使用する方法や、システムワーカーでPHP コードを効率的に実行する方法を説明します。

最初のステップ: 4DビルトインのPHPインタプリタの削除

最初の変更は、4D v20 R3 で4DビルトインのPHP インタプリタが削除されることです。PHP Execute は引き続き動作しますが、外部のPHP インタプリタを使用する必要があります。外部PHP インタプリタの使い方に慣れていない場合は、このチュートリアルを参照してください。

PHP Executeを外部PHPインタプリタで使用する

外部PHP インタプリタを使用すると、いつでも新しいバージョンの PHP にアップデートしたり、セキュリティパッチがリリースされたらすぐにインストールしたりすることができます。また、より多くのPHP モジュールを使用できるようになります。

カスタムphp.iniファイルの作成

php.iniファイルは、PHPインタプリタを初期化するために使用されます。このファイルは自動的に作成され、内部インタープリタで PHP Execute を呼び出す際に使用されます。外部インタープリタを使用する場合、このファイルを手動で作成して渡す必要があります。PHP Execute を一度呼び出すと、このファイルがプロジェクトの resources フォルダに作成されます。このファイルを使用して外部PHP インタープリタを初期化し、また必要に応じてファイルを変更することが強く推奨されます。

CGI版PHPの実行

PHPを実行するには2つの方法があります:コマンドラインインターフェイス(CLI)を使用する方法と、 コモンゲートウェイインターフェイス(CGI)を使用する方法です。PHP Execute はコモンゲートウェイインターフェースを使用するので、CGI 版のPHP を実行する必要があります。
Windowsでは、PHPの公式サイトからPHPをダウンロードすることができます。このバージョンには、CLI版とCGI版の両方のPHPが含まれています。
現在のところ、公式サイトのバージョンはデフォルトでは mbstring パッケージを読み込みません。これを行うためには、php.iniファイルに以下の行を追加する必要があります:

extension_dir = "./ext/"
extension=mbstring

Mac の場合は、もう少し複雑です。Appleは、macOS にPHPをプリインストールするのを停止しました(同様の理由で、4DもPHPをプリインストールしていません)。PHP の公式サイトでは、Mac 用のビルド済みバージョンを提供していません。いくつかのサイトでビルド済みバージョンを見つけることができるかもしれませんが、 一般的にこういったものはメンテナンスがされていませんし、それを使用することも推奨されていません。この移行を支援するために、4Dではプロダクトダウンロードページにおいて、4D v20ビルトインPHPを別個のバイナリとして提供しています。このバイナリは4Dによってメンテナンスされないことに注意してください。そのため、将来MacにおいてPHPをアップグレードする必要がある場合は、自分でビルドする必要があります。ビルドの方法については、このブログ記事の後半で詳しく説明します。

その後、ターミナルにおいてPHPディレクトリ内から以下のコマンドを呼び出すことで、PHP を起動する必要があります:

php-cgi -b <address:port> -c <path_to_php.ini_file_inside_the_project_resources_folder>

または、4Dv20のビルトインPHPを使用する場合、コマンドは以下のようになります:

php-fcgi-4d -b <address:port> -c <path_to_php.ini_file_inside_the_project_resources_folder>
パスを入力するときは、特殊文字( \ や ” など)の直前に \をつけてそれらをエスケープする(\\ や \” にする)ことを忘れないでください。

PHP は4D と同じマシン上で実行される必要があるため、アドレスは 127.0.0.1 である必要があります。PHPのデフォルトポートは8002で、これは4Dが使用するデフォルトポートでもあります。 PHPを手動で実行する必要がないように、システムワーカーを使用して PHPを起動・停止することが推奨されます。

例えば、システムワーカーを使ってPHPを実行するには、以下ようなコードを使います:

var worker : 4D.SystemWorker
worker:=4D.SystemWorker.new("<path_to_php_cgi_executable> -b <address:port> -c <path_to_php.ini_file_inside_the_project_resources_folder>")

そしてPHPを終了するには、以下のようなコードを使います:

worker.terminate()

外部PHPに接続するために4Dの設定を行う

ストラクチャー設定のPHPタブを開き、PHPサーバーのIPアドレスとポートを入力します。その後、プロジェクトを再度開いてください。

ストラクチャー設定のPHPタブのデフォルトオプション。
8002はデフォルトのPHPポートで、PHPサーバーは4Dと同じマシン上で動作する必要があるため、127.0.0.1のアドレスを使用する必要があります。

PHP Execute を呼び出す

PHPサーバーは起動し、4Dも適切に設定されたので、PHP Executeをこれまでと同じシンタックスで使用することができます。 4D v20 R3 以降を使用している限り、使っていたPHPコードを変更する必要はありません。 古いバージョンで上記の方法を使用するには、 SET DATABASE PARAMETER(PHP use an external interpreter;1) を使用してください。これは現在の4D のデフォルトの設定となっています。上で説明されているインターフェースを使用したくないような場合には、同じコマンドで、PHPのIPやポートをコードで設定することもできます。


第二段階:PHP Executeの廃止予定

2つめの変更点は、4D v21においてPHP Executeが廃止予定となることです。このコマンドは機能し続けますし、4Dから削除するつもりもありません。今後アプリケーションで PHP を使用する場合は、システムワーカーを使用して PHP コードを実行することを強く推奨されます。

PHP コードの実行にシステムワーカーを使う

PHP のインストールまたはビルド

Windows では、PHP の公式ウェブサイトからPHP をダウンロードできます。
Mac では、PHP をビルドする必要があります。なぜならCLI 版の PHP が必要になる一方、4DビルトインのPHP インタプリタには高速なCGI 版しか付属していないからです。このブログ記事の後半で、その方法を詳しく説明します。

システムワーカーを使ってPHPを呼び出す

システムワーカーを使って PHP コードを実行する例を 2 つ挙げてみましょう。

最初の例では、PHP ファイルを解釈し、$result 変数に出力を取り出します。

var $worker : 4D.SystemWorker
var $result : Text

$worker:=4D.SystemWorker.new("<path_to_php_executable> -f <path_to_php_file> -c <path_to_php.ini_file_inside_the_project_resources_folder>")
$result:=$worker.wait().response

2つ目の例では、PHPを対話型シェルとして実行し、PHPコードを直接解釈するようにすることができます。PHPコードを都度実行するこの方法は、PHP を一度しか起動しないので、PHP を何度もコールする必要がある場合に最適です。

var $worker : 4D.SystemWorker
var data : Text

//onData コールバックは実行の結果をdata変数に追加します
var $options : Object
var $onData : 4D.Function
$onData:=Formula(data+=$2.data)
$options:=New object("onData"; $onData)

$worker:=4D.SystemWorker.new("<path_to_php_executable> -a -c <path_to_php.ini_file_inside_the_project_resources_folder>"; $options)
$worker.wait(1)
data:=""
$worker.postMessage("echo \"Hello World!\";\r\n")
$worker.wait(1)
$worker.terminate()

実行結果はdata変数に受け取られます。この場合、中身の結果はHello World!になります。


MacにPHPを取り込む

MacでPHPを取得する最も簡単な方法は、Homebrew を使うことです。残念ながら、Homebrew はあなたのマシン上にPHPを取り込むだけで、 PHPを配布することはできません。PHPをアプリケーションと一緒に配布したい場合には、コンパイルする必要があります。

Homebrewを使用してPHPをビルドする

Homebrewをインストールする

Homebrew をインストールするためのパッケージは GitHub にあります。

そうでなければ、ターミナルからインストールすることもできます。これには、Xcodeツールが必要です。以下のコマンドを実行することでインストールができます:

xcode-select --install

それを実行後、以下のコマンドでHomebrewをインストールすることができます:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

PHPをインストールする

それが完了したら、次のコマンドでPHPをインストールできます:

brew install php

Mac でのPHP のコンパイル

Mac で4D アプリケーションを配布する必要がある場合、埋め込みバージョンのPHPが必要になります。そのためには、PHP をコンパイルする必要があります。以下にそのための手順を記します:

Homebrewをインストールする

Homebrewをインストールするには、Xcodeツールが必要です。以下のコマンドでインストールします:

xcode-select --install

それを実行後、以下のコマンドでHomebrewをインストールすることができます:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

ユーティリティプログラムのインストール

PHP をコンパイルするには、groff と pkg-config の両方が必要です。以下のコマンドでインストールできます:

brew install groff
brew install pkg-config

OpenLDAP ライブラリのコンパイル

OpenLDAP ライブラリをダウンロードします。
圧縮ファイルの中身を展開します:

tar -zxf <name_of_the_archive>

OpenLDAPフォルダに移動し、インストールのための設定を行います:

./configure --prefix="<path_of_the_destination_folder>" --disable-backends --enable-ldap --without-fetch --without-cyrus-sasl --enable-shared=no --enable-static=yes

依存関係をコンパイルする:

make depend

ライブラリをコンパイルする:

make

インストール先フォルダにインストールする:

make install

OpenSSLライブラリをコンパイルする

OpenSSLライブラリをダウンロードします。
圧縮ファイルの中身を展開します:

tar -zxf <name_of_the_archive>

OpenSSLフォルダへと移動し、インストールのための設定を行います:

./config --prefix="<path_of_the_destination_folder>"

ライブラリをコンパイルします:

make

インストール先フォルダにインストールする:

make install

PHPをコンパイルする

PHPをダウンロードします。
圧縮ファイルの中身を取り出します:

tar -zxf <name_of_the_archive>

PHPフォルダに移動し、インストールのための設定を行います:

./configure --prefix="<path_of_the_destination_folder>" --disable-all --enable-cgi --enable-shared=no --enable-static=yes --with-openssl="<path_of_the_OpenSSL_destination_folder>" --with-ldap="<path_of_the_OpenLDAP_destination_folder>" --enable-bcmath --enable-calendar --enable-exif --enable-ftp --enable-mbstring ---disable-mbregex --enable-sockets --with-sqlite3 ---disable-posix --enable-ctype --enable-fileinfo --enable-filter --enable-pdo --with-pdo-sqlite --enable-phar --enable-session --enable-tokenizer ---disable-opcache

ライブラリをコンパイルする:

make

インストール先のフォルダにインストールする:

make install

PHP のインストール先フォルダの中には、高速なCGI 版PHP とCLI 版PHP の両方があります。高速なCGIバージョンは、PHP Execute を使用して外部PHPサーバーとして使用することができます。CLIバージョンは、システムワーカーで使用することができます。

質問があればフォーラムにお寄せ下さい

4Dでは、このPHPの移行をできるだけスムーズにしたいと考えています。私たちは、この移行にある程度の労力が必要であることを理解しており、全てのステップをアシストする用意があります。ご質問やご意見がございましたら、遠慮なくフォーラムにお寄せください。

フォーラムでPHPに関する新しいディスカッションを始める場合には、“PHP “タグを忘れないでください。そうすることで、誰もがあなたのトピックを見つけやすくなり、参加しやすくなります。

Nicolas Brachfogel
- プロダクトオーナー & シニアデベロッパー - Nicolas Brachfogelは、2017年にシニアデベロッパーとして4Dに入社しました(4D Serverとネットワークを担当)。Apple Siliconのリリースを管理するプロダクトオーナーとして、ユーザーストーリーを書いて機能仕様に落とし込み、機能実装が顧客のニーズを満たしているかを確認する役割を担っています。Institut Supérieur d'Informatique Appliquée (INSIA) を卒業した Nicolas は、2001年にソフトウェア開発者としてのキャリアをスタートさせました。JavaとC++で数年間コーディングした後、ゲーム会社のクライアント・サーバー開発を専門に担当。サーバー開発者/アーキテクトとして、多くのゲーム(Dofus Arena、Drakerz、Trivial Pursuit Go!)のサーバーアーキテクチャに携わり、成功を収めてきました。