https://github.com/davidcole1340/ext-php-rs
Bindings for the Zend API to build PHP extensions natively in Rust.
https://github.com/davidcole1340/ext-php-rs
ffi hacktoberfest php rust
Last synced: 5 months ago
JSON representation
Bindings for the Zend API to build PHP extensions natively in Rust.
- Host: GitHub
- URL: https://github.com/davidcole1340/ext-php-rs
- Owner: davidcole1340
- License: apache-2.0
- Created: 2021-03-09T07:55:09.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2025-05-03T15:22:39.000Z (5 months ago)
- Last Synced: 2025-05-03T16:35:31.044Z (5 months ago)
- Topics: ffi, hacktoberfest, php, rust
- Language: Rust
- Homepage:
- Size: 36.1 MB
- Stars: 656
- Watchers: 20
- Forks: 70
- Open Issues: 56
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE_APACHE
Awesome Lists containing this project
README
# ext-php-rs
[](https://lib.rs/ext-php-rs)
[](https://docs.rs/ext-php-rs)
[](https://davidcole1340.github.io/ext-php-rs)

[](https://coveralls.io/github/davidcole1340/ext-php-rs)
[](https://discord.gg/dphp)Bindings and abstractions for the Zend API to build PHP extensions natively in
Rust.- Documentation:
- Guide:## Example
Export a simple function `function hello_world(string $name): string` to PHP:
```rust
#![cfg_attr(windows, feature(abi_vectorcall))]use ext_php_rs::prelude::*;
/// Gives you a nice greeting!
///
/// @param string $name Your name.
///
/// @return string Nice greeting!
#[php_function]
pub fn hello_world(name: String) -> String {
format!("Hello, {}!", name)
}// Required to register the extension with PHP.
#[php_module]
pub fn module(module: ModuleBuilder) -> ModuleBuilder {
module
}
```Use [`cargo-php`] to build IDE stubs and install the extension:
```text
$ cargo install cargo-php --locked
Installing cargo-php v0.1.0
$ cargo php stubs --stdout
Compiling example-ext v0.1.0
Finished dev [unoptimized + debuginfo] target(s) in 3.57s
for information on PHP
supported versions and their end of life dates.
- Rust.
- Currently, we maintain no guarantee of a MSRV, however lib.rs suggests Rust
1.57 at the time of writing.
- Clang 5.0 or later.### Windows Requirements
- Extensions can only be compiled for PHP installations sourced from
. Support is planned for other installations
eventually.
- Rust nightly is required for Windows. This is due to the [vectorcall] calling
convention being used by some PHP functions on Windows, which is only
available as a nightly unstable feature in Rust.
- It is suggested to use the `rust-lld` linker to link your extension. The MSVC
linker (`link.exe`) is supported however you may run into issues if the linker
version is not supported by your PHP installation. You can use the `rust-lld`
linker by creating a `.cargo\config.toml` file with the following content:
```toml
# Replace target triple if you have a different architecture than x86_64
[target.x86_64-pc-windows-msvc]
linker = "rust-lld"
```
- The `cc` crate requires `cl.exe` to be present on your system. This is usually
bundled with Microsoft Visual Studio.
- `cargo-php`'s stub generation feature does not work on Windows. Rewriting this
functionality to be cross-platform is on the roadmap.
- To build the application in `DEBUG` mode on Windows,
you must have a `PHP SDK` built with the `DEBUG` option enabled
and specify the `PHP_LIB` to the folder containing the lib files.
For example: set `PHP_LIB=C:\php-sdk\php-dev\vc16\x64\php-8.3.13-src\x64\Debug_TS`.[vectorcall]: https://docs.microsoft.com/en-us/cpp/cpp/vectorcall?view=msvc-170
## Cargo Features
All features are disabled by default.
- `closure` - Enables the ability to return Rust closures to PHP. Creates a new
class type, `RustClosure`.
- `anyhow` - Implements `Into` for `anyhow::Error`, allowing you
to return anyhow results from PHP functions. Supports anyhow v1.x.## Usage
Check out one of the example projects:
- [anonaddy-sequoia](https://gitlab.com/willbrowning/anonaddy-sequoia) - Sequoia
encryption PHP extension.
- [opus-php](https://github.com/davidcole1340/opus-php) - Audio encoder for the
Opus codec in PHP.
- [tomlrs-php](https://github.com/jphenow/tomlrs-php) - TOML data format parser.
- [php-scrypt](https://github.com/appwrite/php-scrypt) - PHP wrapper for the
scrypt password hashing algorithm.
- [fluent-php](https://github.com/Ennexa/fluent-php) - PHP wrapper for Mozilla's Project Fluent i18n library.
- [php-rocksdb-rc](https://github.com/s00d/php-rocksdb-rc) - PHP wrapper for rocksdb library.## Contributions
Contributions are very much welcome. I am a novice Rust developer and any
suggestions are wanted and welcome. Feel free to file issues and PRs through
Github.Contributions welcome include:
- Documentation expansion (examples in particular!)
- Safety reviews (especially if you have experience with Rust and the Zend API).
- Bug fixes and features.
- Feature requests.When contributing, please keep in mind the following:
- Create tests if possible.
- Update the documentation if necessary.
- If your change is a [braking change](https://semver.org) a migration guide MUST be included. This
should be placed in the `guide/src/migration-guides` directory.
- Use [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/). We use these to automatically generate changelogs.Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.## Resources
- [PHP Internals Book](https://www.phpinternalsbook.com/)
## License
Licensed under either of
- Apache License, Version 2.0 ([LICENSE_APACHE] or
)
- MIT license ([LICENSE_MIT] or )at your option.
[LICENSE_APACHE]: https://github.com/davidcole1340/ext-php-rs/blob/master/LICENSE_APACHE
[LICENSE_MIT]: https://github.com/davidcole1340/ext-php-rs/blob/master/LICENSE_MIT
[docs.rs]: https://docs.rs/ext-php-rs