Skip to main content

ripht_php_sapi/
lib.rs

1//! Rust bindings to PHP's Server API (SAPI) for embedding PHP in Rust applications.
2//!
3//! This crate provides a safe interface to execute PHP scripts from Rust, handling
4//! the request lifecycle, I/O callbacks, and superglobal population automatically.
5//!
6//! # Execution Model
7//!
8//! PHP runs in NTS (non-thread-safe) mode with one request executing at a time.
9//! Each request gets isolated state that's cleaned up after execution.
10//!
11//! # Example
12//!
13//! ```no_run
14//! use ripht_php_sapi::{RiphtSapi, WebRequest};
15//!
16//! let php = RiphtSapi::instance();
17//! let script = std::path::Path::new("/var/www/index.php");
18//!
19//! let request = WebRequest::get()
20//!     .with_uri("/api/users?id=42")
21//!     .build(script)
22//!     .expect("...");
23//!
24//! let result = php.execute(request).expect("execute");
25//! println!("Status: {}, Body: {}", result.status_code(), result.body_string());
26//! ```
27
28#![allow(static_mut_refs)]
29
30pub mod adapters;
31pub mod execution;
32
33mod sapi;
34
35pub use adapters::{
36    AdapterError, CliRequest, CliRequestError, Method, PhpSapiAdapter,
37    WebRequest, WebRequestError,
38};
39
40pub use sapi::{
41    native, ExecutionError, Executor, RiphtSapi, SapiConfig, SapiError,
42};
43
44pub use execution::{
45    ExecutionContext, ExecutionHooks, ExecutionMessage, ExecutionResult,
46    NoOpHooks, OutputAction, ResponseHeader, StreamingCallback, SyslogLevel,
47};
48
49pub mod prelude {
50    pub use crate::{
51        AdapterError, CliRequest, CliRequestError, ExecutionContext,
52        ExecutionHooks, ExecutionMessage, ExecutionResult, Executor, Method,
53        NoOpHooks, OutputAction, PhpSapiAdapter, ResponseHeader, RiphtSapi,
54        SapiConfig, SapiError, StreamingCallback, SyslogLevel, WebRequest,
55        WebRequestError,
56    };
57
58    #[cfg(feature = "http")]
59    pub use crate::{from_http_parts, from_http_request};
60}
61
62#[cfg(feature = "http")]
63pub use adapters::{from_http_parts, from_http_request};
64
65#[cfg(test)]
66use std::path::PathBuf;
67
68#[cfg(test)]
69pub fn php_script_path(name: &str) -> PathBuf {
70    PathBuf::from(env!("CARGO_MANIFEST_DIR"))
71        .join("tests/php_scripts")
72        .join(name)
73}