Недопустимый ресурс gd при запуске макроса PHP fetch в автономном расширении PHP

Я создал отдельное расширение PHP с помощью инструмента ext_skel в каталоге расширений PHP исходного кода PHP. Я написал необходимые PHP_FUNCTION для получения примитивных параметров, и они отлично работают.

Сейчас я пишу функцию, которая использует параметр ресурса gd, и именно здесь я сталкиваюсь с проблемой. Когда я запускаю тестовый код php, вызывающий эту функцию, мой журнал ошибок говорит, что Image не является допустимым ресурсом, а затем пропускает оставшуюся часть функции.

Кто-нибудь знает, почему PHP говорит, что это недопустимый ресурс? Нужно ли мне компилировать свое расширение по-другому, чтобы я мог получить этот ресурс, как в исходном тексте gd, например, функция imagecolorat? Ниже приведен пример кода, аналогичного тому, что было сделано в функции imagecolorat в gd sourcce.

PHP_FUNCTION(myfunction)
{
zval *IM;
gdImagePtr im;

if ( zend_parse_parameter(ZEND_NUM_ARGS() TSRMLS_CC, "r", &IM) == FAILURE ) return;
ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);

...
}

1

Решение

Когда вы используете тип ресурса одного расширения в другом расширении, в вашем коде нужно сделать несколько вещей.

  1. вам нужно убедиться, что ваше расширение зависит от расширения gd (поэтому сначала загружается gd)
  2. вам нужно либо включить заголовки расширений gd, либо встроить то, что вам нужно, в ваш код для правильного определения типов C
  3. вам нужно либо связать с gd, либо динамически загрузить phpi_get_le_gd и любые другие вызовы, которые вам нужно сделать

Вот пример в php-gtk, который использует gdImagePtr и вызовы ресурсов расширения gd — это использует динамический маршрут загрузки, который позволяет избежать жесткой зависимости от расширения gd, но это означает, что когда расширение gd не загружено, функция выдаст ошибку (не сбой, просто ошибка).

Обратите внимание, что он использует phpi_get_le_gd (), который загружает le_gd (это определено и хранится в расширении gd) для последней части ZEND_FETCH_RESOURCE и включает встроенные заголовки, поэтому gd не обязательно требуется во время компиляции (обратите внимание, что это может сделать этот код хрупкие, однако, если Б-г меняет вещи внутренне)

https://github.com/php/php-gtk-src/blob/def8bf69e3994aa805e8b7fbf894ad399fb41d23/ext/gtk%2B/gdk.overrides#L2038

Другой вариант — избегать использования ловушек ресурсов расширения gd и просто использовать саму libgd. Это потребует написания ваших собственных манипуляций с ресурсами или даже объектно-ориентированного интерфейса и ссылки на саму libgd.

Хорошим примером этого является расширение pecl gdchart, которое все еще находится в svn http://svn.php.net/viewvc/pecl/gdchart/ — Есть несколько хороших примеров того, как создать расширение PHP, которое использует libgd с информацией, хранящейся внутри объекта.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]