PHP Unconference Europe 2015

構築時の問題

本節は、構築時に発生する多くの一般的なエラーを集めたものです。

  1. anonymous Git サービスで最新版の PHP を入手しましたが、 configure スクリプトがありません!
  2. PHPをApacheと組みあわせて動作するようにconfigureを行う際に問題が あります。httpd.hが見付からないといわれますが、 指定した場所にこのファイルはあるのです!
  3. PHPをconfigureしているときに (./configure) 以下のようなエラーに遭遇しました。 checking lex output file root... ./configure: lex: command not found configure: error: cannot find output from lex; giving up
  4. Apacheを起動するときに以下のようなメッセージが出る: fatal: relocation error: file /path/to/libphp4.so: symbol ap_block_alarms: referenced symbol not found
  5. configureを実行した際、GD、gdbmまたは他のパッケージのファイルま たはライブラリを見つけることができないと言われます。
  6. ファイルlanguage-parser.tab.cをコンパイルする際、 'yytname undeclared'というエラーが発生します。
  7. makeを実行する際、実行には成功しているようですがコンパイルする 最終的なアプリケーションをリンクしようとした際に何かファイルが見 つからないというエラーが発生します。
  8. PHP をリンクする際、未定義の参照があるというエラーが複数発生します。
  9. PHPをApache 1.3と組み合わせて構築する手法が分かりません。
  10. インストール手順に完全に基づきUnix上でApacheモジュール版をインス トールしましたが、ブラウザでアクセスするとPHPスクリプトが表示さ れ、ファイルを保存しますかと尋ねられます。
  11. --activate-module=src/modules/php4/libphp4.a と書いてありますが、ファイルがありません。このため、 --activate-module=src/modules/php4/libmodphp4.aに 変更しましたが、やはりだめです。何が起きているのでしょう?
  12. --activate-module=src/modules/php4/libphp4.a を指定し、PHPを静的モジュールとして組み込んでApacheを構築しよう とした際に、システムがANSI対応ではないというエラーを発生します。
  13. --with-apxs を指定して PHP を構築しようとした際、奇妙なエラーメッセージが出力されます。
  14. makeの間、microtimeおよび RUSAGE_関連で多くのエラーを発生します。
  15. MySQLを使用できるようにPHPをコンパイルする際、configureは正常に 実行されるがmakeの最中に以下のようなエラーが出る: ext/mysql/libmysqlclient/my_tempnam.o(.text+0x46): In function my_tempnam': /php4/ext/mysql/libmysqlclient/my_tempnam.c:103: the use of tempnam' is dangerous, better use mkstemp' 何がおかしいのか?
  16. PHPをアップグレードしたいのですが、現在インストールされているPHPを 構築するときに指定した./configureコマンドの オプションはどこで知ることが出来ますか?
  17. GDライブラリをリンクしてPHPを構築すると、コンパイルエラーが発生したり 実行時にセグメンテーション違反になってしまいます。
  18. PHP をコンパイルする際に、よくわからないエラーが発生してハングアップ します。Solaris を使用している場合に起こるようです。
anonymous Git サービスで最新版の PHP を入手しましたが、 configure スクリプトがありません!

configure.inからconfigureスクリプトを生成するためには、GNU autoconfパッケージが必要です。Gitサーバーからソースを入手した後、 最上位のディレクトリで./buildconfを実行して下 さい。(また、configure--enable-maintainer-modeオプションを付けて実 行した場合以外は、configureスクリプトはconfigure.in ファイルが更新された際に自動的に再構築を行いません。このため、 configure.inが 変更された場合には忘れずに手動で再構築を行う必要があります。 再構築の際に行われることの1つは、configureまたは config.statusを 実行した後、Makefileの中の@VARIABLE@のような物を見つけることです。)

PHPをApacheと組みあわせて動作するようにconfigureを行う際に問題が あります。httpd.hが見付からないといわれますが、 指定した場所にこのファイルはあるのです!

configure/setupスクリプトにApacheソースツリーの最上位の場所を指 定する必要があります。これは、--with-apache=/path/to/apache を指定するのであった、--with-apache=/path/to/apache/src ではないということです。

