Учебник РНР
Назад Вперёд

Глава 49. Проблемы построения РНР

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

1. У меня последняя версия PHP, использующая службу анонимного CVS, но нет скрипта конфигурации!
2. У меня проблемы с конфигурирование PHP для работы с Apache. Он говорит, что не может найти httpd.h, но это файл находится там, где я ему указал!
3. Когда я запускаю configure, он говорит, что не может найти include-файлы или библиотеки для GD, gdbm или ещё какого-нибудь пакета!
4. При компиляции файла language-parser.tab.c  он выдаёт мне ошибки, где говорится, что yytname undeclared.
5. Когда я запускаю make, всё вроде идёт нормально, но затем - облом при попытке компоновки окончательного приложения, и он жалуется, что не может найти некоторые файлы.
6. При компоновке/linking PHP он жалуется на наличие undefined-ссылок.
7. Я не могу выяснить, как построить build PHP с Apache 1.3.
8. Я выполнил все шаги по установке Apache-модуля версии для UNIX, а мои PHP-скрипты выводятся в браузере, или мне задаётся вопрос, сохранить ли файл.
9. Сказано использовать --activate-module=src/modules/php4/libphp4.a, но этот файл не существует, поэтому я вместо него сделал --activate-module=src/modules/php4/libmodphp4.a, а он не работает!? В чём причина?
10. Когда я пытаюсь построить Apache с PHP как static-модулем путём использования --activate-module=src/modules/php4/libphp4.a, он мне говорит, что мой компилятор несовместим с ANSI.
11. Когда я пытаюсь построить PHP с использованием --with-apxs, я получаю странные сообщения об ошибках.
12. В процессе make я получаю ошибки в microtime и много RUSAGE_.
13. Я хочу обновить мой PHP. Где я могу найти строку ./configure, которая использовалась для построения установки моей текущей версии PHP?

1. У меня последняя версия PHP, использующая службу анонимного CVS, но нет скрипта конфигурации!

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

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

Вы должны сообщить configure/setup-скрипту расположение верхнего уровня вашего дерева исходников Apache. Это означает, что вы должны специфицировать --with-apache=/path/to/apache, а не --with-apache=/path/to/apache/src.

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

Вы можете сделать так, чтобы configure-скрипт искал header-файлы и библиотеки в нестандартном месте, специфицировав дополнительные флаги для передачи их препроцессору C и компоновщику/linker таким образом:
CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure

Если вы используете csh-вариант для вашей оболочки логина (почему?), это может быть:

env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure

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

Вам необходимо обновить вашу версию Bison. Вы можете найти последнюю версию по адресу ftp://ftp.gnu.org/pub/gnu/bison/

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

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

6. При компоновке/linking PHP он жалуется на наличие undefined-ссылок.

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

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

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

7. Я не могу выяснить, как построить build PHP с Apache 1.3.

Это в действительности довольно легко. Внимательно выполните следующие шаги:

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

  • Ungzip и untar его где-нибудь, например, в /usr/local/src/apache-1.3.

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

  • Введите make и затем make install для построения/build PHP и скопируйте нужные файлы в дерево дистрибутива Apache.

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

  • Введите: ./Configure с последующим make.

  • Вы не должны иметь httpd binary с включённым PHP!

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

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

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

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

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

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

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

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

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

9. Сказано использовать --activate-module=src/modules/php4/libphp4.a, но этот файл не существует, поэтому я вместо него сделал --activate-module=src/modules/php4/libmodphp4.a, а он не работает!? В чём причина?

Обратите внимание, что существование файла libphp4.a не поддерживается. Процесс Аpache создаст его!

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

Это вводящее в заблуждение сообщение об ошибке от Apache, которое устранено в последующих версиях.

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

Здесь нужно проверить три вещи. Во-первых, когда, по некоторым причинам, Apache строит Perl-скрипт apxs, он иногда заканчивает построение без нужных переменных компилятора и флагов. Найдите ваш скрипт apxs (попробуйте команду which apxs, она может найти его в /usr/local/apache/bin/apxs или в /usr/sbin/apxs). Откройте его и проверьте строки наподобие этих:
my $CFG_CFLAGS_SHLIB  = ' ';          # заменено через Makefile.tmpl
my $CFG_LD_SHLIB      = ' ';          # заменено через Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = ' ';          # заменено через Makefile.tmpl

Если вы видите это, вы нашли проблему. В строках могут содержаться пробелы или другие некорректные значения, такие как 'q()'. Измените эти строки так:

my $CFG_CFLAGS_SHLIB  = '-fpic -DSHARED_MODULE'; # заменено через Makefile.tmpl
my $CFG_LD_SHLIB      = 'gcc';                   # заменено через Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = q(-shared);              # заменено через Makefile.tmpl

Вторая проблема может появиться только в Red Hat 6.1 и 6.2. Скрипт apxs, поставляемый в Red Hat, нарушен. Найдите такую строку:

my $CFG_LIBEXECDIR    = 'modules';         # заменено через APACI install

Если нашли, измените её так:

my $CFG_LIBEXECDIR    = '/usr/lib/apache'; # заменено через APACI install

Наконец, если вы реконфигурировали/реинсталировали Apache, добавьте make clean в процесс после ./configure и перед make.

12. В процессе 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. В РНР ничего здесь исправлять не надо. Чтобы самостоятельно проверить это, сделайте простой тест:
$ cat >test.c <<X
#include <sys/resource.h>
X
$ gcc -E test.c >/dev/null

Если вам накидает ошибок, вы будете знать, что это неприятности из ваших include-файлов.

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

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


Назад Оглавление Вперёд
Инсталяция Вверх Использование PHP
Hosted by uCoz