Загрузка c библиотек из php
В недавнем проекте мне понадобилась библиотека соответствия библиотек.
Однако проект находится в php, и для библиотеки нет привязок php.
Я пытался Google, как создать интерфейс для C libs, но все, что я нашел, было dl
функция, которая швы, чтобы загрузить только расширения PHP.
Что мне не хватает?
3 ответа
Если " php bindings " не существует, похоже, вам придется их разрабатывать;-)
Это делается с помощью расширения PHP, такого как, например:
-
mysql
расширение, которое используется для связи с MySQL, связывая библиотеку libmysql (с PHP <= 5.2) -
curl
расширение, это обертка вокруг библиотеки curl - и многие другие...
Если вы хотите узнать больше о написании расширений PHP, эти ссылки, вероятно, заинтересуют вас:
(Обратите внимание, что это не совсем легкая задача - но если вам нужно... хорошо ^^; а некоторые скажут, что это не так сложно)
- Написание расширений, часть I: Введение в PHP и Zend
- Написание расширения, часть II: параметры, массивы и ZVAL
- Написание расширения, часть II: параметры, массивы и ZVAL [продолжение]
- Написание расширения Часть III: Ресурсы
- И, просто для справки, как я говорю о C++, а не C: оборачивание классов C++ в расширение PHP
И, если вы действительно интересуетесь этой темой и готовы потратить на нее немного денег, вы можете купить книгу " Расширение и встраивание PHP" ( некоторые страницы также доступны в качестве предварительного просмотра в Google Книгах); Она считается книгой для чтения, когда она заинтересована в этом предмете (на самом деле я купил ее некоторое время назад, и, на мой взгляд, это действительно интересное чтение)
Кстати, автор этой книги также является автором первых четырех статей, на которые я ссылался;-)
Напишите расширение, которое предоставляет tre для PHP (или найдите такое, которое уже делает). Хорошая отправная точка здесь.
Имейте в виду, что вы не сможете загрузить свое расширение на большинстве хостинговых услуг.
Начиная с PHP 7.4, расширение FFI (интерфейс внешних функций) включено, но по умолчанию отключено.
Следует отметить, что на момент написания этой статьи расширение по-прежнему считается ЭКСПЕРИМЕНТАЛЬНЫМ, т.е. его интерфейс может быть изменен без предварительного уведомления.
Пример
Вызов libc
printf()
:
$ffi = FFI::cdef('int printf(const char *format, ...);', 'libc.so.6');
$ffi->printf('It %s!%s', 'works', PHP_EOL);
SAPI без CLI
По умолчанию FFI работает только в PHP CLI SAPI. Для других SAPI, таких как FPM, есть следующие варианты:
- Использование предзагрузки через OPcache ( пример ) или
- параметр
ffi.enable
кtrue
(медленный).