PHPをconfigureしているときに (./configure) 以下のようなエラーに遭遇しました。

checking lex output file root... ./configure: lex: command not found
configure: error: cannot find output from lex; giving up

インストールの説明をよく読み、 PHPのコンパイルにはflexとbisonの両方が必要であることに留意してください。 そーすかあるいはRPMのようなパッケージからbisonとflexを インストールしてください。

Apacheを起動するときに以下のようなメッセージが出る:

fatal: relocation error: file /path/to/libphp4.so:
symbol ap_block_alarms: referenced symbol not found

ApacheのcoreプログラムがsharedなDSOライブラリとして コンパイルされている場合にこのエラーが出ます。 最低でも以下のフラグを使用してApacheを再configureして ください:


--enable-shared=max --enable-rule=SHARED_CORE

詳細はApacheのソースディレクトリのトップレベルにある INSTALLファイル またはApacheの » DSO manual pageをご覧ください。

configureを実行した際、GD、gdbmまたは他のパッケージのファイルま たはライブラリを見つけることができないと言われます。

Cプリプロセッサおよびリンカに次のように追加でフラグを指定するこ とにより、configureスクリプトがヘッダファイルまたはライブラリを 標準以外の場所で探すことが可能となります。

    CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
ログインシェルとしてcsh系のシェルを使用している場合、次のように なります。
    env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure

ファイルlanguage-parser.tab.cをコンパイルする際、 'yytname undeclared'というエラーが発生します。

bisonのバージョンを更新する必要があります。最新版は、 » http://www.gnu.org/software/bison/bison.htmlにあります。

PHP をリンクする際、未定義の参照があるというエラーが複数発生します。

最後に適切なライブラリが全てインクルードされているかどうか 確認してください。よくあるのは、'-ldl' や 指定したデータベースのサポート機能に必要なライブラリの指定が欠けているというものです。

何名かの人から、Apache とリンクする際に 'libphp4.a' の直後に '-ldl' を追加する必要があることも報告されています。

PHPをApache 1.3と組み合わせて構築する手法が分かりません。

この手順は実際には非常に簡単です。以下の手順に注意深く従って下さ い。

  • » http://httpd.apache.org/download.cgiから最新 のApache 1.3配布ファイルを取得してください。
  • これをどこか、例えば、 /usr/local/src/apache-1.3で ungzip、untarしてください。
  • まず、 ./configure --with-apache=/<path>/apache-1.3を実行し、PHP をコンパイルしてください。 (<path> の部分は実際のapache-1.3ディレクトリのパスに置 き換えてください)
  • make を実行した後、make installを実行してください。これにより、PHPが構築され、 必要なファイルがApacheのソースツリーにコピーされます。
  • ディレクトリを /<path>/apache-1.3/srcに移動し、 Configurationファイルを編集してください。 このファイルに以下を追加してください。: AddModule modules/php4/libphp4.a
  • ./configure を実行した後、 makeを実行してください。
  • 以上の手順によりPHP対応のhttpdバイナリが構築できました。

注意: : Apache の新しい ./configureスクリプトを使用することも可能です。 Apache配布ファイルのREADME.configureファイル の指示を参照ください。また、PHP配布ファイルの INSTALL ファイルも参照ください。

インストール手順に完全に基づきUnix上でApacheモジュール版をインス トールしましたが、ブラウザでアクセスするとPHPスクリプトが表示さ れ、ファイルを保存しますかと尋ねられます。

これは、何らかの理由によりPHPモジュールが起動していないことを意 味しています。助けを求める質問を行う前にまず以下を確認ください。

  • 実行しているhttpdバイナリが構築したばかりの新しいhttpdバイナ リであることを確認してください。確認を行うには以下のように入力 します。 /path/to/binary/httpd -l mod_php4.c がリストの中にない場合、正し いバイナリが実行されていません。正しいバイナリを見つけて、イ ンストールしてください。
  • Apache .conf ファイルの1つに正しいMIME型 が追加されていることを確認してください。これは以下のようになります。 AddType application/x-httpd-php .php また、このAddTypeの行が、 <Virtualhost> または <Directory> ブロックの中に隠 されて、テスト用のスクリプトの場所に適用できていないようなこ とがないことを確認してください。
  • 最後に、デフォルトのApache設定ファイルの場所はApache 1.2と Apache 1.3の間で変更されています。AddTypeの行を追加した設定ファ イルが実際に読み込まれていることを確認してください。このファイ ルが正しく読み込まれている場合には、明らかな構文エラーを httpd.confファイルの中に書き込んでしまったり、何らかの明らか な変更があった可能性があります。

