Руководство по PHP
Пред. |  | След.

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

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

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.

Пред. | Начало | След.
Установка | Уровень выше | Использование PHP