PHP. Руководство по PHP. 2005
Проблемы Сборки
Глава 69. Проблемы Сборки
В этом разделе собраны наиболее общие ошибки, возникающие на этапе сборки.
1. - Я получил последнюю версию PHP, используя анонимный CVS,
но в нём нет конфигурационного скрипта!
3. - Во время конфигурации PHP (./configure)
вы наталкиваетесь на ошибку, схожую со следующим:
4. - Когда я пытаюсь запустить Apache, я получаю следующее сообщение:
6. - При компиляции файла language-parser.tab.c
мне выдаются ошибки, говорящие yytname undeclared.
8. - При компиляции PHP, он жалуется на некоторые неопределённые ссылки.
9. - Я не могу понять как собрать PHP c Apache 1.3.
13. - Когда я пытаюсь собрать PHP используя
--with-apxs,
я получаю странное сообщение об ошибке.
14. - Во время выполнения make я получаю ошибки в microtime
и множество всяких RUSAGE_.
Я получил последнюю версию PHP, используя анонимный CVS,
но в нём нет конфигурационного скрипта!
Вам нужен установленный пакет GNU autoconf для того, чтобы сгенерировать
конфигурационный скрипт из configure.in.
После получения исходников с CVS сервера просто запустите
./buildconf в директории верхнего уровня.
(Также, если вы запускаете configure без опции
--enable-maintainer-mode, то конфигурационный
скрипт не будет перестроен автоматически при изменении файла
configure.in, поэтому вам необходимо делать это
вручную, когда вы заметите, что configure.in изменился.
Один из симптомов - появление таких вещей как @VARIABLE@ в вашем Makefile
после выполнения configure или config.status)
У меня возникают проблемы при конфигурировании 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 |
Не забудьте внимательно прочитать инструкции по
установке и заметьте, что для
компиляции PHP вам нужны оба flex и bison установленные.
В зависимости от ваших настроек, установите bison и flex либо из
исходников, либо из RPM пакетов.
Когда я пытаюсь запустить Apache, я получаю следующее сообщение:
fatal: relocation error: file /path/to/libphp4.so: |
Эта ошибка обычно появляется, если ядро Apache было скомпилировано как
разделяемая библиотека DSO. Попробуйте переконфигурировать Apache,
используя, по крайней мере, следующие флаги:
--enable-shared=max --enable-rule=SHARED_CORE |
Для более подробной информации читайте файл INSTALL
верхнего уровня или
страницу руководства Apache по DSO.
Когда я запускаю 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 |
При компиляции файла language-parser.tab.c
мне выдаются ошибки, говорящие yytname undeclared.
Вам необходимо обновить вашу версию Bison. Последнюю версию можно найти на
http://gnu.org/software/bison/bison.html.
Когда я запускаю make, похоже, он выполняется нормально,
но на конечной линковке жалуется, что не может найти некоторые файлы.
Некоторые старые версии make ошибочно не помещают скомпилированые файлы в
поддиректорию functions в той же директории.
Попробуйте выполнить cp *.o functions и затем
перезапустить make. Если это помогло, то вам действительно
надо установить свежую версию GNU make.
При компиляции PHP, он жалуется на некоторые неопределённые ссылки.
Посмотрите на строку для компоновки и убедитесь, что все нужные библиотеки
добавлены в конце. Часто забывают '-ldl' и библиотеки, необходимые для
поддержки подключенных баз данных.
Если вы компонуете с Apache 1.2.x, не забыли ли вы добавить
соответствующую информацию в строку EXTRA_LIBS в файле Configuration
и перезапустить Configure скрипт для Apache? Смотрите файл
для дополнительной информации.
Некоторые люди также сообщают, что при компоновке с Apache
им пришлось добавить '-ldl' сразу после libphp4.a.
Я не могу понять как собрать PHP c Apache 1.3.
На самом деле это очень легко. Аккуратно выполните следующие шаги:
Получите последний дистрибутив Apache 1.3 с
http://apache.org/dist/httpd/.
для примера в
/usr/local/src/apache-1.3.
./configure --with-apache=/<path>/apache-1.3
(замените <path> на ваш настоящий путь к директории apache-1.3.)
make install для того, чтобы построить PHP
и скопировать все необходимые файлы в дерево дистрибутива Apache.
/<path>/apache-1.3/src
и отредактируйте файл Configuration.
Добавьте в файл:
AddModule modules/php4/libphp4.a.
Замечание: Вы также можете использовать новый скрипт
./configure в Apache. Смотрите инструкции в файле
README.configure, входящем в ваш дистрибутив Apache.
Также загляните в файл INSTALL из дистрибутива PHP.
Я следовал всем шагам по установке модульной версии для Apache на Unix,
но мои PHP скрипты выводятся в моём браузере или я получаю запрос сохранить
файл.
Это означает, что по какой-то причине модуль PHP не вызывается.
Перед тем как обращаться за помощью, проверьте 3 вещи:
Убедитесь, что запускаемый вами бинарник httpd действительно новый,
только что построенный httpd. Для этого попробуйте запустить:
/path/to/binary/httpd -l
Если вы не видете mod_php4.c в списке,
то вы запускаете не тот бинарник.
Найдите и установите правильный бинарник.
Apache.conf файлов. Это должно быть:
AddType application/x-httpd-php3.php3 (for PHP 3)
или AddType application/x-httpd-php.php (for PHP4)
Также убедитесь, что эта строка AddType не попала внутрь
<Virtualhost> или <Directory> блока, так что она
не будет применина к местонахождению вашего тестового скрипта.
файлов Apache по умолчанию изменилось. Вам надо проверить, что
действительно читается тот конфигурационный файл, в который вы добавили
строку AddType. Вы можете внести очевидную синтаксическую ошибку
в ваш httpd.conf файл или какое-либо другое заметное изменение,
которое покажет вам, что читается правильный файл.
Говорится использовать:
--activate-module=src/modules/php4/libphp4.a,
но такой файл не существует, поэтому я заменил это на
--activate-module=src/modules/php4/libmodphp4.a
и оно не работает!? Что происходит?
Заметьте, что файл libphp4.a не должен существовать.
Он будет создан в процессе!
Когда я пытаюсь собрать Apache c PHP, в виде статического модуля, используя
--activate-module=src/modules/php4/libphp4.a
он говорит, что мой компилятор не ANSI-совместимый.
Сообщение об ошибке вводит в заблуждение; это исправлено в более свежих
версиях Apache.
Когда я пытаюсь собрать PHP используя
--with-apxs,
я получаю странное сообщение об ошибке.
Проверьте 3 вещи. Во-первых, по какой-то причине, когда Apache создает
Perl скрипт apxs, он получается без правильного компилятора и
переменных, задающих флаги.
Найдите ваш apxs скрипт (попробуйте команду which apxs),
иногда он установлен как /usr/local/apache/bin/apxs
или /usr/sbin/apxs.
Откройте его и найдите строки, схожие с этими:
my $CFG_CFLAGS_SHLIB = ' '; # substituted via Makefile.tmpl |
Если они так и выглядят, то вы нашли вашу проблему. Они могут содержать
только пробелы или другие неправильные значения, такие как 'q()'.
Измените эти строки на:
my $CFG_CFLAGS_SHLIB = '-fpic -DSHARED_MODULE'; # 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.
Во время выполнения make я получаю ошибки в microtime
и множество всяких RUSAGE_.
Во время инсталяции, выполняя make,
если вы сталкиваетесь с проблемами, похожими на следующее:
microtime.c: In function `php_if_getrusage': |
Ваша система сломана. Вы должны поправить ваши файлы
/usr/include, установив пакет glibc-devel,
который соответствует вашей glibc. Это абсолютно не зависит от PHP.
Для доказательства попробуйте следующий простой тест:
$ cat>test.c <<X |
Если выдаются ошибки, вы знаете, что у вас беспорядок с include файлами.
При компиляции 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
включена по умолчанию.
Замечание:
Начиная с PHP4.3.2 вы также будете видеть следующуий текст после
того как сборка (make) завершится:
Build complete. |
Я хочу обновить мой PHP. Где я могу найти строку
./configure, которая была использована для моей
текущей PHP установки?
Либо смотрите файл config.nice в дереве исходников вашей текущей PHP
установки, либо, если это недоступно, просто выполните скрипт:
|
В начале вывода будет находиться строка ./configure,
которая была использована для сборки текущего PHP.
При сборке PHP с библиотекой GD, либо выдаются странные ошибки компиляции,
либо segfault при выполнении.
Убедитесь, что ваша библиотека GD и PHP линкуются с одними и теми же
зависимыми библиотеками (например libpng).
При компиляции PHP я, кажется, получаю случайные ошибки, например она зависает.
Я использую Solaris, если это имеет значение.
Использование не GNU утилит во время компиляции PHP может вызвать проблемы.
Чтобы быть уверенным, что компиляция PHP будет работать,
используйте GNU утилиты. Например, в Solaris, использование
SunOS BSD-совместимой или Solaris версии sed
не будет работать, а GNU или Sun POSIX (xpg4) версии
sed будет.
Ссылки: GNU sed,
GNU flex, and
Установка
Использование PHP