【问题标题】:Loading c libraries from php从 php 加载 c 库
【发布时间】:2010-04-04 11:02:49
【问题描述】:

在最近的一个项目中,我真的需要 lib tre 匹配库。

但是项目是 php 的,并且库没有 php 绑定。

我尝试在谷歌上搜索如何为 c 库创建接口,但我发现的只是 dl 函数,该函数接缝仅加载 php 扩展。

我错过了什么?

【问题讨论】:

    标签: php c interface tre-library


    【解决方案1】:

    如果不存在“php 绑定”,那么您将不得不开发它们 ;-)

    这是通过 PHP 扩展 完成的——例如:


    如果您想了解有关编写 PHP 扩展的更多信息,这些链接可能会让您感兴趣:
    (请注意,这不是一件容易的事——但如果你被要求......好吧^^;有些人会说这不是那么难)

    而且,如果你真的对这个主题很感兴趣,并准备花一些钱,你可以买这本书Extending and Embedding PHP some pages are available as preview on Google Books 也是) ;它被认为是对这个主题感兴趣的(事实上,我前段时间就买了它,而且,在我看来,这确实是一本有趣的书) em>

    顺便说一句,那本书的作者也是我链接到的前四篇文章的作者;-)

    【讨论】:

    • 我猜这意味着,没有像 python ctypes 模块这样的东西可以直接连接 C 代码。那么这个 SWIG 的东西呢?
    • 抱歉,不知道 SWIG 的事:我听说过,但我自己从未使用过;;;关于 ctypes,我不认为有太多:我所知道的唯一类似的事情是 FFI(pecl.php.net/package/ffi),最后一个版本是 alpha,在 2004 年... ;;;在 PHP 中使用外部库的标准方法是编写一个扩展作为围绕它的包装器。
    【解决方案2】:

    编写一个将 tre 暴露给 PHP 的扩展(或找到一个已经这样做的扩展)。一个好的起点是here

    请注意,您将无法在大多数托管服务上加载您的扩展程序。

    【讨论】:

    • 链接已消失。 Marcelo,您要更新或删除此答案吗?
    【解决方案3】:

    自 PHP 7.4 起,扩展 FFI(外来函数接口)被捆绑,但默认禁用。

    应该注意的是,在撰写本文时,该扩展仍被认为是实验性的,即其界面可能会更改,恕不另行通知。

    示例

    调用libc的printf():

    $ffi = FFI::cdef('int printf(const char *format, ...);', 'libc.so.6');
    
    $ffi->printf('It %s!%s', 'works', PHP_EOL);
    

    非 CLI SAPI

    默认情况下,FFI 仅适用于 PHP 的 CLI SAPI。对于 FPM 等其他 SAPI,有以下选项:

    • 通过 OPcache (example) 使用预加载或
    • ffi.enable 设置为true(慢)。

    进一步阅读

    【讨论】:

      猜你喜欢
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      • 1970-01-01
      • 2014-07-20
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多