Этот пакет реализует поддержку для выполнения сценариев PHP, экспорта переменных GO для использования в контекстах PHP, прикрепления приемников метода GO в качестве классов PHP и возврата переменных PHP для использования в контексте GO.
Поддерживаются как PHP 5.X, так и PHP 7.X.
Создание этого пакета требует, чтобы у вас была установлена PHP в качестве библиотеки. Для большинства систем Linux это обычно можно найти в упаковке php-embed , или их вариации.
После того, как библиотека PHP будет доступна, привязки могут быть скомпилированы со go build и go get -Cable.
Примечание : здание против PHP 5.x требует, чтобы тег php5 был предоставлен, т.е.
go get -tags php5 github.com/deuill/go-phpЭто связано с тем, что PHP 7.x является целью сборки по умолчанию.
Выполнение файлов сценариев PHP, а также встроенные строки поддерживается и стабильно.
Значения привязки GO, как переменные PHP разрешены для большинства базовых типов, а значения PHP, возвращаемые из строк Eval'D, могут быть преобразованы и используются в контекстах GO в качестве значений interface{} .
Можно прикрепить приемники метода GO в качестве классов PHP, с полной поддержкой для вызова методов вызова, а также для получения и настройки встроенных полей (для приемников метода struct ).
Имейте в виду, что по умолчанию PHP не предназначен для использования в многопоточных средах (что сильно ограничивает использование этих привязков с помощью Goroutines), если не построено с поддержкой ZTS. Тем не менее, поддержка ZTS наблюдала серьезный рефакторинг между PHP 5 и PHP 7, и, как таковой, в настоящее время не поддерживается этим пакетом.
В настоящее время рекомендуется либо синхронизировать использование отдельных контекстов между Goroutines, либо поделиться одним контекстом среди всех работающих Goroutines.
В настоящее время пакет не хватает в нескольких отношениях:
Эти элементы будут решены в порядке значимости (который не может быть приказом, указанным выше).
Выполнить сценарий проста:
package main
import (
php "github.com/deuill/go-php"
"os"
)
func main () {
engine , _ := php . New ()
context , _ := engine . NewContext ()
context . Output = os . Stdout
context . Exec ( "index.php" )
engine . Destroy ()
} Выше приведено выполнять файл script file index.php , расположенный в текущей папке, и напишет любой вывод на io.Writer , назначенный для Context.Output (в данном случае стандартный вывод).
В следующем примере демонстрируется привязка переменной go с запущенным контекстом PHP и возвращению переменной PHP для использования в GO:
package main
import (
"fmt"
php "github.com/deuill/go-php"
)
func main () {
engine , _ := php . New ()
context , _ := engine . NewContext ()
var str string = "Hello"
context . Bind ( "var" , str )
val , _ := context . Eval ( "return $var.' World';" )
fmt . Printf ( "%s" , val . Interface ())
// Prints 'Hello World' back to the user.
engine . Destroy ()
} Значение строки «привет» прикрепляется с использованием Context.Bind под именем var (доступно в PHP как $var ). Скрипт выполняется в строке с использованием Context.Eval , сочетая прикрепленное значение по строке PHP и возвращая его пользователю.
Наконец, значение возвращается как interface{} с использованием Value.Interface() (можно также использовать Value.String() , хотя оба в этом случае эквивалентны).
Весь код в этом репозитории охватывается условиями лицензии MIT, полный текст которого можно найти в файле лицензии.