# ext-php-rs [![Crates.io](https://img.shields.io/crates/v/ext-php-rs)](https://lib.rs/ext-php-rs) [![docs.rs](https://img.shields.io/docsrs/ext-php-rs/latest)](https://docs.rs/ext-php-rs) [![Guide Workflow Status](https://img.shields.io/github/actions/workflow/status/davidcole1340/ext-php-rs/docs.yml?branch=master&label=guide)](https://davidcole1340.github.io/ext-php-rs) ![CI Workflow Status](https://img.shields.io/github/actions/workflow/status/davidcole1340/ext-php-rs/build.yml?branch=master) [![Discord](https://img.shields.io/discord/115233111977099271)](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 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 . 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. [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. ## 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. 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