Swoole Framework - SOAphp
Swoole_Framework/soa
最近因爲業務關係某些模塊須要分類,在此以前考慮過使用鳥哥的Yar,好處是在寫服務端的同時,所作的註釋能夠在直接訪問時,直接已文檔形式呈現,並且在windows與Linux都有拓展支持,問題點就是接口文件暴露在外部,只能經過RSA之類加密來解決安全問題。最終選定了Swoole Framework的方案,由於是接口訪問,因此在安全問題上能夠很容易的使用iptables來解決,並且基於Swoole拓展的強大威力,Swoole的SOA不可小覷,通過半天測試如今簡單整理成文章。html
git clone https://github.com/swoole/framework.git
./soa_server.PHP
mysql
<?php
define('DEBUG', 'on');//開啓debug模式,方便追蹤問題
define("WEBPATH", str_replace("\\","/", __DIR__));//設定app服務器路徑
require __DIR__ . '/../framework/libs/lib_config.php';//引用框架相關參數
$AppSvr = new Swoole\Protocol\SOAServer;
$AppSvr->setLogger(new \Swoole\Log\EchoLog(true)); //Logger
$AppSvr->addNameSpace('SW', __DIR__.'/models');//定義導入空間名爲SW,讀取models下全部文件
Swoole\Error::$echo_html = false;
$server = Swoole\Network\Server::autoCreate('0.0.0.0', 8888);//本地端口
$server->setProtocol($AppSvr);
$server->daemonize(); //做爲守護進程
$server->run(array('worker_num' => 4, 'max_request' => 5000));
再看看models下的文件
./models/Kaku/Chichi/Test.php
linux
<?php
namespace SW\Kaku\Chichi;//注意空間名和路徑直接關係,根據功能等劃分目錄
class Test{
public function Search($args){
$sql = "SELECT * FROM user WHERE 1 = 1 ";
if(!empty($args['host'])){
$sql .= " AND host = '{$args['host']}'";
}
if(!empty($args['user'])){
$sql .= " AND user = '{$args['user']}'";
}
return \SW\Db::Run($sql);//從swoole挖了一個函數出來,以下
}
}
數據庫查詢
./models/Db.php
git
<?php
namespace SW;
class Db{
public function Run($sql){
$config = array(
'type' => \Swoole\Database::TYPE_MYSQLi,
'host' => "127.0.0.1",
'port' => 3306,
'dbms' => 'mysql',
'engine' => 'MyISAM',
'user' => "root",
'passwd' => "",
'name' => "mysql",
'charset' => "utf8",
'setname' => true,
);
$db = new \Swoole\Database($config);
$db->connect();
$result = $db->query($sql);
return $result->fetchall();
}
}
這樣服務端就準備完成了,執行如下命令便可運行
php ./soa_server.php
github
./soa_client.php
sql
<?php
define('DEBUG', 'off');
define("WEBPATH", str_replace("\\","/", __DIR__));
require __DIR__ . '/../framework/libs/lib_config.php';
$cloud = new \Swoole\Client\SOA;
$cloud->addServers(array('0.0.0.0:8888'));
$args = array(
'host' => 'localhost',
'user' => NULL,//爲空時需定義,不然會提示錯誤
);
$ret1 = $cloud->task("SW\\Kaku\\Chichi\\Test::Search", $args);
$ret2 = $cloud->task("SW\\Kaku\\Chichi\\Test::Search", $args);
$n = $cloud->wait(0.5);//執行並設置500ms超時
if($n === 2){
var_dump($ret1->data,$ret2->data['data']);//所有成功後輸出
}
else{
exit();
}
直接訪問./soa_client.php
就能夠看到結果了~數據庫
https://github.com/kakuchichi/swoole_framework/tree/master/src/soa 完整代碼windows