2014-10-09 23 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存儲信息存儲在一個對象中。