--activate-module=src/modules/php4/libphp4.a と書いてありますが、ファイルがありません。このため、 --activate-module=src/modules/php4/libmodphp4.aに 変更しましたが、やはりだめです。何が起きているのでしょう?

libphp4.aファイルはこの時点では存在しない、ということに気をつけてください。 このファイルは、Apacheの構築時に自動的に作成されます。

--activate-module=src/modules/php4/libphp4.a を指定し、PHPを静的モジュールとして組み込んでApacheを構築しよう とした際に、システムがANSI対応ではないというエラーを発生します。

Apacheのこのエラーメッセージは紛らわしく、より新しいバージョンで は修整されています。

--with-apxs を指定して PHP を構築しようとした際、奇妙なエラーメッセージが出力されます。

ここでは、確認すべきことが3点あります。まず、何らかの理由により、 Apacheがapxs Perlスクリプトを構築する際に適当なコンパイラやフラ グ変数を付けないで構築されてしまうことが時々あります。 使用するapxsの場所を見つけたら(which apxsコマンドを 試してみてください。/usr/local/apache/bin/apxs または/usr/sbin/apxs等にあります)、 以下の行を確認してください。

my $CFG_CFLAGS_SHLIB  = ' ';          # substituted via Makefile.tmpl
my $CFG_LD_SHLIB      = ' ';          # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = ' ';          # substituted via Makefile.tmpl
上記のようになっている場合は問題です。これらの行は空白になっているか 'q()'のような正しくない値になっていると思います。これを以下のように 変更してください。
my $CFG_CFLAGS_SHLIB  = '-fpic -DSHARED_MODULE'; # substituted via Makefile.tmpl
my $CFG_LD_SHLIB      = 'gcc';                   # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = q(-shared);              # substituted via Makefile.tmpl 
可能性のある第2の問題は、RedHat-6.1と6.2でのみ存在する問題です。 RedHatが出荷した apxs スクリプトは壊れています。以下の行を見てください。
my $CFG_LIBEXECDIR    = 'modules';         # substituted via APACI install
上の行がある場合、これを次のように変更してください。
my $CFG_LIBEXECDIR    = '/usr/lib/apache'; # substituted via APACI install
最後に、Apacheのconfigure/再インストールを行います。その際、 ./configuremakeの間に make cleanを行ってください。

makeの間、microtimeおよび RUSAGE_関連で多くのエラーを発生します。

インストール時にmakeを行っている際、以下のようなエラーを発生す るとした場合、

