PHP-CPP開發擴展(七)

PHP-CPP是一個用於開發PHP擴展的C++庫。本節講解一些雜項。php

讀取php.ini配置

從php.ini文件中讀取設置就像從常規PHP腳本中獲取這些設置同樣簡單。在PHP腳本中,咱們能夠使用內置的ini_get()函數從php.ini文件中讀取設置,在C++擴展中使用Php::ini_get()函數。html

void myFunction()
{
    // 讀取 output_buffering 變量
    int output_buffering = Php::ini_get("output_buffering");

    // 讀取 variables_order 變量
    std::string variables_order = Php::ini_get("variables_order");
}

若是須要動態註冊配置,必須先使用Php::Ini進行註冊:sql

extension.add(Php::Ini("my_extension.var1", "default-value"));
extension.add(Php::Ini("my_extension.var2", 12345));

而後才能調用Php::ini_get()來檢索當前值。segmentfault

命名空間

添加命名空間很簡單,在C++看來,命名空間只不過是類或函數前綴。若是但願類或函數出如今特定的命名空間中,則只需在類或函數名稱中添加前綴便可。函數

#include <phpcpp.h>

void myFunction()
{
}

extern "C" {
    PHPCPP_EXPORT void *get_module() {

        static Php::Extension extension("my_extension", "1.0");

        // 添加方法到命名空間 myNamespace
        extension.add<myFunction>("myNamespace\\myFunction");

        return extension;
    }
}

也能夠在get_module()使用Php::Namespace來註冊類和函數:spa

// 建立一個命名空間
Php::Namespace myNamespace("myNamespace");

// 添加方法到命名空間
myNamespace.add<myFunction>("myFunction");

// 註冊命名空間
extension.add(std::move(myNamespace));

動態加載擴展

在PHP代碼裏,咱們能夠使用dl()函數動態加載擴展:操作系統

// 加載一個擴展的例子,基於操做系統
if (!extension_loaded('sqlite')) {
    if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
        dl('php_sqlite.dll');
    } else {
        dl('sqlite.so');
    }
}

可是這個函數有使用限制,由於它的參數僅僅是要加載的擴展的文件名,這樣就不能隨意加載某個自定義目錄上的擴展。藉助php-cpp,咱們能夠調用Php::dl()函數,這個函數的原型是:.net

Php::dl(string pathname, bool persistent)
  • pathname 指定擴展的名稱,包含絕對路徑
  • persistent 是否永久加載。默認否,當前請求結束,擴展就卸載了。

由於pathname能夠自定義路徑,那麼就能夠動態加載任何地方的擴展了。下面是個示例:rest

Php::Value enbale_dl(Php::Parameters &params)
{
    std::string pathname = params[0];

    bool persistent = params.size() > 1 ? params[1].boolValue() : false;

    // load the extension
    return Php::dl(pathname, persistent);
}

extern "C" {

    PHPCPP_EXPORT void *get_module() {
        static Php::Extension myExtension("load_extension", "1.0");

        myExtension.add("enbale_dl", enbale_dl, {
            Php::ByVal("pathname", Php::Type::String),
            Php::ByVal("persistent", Php::Type::Bool, false)
        });

        return myExtension;
    }
}

使用示例:code

<?php

if (!dl_unrestricted(__DIR__.'/MyExtension.so', true)) die("Extension could not be loaded");

$object = new ClassFromMyExtension();
$object->methodFromMyExtension();
?>

系列筆記:

參考

一、嘉心嘉軟 - SegmentFault 思否
https://segmentfault.com/blog/jrtk
二、A C++ library for developing PHP extensions | PHP-CPP
http://www.php-cpp.com/documentation/introduction
三、PHP: dl - Manual
https://www.php.net/manual/zh/function.dl.php

相關文章
相關標籤/搜索