Глава 53. Проблемы Сборки

В этом разделе собраны наиболее общие ошибки, возникающие на этапе сборки.

1. Я получил последнюю версию PHP, используя анонимный CVS, но в нём нет конфигурационного скрипта!
2. У меня возникают проблемы при конфигурировании PHP для работы с Apache. Он говорит, что не может найти httpd.h, хотя файл находится точно там, где я сказал!
3. Во время конфигурации PHP (./configure) вы наталкиваетесь на ошибку, схожую со следующим:
4. Когда я пытаюсь запустить Apache, я получаю следующее сообщение:
5. Когда я запускаю configure, он говорит, что не может найти файлы include или библиотеку для GD, gdbm или какого-либо другого пакета!
6. При компиляции файла language-parser.tab.c мне выдаются ошибки, говорящие yytname undeclared.
7. Когда я запускаю make, похоже, он выполняется нормально, но на конечной линковке жалуется, что не может найти некоторые файлы.
8. При компиляции PHP, он жалуется на некоторые неопределённые ссылки.
9. Я не могу понять как собрать PHP c Apache 1.3.
10. Я следовал всем шагам по установке модульной версии для Apache на Unix, но мои PHP скрипты выводятся в моём браузере или я получаю запрос сохранить файл.
11. Говорится использовать: --activate-module=src/modules/php4/libphp4.a, но такой файл не существует, поэтому я заменил это на --activate-module=src/modules/php4/libmodphp4.a и оно не работает!? Что происходит?
12. Когда я пытаюсь собрать Apache c PHP, в виде статического модуля, используя --activate-module=src/modules/php4/libphp4.a он говорит, что мой компилятор не ANSI-совместимый.
13. Когда я пытаюсь собрать PHP используя --with-apxs, я получаю странное сообщение об ошибке.
14. Во время выполнения make я получаю ошибки в microtime и множество всяких RUSAGE_.
15. При компиляции PHP с MySQL, configure выполняется нормально, но во время make я получаю ошибку типа следующего: ext/mysql/libmysql/my_tempnam.o(.text+0x46): In function my_tempnam': /php4/ext/mysql/libmysql/my_tempnam.c:103: the use of tempnam' is dangerous, better use mkstemp', в чём дело?
16. Я хочу обновить мой PHP. Где я могу найти строку ./configure, которая была использована для моей текущей PHP установки?
17. При сборке PHP с библиотекой GD, либо выдаются странные ошибки компиляции, либо segfault при выполнении.
18. При компиляции PHP я, кажется, получаю случайные ошибки, например она зависает. Я использую Solaris, если это имеет значение.

1. Я получил последнюю версию PHP, используя анонимный CVS, но в нём нет конфигурационного скрипта!

Вам нужен установленный пакет GNU autoconf для того, чтобы сгенерировать конфигурационный скрипт из configure.in. После получения исходников с CVS сервера просто запустите ./buildconf в директории верхнего уровня. (Также, если вы запускаете configure без опции --enable-maintainer-mode, то конфигурационный скрипт не будет перестроен автоматически при изменении файла configure.in, поэтому вам необходимо делать это вручную, когда вы заметите, что configure.in изменился. Один из симптомов - появление таких вещей как @VARIABLE@ в вашем Makefile после выполнения configure или config.status)

2. У меня возникают проблемы при конфигурировании PHP для работы с Apache. Он говорит, что не может найти httpd.h, хотя файл находится точно там, где я сказал!

Для configure/setup скрипта вам необходимо указать директорию верхнего уровня, в которой находятся исходники Apache. Это означает, что вам надо задать --with-apache=/path/to/apache, а не --with-apache=/path/to/apache/src.

3. Во время конфигурации PHP (./configure) вы наталкиваетесь на ошибку, схожую со следующим:

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

Не забудьте внимательно прочитать инструкции по установке и заметьте, что для компиляции PHP вам нужны оба flex и bison установленные. В зависимости от ваших настроек, установите bison и flex либо из исходников, либо из RPM пакетов.

4. Когда я пытаюсь запустить 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