microtime.c: In function `php_if_getrusage':
microtime.c:94: storage size of `usg' isn't known
microtime.c:97: `RUSAGE_SELF' undeclared (first use in this function)
microtime.c:97: (Each undeclared identifier is reported only once
microtime.c:97: for each function it appears in.)
microtime.c:103: `RUSAGE_CHILDREN' undeclared (first use in this function)
make[3]: *** [microtime.lo] Error 1
make[3]: Leaving directory `/home/master/php-4.0.1/ext/standard'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/home/master/php-4.0.1/ext/standard'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/master/php-4.0.1/ext'
make: *** [all-recursive] Error 1

あなたのシステムは壊れています。使用しているglibcと同じバージョンの glibc-develパッケージをインストールして、/usr/include ファイルを修正 する必要があります。この問題は、PHPの動作とは全く関係ありません。 これを示すには、次のような簡単なテストを行ってみてください。

$ cat >test.c <<X
#include <sys/resource.h>
X
$ gcc -E test.c >/dev/null
これが、エラーが発生する場合、インクルードファイルが見つからない ことがわかります。

MySQLを使用できるようにPHPをコンパイルする際、configureは正常に 実行されるがmakeの最中に以下のようなエラーが出る: ext/mysql/libmysqlclient/my_tempnam.o(.text+0x46): In function my_tempnam': /php4/ext/mysql/libmysqlclient/my_tempnam.c:103: the use of tempnam' is dangerous, better use mkstemp' 何がおかしいのか?

まず、これはWarningであって致命的な エラーではないと認識することが重要です。makeの 最後のほうでこの出力がしばしば見られるため致命的なエラーと 思われがちですがそうではありません。もちろん、Warningが 起きるとコンパイラが停止するような設定をしている場合は別です。 また、MySQLサポートはデフォルトで構築されることにも 留意してください。

注意:

PHP4.3.2以降、ビルド(make)完了後に以下のようなテキストが出る ことがあります:


Build complete.
(It is safe to ignore warnings about tempnam and tmpnam).

PHPをアップグレードしたいのですが、現在インストールされているPHPを 構築するときに指定した./configureコマンドの オプションはどこで知ることが出来ますか?

現在インストールされているPHPを構築した時のディレクトリにある config.nice ファイルを見るか、もしもうそのディレクトリが無い場合は

<?php phpinfo(); ?>
というスクリプトを実行すれば、最初の方にある./configure という箇所に表示されます。

GDライブラリをリンクしてPHPを構築すると、コンパイルエラーが発生したり 実行時にセグメンテーション違反になってしまいます。

リンクしたGDライブラリとPHPが同じライブラリ(例えばlibpng)に依存しているか どうかを確認してください。

PHP をコンパイルする際に、よくわからないエラーが発生してハングアップ します。Solaris を使用している場合に起こるようです。

PHP のコンパイル時に 非 GNU ツールを使用すると問題を引き起こします。 PHP を正しくコンパイルするには、GNU ツールを使用することを忘れないで ください。たとえば、Solaris で使用される SunOS BSD 互換の sed や Solaris 版の sed は正しく動作しません。しかし、 GNU 版もしくは Sun POSIX (xpg4) 版の sed ならうまく 動きます。以下を参照ください。 » GNU sed» GNU flex および » GNU bison

add a note add a note

User Contributed Notes 5 notes

up
2
terry at mackintoshweb dot com
5 years ago
The configure script of PHP 5.3.0 has some test lines that use expr with the option --, my expr (version 2.0) does not except --.  This causes a run of error messages from the shell like:

./configure: line 2xxx: test: =: unary operator expected
expr: syntax error

I used buildconf --force to see if it would fix this.
While it resulted in a quit different file, it still had the lines of code with expr -- in it.
up
1
Fabio
2 years ago
When building PHP 5.3.x for Apache 2.4.x you may get an error in the apxs query for the MPM_NAME.
This is because the apxs included in Apache 2.4.x doesn't recognize that query anymore.

To resolve this issue one should modify the PHP configure file to use the right MPM module used by Apache.

To know the used MPM you can execute this command: apachectl -t -D DUMP_MODULES | grep mpm

Then, edit the PHP configure file, search for the APXS_MPM variable and force its value to prefork, event or worker according to the value returned by the previous command.

Hope it helps.
-
Fabio
up
0
death5152 at gmail dot com
1 month ago
When i try to open html/php file on browser, i always get an error 403 ot permission denied and i cant see any output for my page. I am running linux mint 17 and everything is functional except for this. All my projects are located in /lampp/apache2/htdocs and i think it is correct.
up
0
anca-phpdoc at anca dot tv
8 years ago
For the configure newbies among us:

If you update or reinstall any of the libraries used to compile in a different directory than they started out, you will need to make sure that you update the config.cache file (or re-generate it) so that configure will not look in the wrong place for the information.

On Mac OS X, for example, I updated my libxml using Fink.  Fink placed the files in the /sw directory.  However, php was still looking for important libxml files (such as xml2-config) in the old directory (/usr/bin/xml2-config).   After updating config.cache with the new value of the xml2-config path, I was able to compile correctly.
up
-3
Anonymous
7 years ago
@ anca-phpdoc at anca dot tv:

You can use ./configure --with-libxml-dir=/path_to_xml2-config
To Top