#php #php-extension
#php #php-расширение
Вопрос:
Я создаю свое первое расширение PHP, используя https://www.zend.com/resources/writing-php-extensions в качестве дорожной карты и столкнулся с некоторыми интересными (для меня) проблемами.
На сервере установлен PHP 7.2, но текущая master
версия — 7.4. Я скопировал php-src-master
его на сервер и выполнил первый шаг php ext_skel.php --ext test --dir
, а затем
# phpize
# ./configure
# make
Затем я получаю эту ошибку:
/bin/bash /root/php-src-master/ext/test/libtool --mode=compile cc -I. -I/root/php-src-master/ext/test -DPHP_ATOM_INC -I/root/php-src-master/ext/test/include -I/root/php-src-master/ext/test/main -I/root/php-src-master/ext/test -I/usr/include/php/20170718 -I/usr/include/php/20170718/main -I/usr/include/php/20170718/TSRM -I/usr/include/php/20170718/Zend -I/usr/include/php/20170718/ext -I/usr/include/php/20170718/ext/date/lib -DHAVE_CONFIG_H -g -O2 -c /root/php-src-master/ext/test/test.c -o test.lo
libtool: compile: cc -I. -I/root/php-src-master/ext/test -DPHP_ATOM_INC -I/root/php-src-master/ext/test/include -I/root/php-src-master/ext/test/main -I/root/php-src-master/ext/test -I/usr/include/php/20170718 -I/usr/include/php/20170718/main -I/usr/include/php/20170718/TSRM -I/usr/include/php/20170718/Zend -I/usr/include/php/20170718/ext -I/usr/include/php/20170718/ext/date/lib -DHAVE_CONFIG_H -g -O2 -c /root/php-src-master/ext/test/test.c -fPIC -DPIC -o .libs/test.o
In file included from /root/php-src-master/ext/test/test.c:10:0:
/root/php-src-master/ext/test/test_arginfo.h:8:2: warning: implicit declaration of function ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE [-Wimplicit-function-declaration]
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, str, IS_STRING, 0, """")
Если я загружу src для 7.2, то все будет работать просто отлично. Наверное, я удивлен, потому что на данный момент я вообще не редактировал никакого кода, поэтому я бы подумал, что это эквивалент Hello World
системы, которая, похоже, будет иметь максимальную совместимость между версиями и поэтому не выдаст ошибку, если я не вызывал функции, которых не было в установленной версии. Если это верно и вызывается «новая» функция, которой не было в 7.2, кажется странным, что базовый скелет будет использовать функции, которых не было в 7.2, для отображения «Hello World».
Если бы я создавал и компилировал в 7.2, смог бы я позже скомпилировать в 7.4? Если я скомпилирую в 7.4, смогу ли я использовать его в 7.2?
Расширения, которые я хочу создать, будут иметь очень простые задания, но те, которые нужно выполнять быстро и часто. Такие вещи, как форматирование телефонных номеров, фильтрация json, обработка рекурсивных древовидных связей и так далее.
Увидев эту проблему совместимости, мне любопытно, не заставит ли это меня использовать определенную версию PHP, где, даже когда я не пытаюсь использовать какие-либо новые функции в своем коде, мне все равно придется переписывать его каждый раз, когда мы будем обновлять PHP в ближайшие годы.
Комментарии:
1. объявление неявной функции означает, что не удалось найти функцию во время соединения. Вам, вероятно, нужно
-l
и, возможно-L
, сообщить компоновщику, где его найти.
Ответ №1:
Скелеты для конкретной ветви версии PHP могут использовать функциональные возможности / внутренние API, представленные в указанной версии, если вы хотите создать расширение, совместимое с более низкой версией PHP, вы должны работать со скелетом расширения PHP указанной версии PHP, а не с более поздней.