jayeshmepani/jpl-moshier-ephemeris-php
PHP 8.3+ FFI wrapper for the JPL Moshier Ephemeris C library. Exposes all public jme_* functions and JME_* constants with no output reshaping. Supports AUTO/JPL/MOSHIER/VSOP engines and direct JPL/CALCEPH kernel access via shared libs.
PHP 8.3+ FFI wrapper for the independent JPL Moshier Ephemeris C library.
This package wraps the project-owned jme_* C API from the JPL Moshier Ephemeris native library.
jme_*JME_*jme_* functions tracked by the native API inventoryJME_* tokens including two header guards; the PHP wrapper exposes the semantic native constants and preserves existing compatibility aliases where presentlibjme.so, libjme.dylib, or jme.dllJME_ERR from the C library rather than pretending to provide production ephemeris outputThe low-level JmeEphFFI class exposes every native function directly. The optional Laravel-style JmeService::calc() convenience method sets ENGINE=... through jme_set_astro_models() and then calls jme_calc():
AUTO: let the native C core choose its standard JPL/fallback policyJPL: require JPL kernel-backed behaviorMOSHIER: force Moshier analytical behaviorVSOP_ELP_MEEUS: force VSOP87/ELP2000/Meeus analytical behaviorUse direct jme_jpl_* calls for raw JPL/CALCEPH kernel access. The PHP layer does not normalize or reinterpret native outputs.
^8.3ext-ffi)By default, the wrapper loads the bundled platform library from this package, for example:
vendor/jayeshmepani/jpl-moshier-ephemeris-php/libs/linux-x64/libjme.so
Override it with:
export JME_LIBRARY_PATH=/path/to/libjme.so
Composer installs prebuilt runtime archives from this repository's GitHub releases when a local library is not already present. Each runtime archive contains:
jme.dll, libjme.so, or libjme.dylibJPL .bsp kernels are not shipped in this package. Download them separately from the native JME kernel release:
https://github.com/jayeshmepani/jpl-ephemeris/releases/tag/jpl-kernels
Supported kernel choices:
de440s.bsp - smallde440.bsp - mediumde441.bsp - large, published as split release parts because the full file exceeds GitHub's single asset size limituse FFI;
use JmeEph\FFI\JmeEphFFI;
$jme = new JmeEphFFI();
$jd = $jme->jme_julian_day(
2000,
1,
1,
12.0,
JmeEphFFI::JME_CALENDAR_GREGORIAN
);
$xx = $jme->getFFI()->new('double[6]');
$error = $jme->getFFI()->new('char[256]');
$result = $jme->jme_calc_ut(
$jd,
JmeEphFFI::JME_BODY_SUN,
JmeEphFFI::JME_CALC_NONE,
$xx,
$error
);
if ($result === JmeEphFFI::JME_OK) {
echo "Sun longitude: {$xx[0]}\n";
} else {
echo 'JME error: ' . FFI::string($error) . "\n";
}
composer install
composer verify:surface
composer test
The test suite verifies the PHP wrapper against the JME-native contract, including function inventory coverage, constant inventory coverage, key JME_* values, and convenience calculation paths. Set JME_SOURCE_PATH if the native source tree is not at the default local path.
composer verify:surface performs an exact low-level surface audit of the generated wrapper:
204 tracked jme_* declarations compared against the native header prototypes462 JME_* constants compared against native header valuesHow can I help you explore Laravel packages today?