swoole and golang ipc tool
swoole process module run go process as a sider car, use goroutine complete swoole coroutine in some cases
<?php
include "vendor/autoload.php " ;
use Al \GoSider \HubManager ;
use Al \GoSider \Hub ;
use Al \GoSider \Response ;
use Al \GoSider \Task ;
use Al \GoSider \TaskManager ;
$ h = new Hub (
bin: getopt (', ' , ['bin: ' ])['bin ' ],
taskManager: new TaskManager (),
);
$ h ->onSuccess (function (Response $ resp , TaskManager $ taskManager ) {
/** @var \Messages\Reply $reply */
$ reply = $ resp ->getResp ();
dump (json_decode ($ reply ->getContext (), true ));
dump ($ reply ->getTaskId ());
dump (json_decode ($ reply ->getResponse (), true ));
// $taskManager[12345] = new Task(6666, [
// 'task' => [
// 'a' => 'swoole',
// 'b' => 'world',
// ],
// 'context' => [
// 'c' => 'golang',
// 'd' => 'world',
// ],
// ]);;
// $taskManager->send();
});
// TODO
$ h ->onFail (function (Response $ resp , TaskManager $ taskManager ) {
});
// TODO
$ h ->onTime (function (Response $ resp , TaskManager $ taskManager ) {
});
$ hm = new HubManager ($ h );
$ hm ->start ();
<?php
# some code that may be got blocked in swoole,
# just use Task class it make unblocked
require 'vendor/autoload.php ' ;
use Al \GoSider \Bus ;
use Al \GoSider \Task ;
$ t1 = new Task (1111 , [
'task ' => [
'a ' => '中国 ' ,
'b ' => 'world ' ,
],
'context ' => [
'c ' => '中国 ' ,
'd ' => 'world ' ,
],
]);
$ t2 = new Task (2222 , [
'task ' => [
'a ' => '中国 ' ,
'b ' => 'world ' ,
],
'context ' => [
'c ' => '中国 ' ,
'd ' => 'world ' ,
],
]);
$ bus = new Bus (compact ('t1 ' , 't2 ' ));
$ bus ->send ();
package main
import (
"context"
"encoding/json"
"github.com/alwaysLinger/gosider/pkg/hub"
"github.com/alwaysLinger/gosider/pkg/pb"
)
func main () {
h := hub .NewHub (func (ctx context.Context , req interface {}) (interface {}, error ) {
task , _ := req .(* pb.Task )
return & pb.Reply {
TaskId : task .GetTaskId (),
Status : 123 ,
Response : jsonResp (),
Context : task .GetContext (),
}, nil
})
h .Start ()
}
type resp struct {
FieldA string `json:"field_a"`
FieldB string `json:"field_b"`
FieldC string `json:"field_c"`
}
func jsonResp () []byte {
marshal , err := json .Marshal (resp {
FieldA : "hello" ,
FieldB : "swoole" ,
FieldC : "golang" ,
})
if err != nil {
return nil
}
return marshal
}
php main.php --bin /path/to/your/goexecfile
php task.php