PHP Conference Japan 2024

建置問題

本節收集建置時發生的大部分常見錯誤。

  1. 我使用匿名 Git 服務取得了最新版本的 PHP,但沒有 configure 指令碼!
  2. 我在設定 PHP 以便與 Apache 協同運作時遇到問題。它說它找不到 httpd.h,但它就在我指定的位置!
  3. 設定 PHP(./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 或其他套件的 include 檔案或函式庫!
  6. 當編譯檔案 language-parser.tab.c 時,會出現 yytname 未宣告的錯誤。
  7. 當我執行 make 時,它似乎執行順利,但在嘗試連結最終應用程式時失敗,並抱怨找不到某些檔案。
  8. 當連結 PHP 時,它會抱怨許多未定義的參考。
  9. 我已依照所有步驟在 Unix 上安裝 Apache 模組版本,而我的 PHP 指令碼會顯示在瀏覽器中,或是被要求儲存該檔案。
  10. 它說要使用:--activate-module=src/modules/php4/libphp4.a,但該檔案不存在,因此我將它變更為 --activate-module=src/modules/php4/libmodphp4.a,但它無法運作!? 發生了什麼事?
  11. 當我嘗試使用 --activate-module=src/modules/php4/libphp4.a 將 PHP 建置為靜態模組時,它告訴我編譯器不符合 ANSI 規範。
  12. 當我嘗試使用 --with-apxs 建置 PHP 時,會收到奇怪的錯誤訊息。
  13. 在 make 期間,我在 microtime 中收到錯誤,以及許多 RUSAGE_ 相關內容。
  14. 當使用 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', 怎麼了?
  15. 我想升級我的 PHP。我可以在哪裡找到用於建置目前 PHP 安裝的 ./configure 行?
  16. 當使用 GD 函式庫編譯 PHP 時,它會產生奇怪的編譯錯誤,或是在執行時發生區段錯誤。
  17. 當編譯 PHP 時,我似乎會收到隨機錯誤,像是它會停止回應。如果這有關係,我使用的是 Solaris。
我使用匿名 Git 服務取得了最新版本的 PHP,但沒有 configure 指令碼!

您必須安裝 GNU autoconf 套件,以便您可以從 configure.in 產生 configure 指令碼。從 Git 伺服器取得來源後,只需在頂層目錄中執行 ./buildconf。(此外,除非您使用 --enable-maintainer-mode 選項執行 configure,否則當 configure.in 檔案更新時,configure 指令碼不會自動重建,因此當您注意到 configure.in 已變更時,應該手動執行此操作。其中一個徵兆是在執行 configure 或 config.status 之後,在您的 Makefile 中找到類似 @VARIABLE@ 的內容。)

我在設定 PHP 以便與 Apache 協同運作時遇到問題。它說它找不到 httpd.h,但它就在我指定的位置!

您需要告訴 configure/setup 指令碼您的 Apache 來源樹的頂層位置。這表示您要指定 --with-apache=/path/to/apache,而不是 --with-apache=/path/to/apache/src

設定 PHP (./configure) 時,您會遇到類似以下錯誤

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

請務必仔細閱讀安裝說明,並注意您需要安裝 flex 和 bison 才能編譯 PHP。視您的設定而定,您將從來源或套件(例如 RPM)安裝 bison 和 flex。

當我嘗試啟動 Apache 時,會收到以下訊息

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

當將 Apache 核心程式編譯為供共用使用的 DSO 函式庫時,通常會出現此錯誤。嘗試重新設定 apache,務必至少使用以下旗標


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

如需更多資訊,請閱讀頂層的 Apache INSTALL 檔案或 Apache » DSO 手冊頁

當我執行 configure 時,它說找不到 GD、gdbm 或其他套件的 include 檔案或函式庫!

您可以藉由指定要傳遞至 C 前置處理器和連結器的其他旗標,讓 configure 指令碼在非標準位置尋找標頭檔和函式庫,例如

    CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
如果您使用的是 csh 變體作為登入 shell (為什麼要這樣?),則會是
    env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure

當編譯檔案 language-parser.tab.c 時,會出現 yytname undeclared 的錯誤。

您需要更新您的 Bison 版本。您可以在 » https://gnu.dev.org.tw/software/bison/bison.html 找到最新版本。

當連結 PHP 時,它會抱怨許多未定義的參考。

請查看連結行,並確定所有適當的函式庫都包含在結尾。您可能遺漏的常見函式庫是 '-ldl' 和您包含的任何資料庫支援所需的任何函式庫。

有些人也回報說,他們必須在連結 Apache 時,緊接著 libphp4.a 之後新增 '-ldl'。

我已依照所有步驟在 Unix 上安裝 Apache 模組版本,而我的 PHP 指令碼會顯示在瀏覽器中,或是被要求儲存該檔案。

這表示由於某些原因,PHP 模組未被叫用。在要求進一步協助之前,請檢查三件事

  • 確定您正在執行的 httpd 二進位檔案是您剛建置的實際新 httpd 二進位檔案。若要執行此操作,請嘗試執行:/path/to/binary/httpd -l 如果您沒有看到列出的 mod_php4.c,則您執行的不是正確的二進位檔案。尋找並安裝正確的二進位檔案。
  • 確定您已將正確的 MIME 類型新增至其中一個 Apache .conf 檔案。它應該是: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 建置為靜態模組時,它告訴我編譯器不符合 ANSI 規範。

這是來自 Apache 的誤導性錯誤訊息,在較新版本中已修正。

當我嘗試使用 --with-apxs 建置 PHP 時,會收到奇怪的錯誤訊息。

這裡有三件事要檢查。首先,由於某些原因,當 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 
第二個可能的問題只會發生在 Red Hat 6.1 和 6.2 上。Red Hat 提供的 apxs 指令碼是有問題的。請尋找這一行
my $CFG_LIBEXECDIR    = 'modules';         # substituted via APACI install
如果您看到以上這一行,請將其更改為這樣
my $CFG_LIBEXECDIR    = '/usr/lib/apache'; # substituted via APACI install
最後,如果您重新配置/重新安裝 Apache,請在 ./configure 之後和 make 之前,在過程中加入 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
如果它噴出一堆錯誤,您就知道您的 include 檔案有問題了。

當使用 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',怎麼回事?

首先,重要的是要意識到這是一個 警告,而不是致命錯誤。因為這通常是在 make 期間看到的最後輸出,所以它可能看起來像是一個致命錯誤,但實際上不是。當然,如果您將編譯器設定為在警告時停止,它就會這樣做。還要記住,MySQL 支援是預設啟用的。

注意:

從 PHP 4.3.2 開始,您也會在建置(make)完成後看到以下文字


建置完成。
(忽略關於 tempnam 和 tmpnam 的警告是安全的)。

我想要升級我的 PHP。我可以在哪裡找到用於建置目前 PHP 安裝的 ./configure 指令?

您可以查看目前 PHP 安裝的原始碼樹中的 config.nice 檔案,或者,如果此檔案不可用,您可以簡單地執行一個

<?php phpinfo(); ?>
指令碼。在輸出的頂部,會顯示用於建置此 PHP 安裝的 ./configure 指令。

當使用 GD 函式庫編譯 PHP 時,它會產生奇怪的編譯錯誤,或是在執行時發生區段錯誤。

請確保您的 GD 函式庫和 PHP 連結到相同的依賴函式庫(例如 libpng)。

當編譯 PHP 時,我似乎會收到隨機錯誤,像是它會停止回應。如果這有關係,我使用的是 Solaris。

在編譯 PHP 時使用非 GNU 工具可能會導致問題。請務必使用 GNU 工具,以確保編譯 PHP 可以正常運作。例如,在 Solaris 上,使用 SunOS BSD 相容版本或 Solaris 版本的 sed 將無法運作,但使用 GNU 或 Sun POSIX (xpg4) 版本的 sed 將會運作。連結:» GNU sed» GNU flex» GNU bison

新增附註

使用者貢獻的附註

此頁面沒有使用者貢獻的附註。
To Top