Для более подробной информации читайте файл INSTALL верхнего уровня или страницу руководства Apache по DSO.

5. Когда я запускаю configure, он говорит, что не может найти файлы include или библиотеку для GD, gdbm или какого-либо другого пакета!

Вы можете сделать так, что скрипт 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

6. При компиляции файла language-parser.tab.c мне выдаются ошибки, говорящие yytname undeclared.

Вам необходимо обновить вашу версию Bison. Последнюю версию можно найти на http://www.gnu.org/software/bison/bison.html.

7. Когда я запускаю make, похоже, он выполняется нормально, но на конечной линковке жалуется, что не может найти некоторые файлы.

Некоторые старые версии make ошибочно не помещают скомпилированые файлы в поддиректорию functions в той же директории. Попробуйте выполнить cp *.o functions и затем перезапустить make. Если это помогло, то вам действительно надо установить свежую версию GNU make.

8. При компиляции PHP, он жалуется на некоторые неопределённые ссылки.

Посмотрите на строку для компоновки и убедитесь, что все нужные библиотеки добавлены в конце. Часто забывают '-ldl' и библиотеки, необходимые для поддержки подключенных баз данных.

Если вы компонуете с Apache 1.2.x, не забыли ли вы добавить соответствующую информацию в строку EXTRA_LIBS в файле Configuration и перезапустить Configure скрипт для Apache? Смотрите файл INSTALL для дополнительной информации.

Некоторые люди также сообщают, что при компоновке с Apache им пришлось добавить '-ldl' сразу после libphp4.a.

9. Я не могу понять как собрать PHP c Apache 1.3.

На самом деле это очень легко. Аккуратно выполните следующие шаги:

  • Получите последний дистрибутив Apache 1.3 с http://www.apache.org/dist/httpd/.

  • Раскомпрессуйте и разархивируйте (ungzip/untar) его где-нибудь, для примера в /usr/local/src/apache-1.3.

  • Скомпилируйте PHP, сперва запустив ./configure --with-apache=/<path>/apache-1.3 (замените <path> на ваш настоящий путь к директории apache-1.3.)

  • Введите make с последующим make install для того, чтобы построить PHP и скопировать все необходимые файлы в дерево дистрибутива Apache.

  • Перейдите в вашу директорию /<path>/apache-1.3/src и отредактируйте файл Configuration. Добавьте в файл: AddModule modules/php4/libphp4.a.

  • Введите: ./configure и затем make.

  • Теперь у вас должен быть бинарник httpd, поддерживающий PHP!

Замечание: Вы также можете использовать новый скрипт ./configure в Apache. Смотрите инструкции в файле README.configure, входящем в ваш дистрибутив Apache. Также загляните в файл INSTALL из дистрибутива PHP.

10. Я следовал всем шагам по установке модульной версии для Apache на Unix, но мои PHP скрипты выводятся в моём браузере или я получаю запрос сохранить файл.

Это означает, что по какой-то причине модуль PHP не вызывается. Перед тем как обращаться за помощью, проверьте три вещи:

  • Убедитесь, что запускаемый вами бинарник httpd действительно новый, только что построенный httpd. Для этого попробуйте запустить: /path/to/binary/httpd -l

    Если вы не видете mod_php4.c в списке, то вы запускаете не тот бинарник. Найдите и установите правильный бинарник.

  • Убедитесь, что вы добавили правильный Mime Type в один из ваших Apache .conf файлов. Это должно быть: AddType application/x-httpd-php3 .php3 (for PHP 3)

    или AddType application/x-httpd-php .php (for PHP 4)

    Также убедитесь, что эта строка AddType не попала внутрь <Virtualhost> или <Directory> блока, так что она не будет применина к местонахождению вашего тестового скрипта.

  • Наконец, между Apache 1.2 и Apache 1.3 расположение конфигурационных файлов Apache по умолчанию изменилось. Вам надо проверить, что действительно читается тот конфигурационный файл, в который вы добавили строку AddType. Вы можете внести очевидную синтаксическую ошибку в ваш httpd.conf файл или какое-либо другое заметное изменение, которое покажет вам, что читается правильный файл.

