Проблемы Построения РНР
Глава 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(); ?> |