And here is the previous messaging without borked formatting. Sorry folks.

FFI RFC
======

There are many languages that support an FFI implementation.

NodeJS
Python
C++
Ruby

FFI allows you to call a native C function without requiring the
boilerplate of an extension to be written.

There are several benefits to having FFI

- Performance
- Shareability / Bundling
- Common functionality between languages

Performance
===
Although less pronounced than the 5.x versions, there is still a
performance benefit to having native C code over PHP code. For
example, you could utilise threading inside of your FFI methods, which
PHP does not expose the ability to do.

Shareability
===

If you wish to implement some of your source code in C, the current
way to share it is to build it as an extension. This is cumbersome,
and restricts use-cases such as shared hosting, where the ability to
install your own extensions is probably restricted. However, with FFI,
the shared object can be loaded from any location, and so that
restriction is no longer in place.

They could even be distributed via composer.

Common functionality between languages
===

If you have some complex logic that needs to be replicated in several
languages for whatever reason; implementing it several times over
would lead to uncertain bugs and technical debt increasing heavily. If
you could share the same logic amongst them all using FFI, then this
is no longer an issue.

Example
===

Take an example of a rust program that takes two numbers in and gives
you the sum of them.

```rust
#[no_mangle]
pub extern fn add(a: i32, b: i32) -> i32 {
    a + b
}

```

with the Cargo.toml file containing:

```
[package]
name = "math"
version = "0.1.0"
authors = ["Alex Bowers <bowersb...@gmail.com>"]

[dependencies]

[lib]
name = "math"
crate-type = ["dylib"]
```

`cargo build --release` will create `.so`, `.dylib`, or `.dll` files
depending on your system.

These should be usable within PHP using the exposed functions.

```php
$math = ffi("/path/to/math.so");
$result = $math->add(1, 5);

echo $result; // 6
```

With the implementation at its most basic level, calling the `add`
method with incorrect parameters would likely cause a segfault.

A way around that could be that the methods are not immediately
exposed, but have to be configured.

Something like:

```php
$math = ffi("/path/to/math.so");
$math->add(1, 5); // Throws RuntimeException, method not configured

$math->configure('add', int $a, int $b);

$math->add(1, 5); // 6
$math->add('a', 5); Fatal error: Uncaught TypeError: Argument 1 passed
to add() must be of the type integer, string given
```

Prior art:
===
https://pecl.php.net/package/ffi - Last release > 13
yearshttps://github.com/mgdm/MFFI - Not stable, last commit > 1 year,
no releases

Reply via email to