11. Говорится использовать: --activate-module=src/modules/php4/libphp4.a, но такой файл не существует, поэтому я заменил это на --activate-module=src/modules/php4/libmodphp4.a и оно не работает!? Что происходит?

Заметьте, что файл libphp4.a не должен существовать. Он будет создан в процессе!

12. Когда я пытаюсь собрать Apache c PHP, в виде статического модуля, используя --activate-module=src/modules/php4/libphp4.a он говорит, что мой компилятор не ANSI-совместимый.

Сообщение об ошибке вводит в заблуждение; это исправлено в более свежих версиях Apache.

13. Когда я пытаюсь собрать PHP используя --with-apxs, я получаю странное сообщение об ошибке.

Проверьте три вещи. Во-первых, по какой-то причине, когда Apache создает Perl скрипт apxs, он получается без правильного компилятора и переменных, задающих флаги. Найдите ваш 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. Скрипт apxs, приходящий с Red Hat, сломан. Ищите эту строку:
my $CFG_LIBEXECDIR    = 'modules';         # substituted via APACI install
Если вы нашли вышеприведенную строку, измените её на следующее:
my $CFG_LIBEXECDIR    = '/usr/lib/apache'; # substituted via APACI install
И последнее, если вы переконфигурируете/переустанавливаете Apache, запустите make clean после ./configure и перед make.

14. Во время выполнения 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

Ваша система сломана. Вы должны поправить ваши файлы /usr/include, установив пакет glibc-devel, который соответствует вашей glibc. Это абсолютно не зависит от PHP. Для доказательства попробуйте следующий простой тест:
$ cat >test.c <<X
#include <sys/resource.h>
X
$ gcc -E test.c >/dev/null
Если выдаются ошибки, вы знаете, что у вас беспорядок с include файлами.

15. При компиляции PHP с MySQL, configure выполняется нормально, но во время make я получаю ошибку типа следующего: ext/mysql/libmysql/my_tempnam.o(.text+0x46): In function my_tempnam': /php4/ext/mysql/libmysql/my_tempnam.c:103: the use of tempnam' is dangerous, better use mkstemp', в чём дело?

Во-первых, важно понимать, что это Предупреждение, а не фатальная ошибка. Так как это последнее, что выводится во время make, оно может выглядеть как фатальная ошибка, но это не так. Конечно, если ваш компилятор умирает на Предупреждениях (Warnings), то тогда да. Также имейте ввиду, что поддержка MySQL включена по умолчанию.

Замечание: Начиная с PHP 4.3.2 вы также будете видеть следующуий текст после того как сборка (make) завершится:

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

16. Я хочу обновить мой PHP. Где я могу найти строку ./configure, которая была использована для моей текущей PHP установки?

Либо смотрите файл config.nice в дереве исходников вашей текущей PHP установки, либо, если это недоступно, просто выполните скрипт:
<?php phpinfo(); ?>
В начале вывода будет находиться строка ./configure, которая была использована для сборки текущего PHP.

17. При сборке PHP с библиотекой GD, либо выдаются странные ошибки компиляции, либо segfault при выполнении.

Убедитесь, что ваша библиотека GD и PHP линкуются с одними и теми же зависимыми библиотеками (например libpng).

18. При компиляции PHP я, кажется, получаю случайные ошибки, например она зависает. Я использую Solaris, если это имеет значение.

Использование не GNU утилит во время компиляции PHP может вызвать проблемы. Чтобы быть уверенным, что компиляция PHP будет работать, используйте GNU утилиты. Например, в Solaris, использование SunOS BSD-совместимой или Solaris версии sed не будет работать, а GNU или Sun POSIX (xpg4) версии sed будет. Ссылки: GNU sed, GNU flex, and GNU bison.



Проблемы Сборки
chris dot good at NOSPAM dot infor dot com
10-May-2006 12:12
Re Solaris
I was able to compile PHP 5.0.4 under Solaris 2.6 but I had to use gcc to do it. The source is not compatible with the Solaris C preprocessor. I did not have to install any of the gnu utilities (like sed etc) to get it to compile. It clean compiled & linked immediately using gcc 3.3.2.
timothy at imail dot ru
02-May-2006 07:24
Note on PHP5 setup under RedHat 7

