2014-10-09 26 views
1

我创建使用PHP源代码的PHP扩展目录的ext_skel工具的独立PHP扩展的时候。我编写了必要的PHP_FUNCTION来获取原始参数,它们工作正常。GD资源的无效运行PHP读取宏在独立的PHP扩展

现在我正在写一个函数,它使用一个gd资源参数,这是我遇到问题的地方。当我运行一个调用这个函数的php测试代码时,我的错误日志说图像不是一个有效的资源,然后跳过其余的函数运行。

有谁知道为什么PHP说这不是一个有效的资源?我是否需要以不同的方式编译我的扩展,以便能够像gd源中那样获取此资源,例如函数imagecolorat?以下是一个类似于gd sourcce中的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

当您在另一个扩展中使用一个扩展的资源类型时,您需要在代码中执行一些操作。

  1. 你需要确保你的推广依赖于gd扩展(所以GD加载第一)
  2. 你需要或者包括的gd的扩展报头或内嵌在你的代码需要正确定义的C类型
  3. 什么
  4. 你需要或者对GD或动态加载phpi_get_le_gd链接,你需要做

这是在使用gdImagePtr和gd扩展的资源调用PHP-GTK的例子任何其他电话 - 这个使用动态加载路线这避免了对硬件的依赖gd扩展,但它意味着当gd扩展未加载功能将错误(不出事,只是错误)。

注意其使用的加载le_gd(这是定义并在GD分机上)为ZEND_FETCH_RESOURCE的最后一部分,包括内嵌所以GD不一定在编译的时候需要(请注意,这样的标题phpi_get_le_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存储信息存储在一个对象中。