gd资源在独立的PHP扩展中运行PHP获取宏时无效



我在PHP源代码的PHP扩展目录中使用ext_skel工具创建了一个独立的PHP扩展。我编写了必要的PHP_FUNCTION来接受原始参数,它们工作得很好。

现在我正在编写一个使用gd资源参数的函数,这就是我遇到问题的地方。当我运行调用上述函数的php测试代码时,我的错误日志显示Image不是有效的资源,然后跳过函数运行的其余部分。

有人知道PHP为什么说这不是一个有效的资源吗?我是否需要以不同的方式编译我的扩展,以便能够像函数imagecolorat的gd源中那样获取此资源?下面是一个类似于gd-surcce中imagecolorat函数的示例代码。

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. 您需要确保您的扩展依赖于gd扩展(因此首先加载gd)
  2. 您需要在代码中包含gd的扩展头,或者内联您需要的内容来正确定义C类型
  3. 您需要针对gd进行链接,或者动态加载phpiget_le.gd和您需要进行的任何其他调用

这里是php-gtk中的一个例子,它使用gdImagePtr和gd扩展的资源调用-这使用了动态加载路由,避免了对gd扩展进行硬依赖,但这意味着当gd扩展没有加载时,函数将出错(不是崩溃,只是出错)。

请注意,它使用phpi_get_le_gd(),它为ZEND_FETCH_RESOURCE的最后一部分加载le_gd(这是在gd扩展中定义和保存的),并将头内联,因此编译时不一定需要gd(请注意,如果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。

相关内容

  • 没有找到相关文章

最新更新