Sometimes php5 fails to build with the following message:

[root@www bin]# ./php5
./php5: error while loading shared libraries: unexpected reloc type 0x80

Below is the configure script used:   

# PHP5 CLI build, CGI/SAPI disabled
# Created by configure

'./configure' \
'--enable-libxml' \
'--with-mysql=/path_to_mysql' \
'--with-libxml=/path_to_my_libxml' \
'--program-suffix=5' \
'--disable-cgi' \
"$@"

I used the following trick to get round this:

0. If it is not a clean installation, run 'make clean' to get rid of improperly compiled files

1. run ./configure with required options
2. edit makefile:
2.1 find any LDFLAGS or PROGRAM_LDFLAGS definition
2.2 append -lstdc++ to the end of it
3. Run 'make'
4. Run 'make install'
5. Enjoy!!!
anca-phpdoc at anca dot tv
08-Dec-2005 07:48
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.
datemplar at freePotatoes dot fr
03-Oct-2005 05:15
If the option --with-apsx2=/path/to/apxs seems to have absolutely no effect and if the configure script ignores the Apache 2.x support, try to shutdown your Apache server (/path/to/bin/apachectl stop) and retry.

It worked here.
didier b.
07-Aug-2005 04:52
I post here because I was unable to find the information on the web.
I hope it will help someone.

Let say you have 2 apache ruuning, on one you want to have disable_functions set and on the other one you don't.

In fact I have (one) solution compiling two differents php modules with differents path to php.ini

using :
--with-config-file-path=/etc/php5  (for the first one)
--with-config-file-path=/etc/php5.nonchroote (for the second one)

for the second one I do not use "make install" but just
"cp .libs/libphp5.so /usr/lib/apache/1.3/libphp5.nonchroote.so"

Then you have to change the
LoadModule php5_module        /usr/lib/apache/1.3/libphp5.nonchroote.so in the second httpd.conf
brad at computechnv dot com
07-Apr-2005 03:07
My problem was actually with mod_dav (which referred me here). Since they took the time to point people here, I thought I'd go ahead and add my two cents worth and expand on the above since it obviously affects PHP as well. I am running Fedora Core 3, Apache 2.0.53, & PHP 5.03. Apache and PHP were built from source.

The first suggestion in section 13 above was close, but not exactly what I needed. jimsteele's suggestion would have worked, but you would have to do it every time you use APXS. What I did was copy these lines:

my $CFG_CFLAGS_SHLIB  = '-fpic -DSHARED_MODULE';
my $CFG_LD_SHLIB      = 'gcc';
my $CFG_LDFLAGS_SHLIB = q(-shared);

and pasted them in the configuration section of my apxs file. Worked like a champ.
dl927 at torfree dot net
11-Feb-2004 09:17
Compiling mod_php4 port on a clean freeBSD 4.8 install for Apache2 needed FOR_APACHE2= yes manually inserted into Makefile prior to version check.
dale at botkin dot org
04-Nov-2002 02:20
If you have customized your Apache to lie about its version number, you may need to edit configure to skip the version number check.  Just /APACHE_VERSION in configure to find the instance(s) where configure checks to make sure you have the right combination of --with-apxs or --with_apxs2 and Apache 1.3 or 2.0.  Assuming you're smart enough to remember which version of Apache you have, you can just delete or comment out the version check and continue to march.
jimsteele at nospam dot com
14-Oct-2001 01:43
Defining the right environment variables for my Apache "make" invocation allowed the correct "apxs" file to be generated for me.  Your mileage may vary.

cd ../apache_1.3.22
CFLAGS_SHLIB="-fpic -DSHARED_MODULE" \
  LD_SHLIB=gcc \
  LDFLAGS_MOD_SHLIB="-shared" \
  make

<УстановкаИспользование PHP>
 Last updated: Tue, 15 Nov 2005