2024 PHP Conference Japan (日本 PHP 研討會)

範例

範例 #1 Yar 伺服器範例

<?php

/* 假設這個頁面可以透過 http://example.com/operator.php 存取 */

class Operator {

/**
* 將兩個運算元相加
* @param integer
* @return integer
*/
public function add($a, $b) {
return
$this->_add($a, $b);
}

/**
* 減法
*/
public function sub($a, $b) {
return
$a - $b;
}

/**
* 乘法
*/
public function mul($a, $b) {
return
$a * $b;
}

/**
* 受保護的方法不會被公開
* @param integer
* @return integer
*/
protected function _add($a, $b) {
return
$a + $b;
}
}

$server = new Yar_Server(new Operator());
$server->handle();
?>

範例 #2 在瀏覽器中存取伺服器 (GET 請求)

以上範例將會輸出類似以下的內容

Yar Server Info

範例 #3 Yar Client 範例

<?php
$client
= new yar_client("http://example.com/operator.php");

/* 直接呼叫 */
var_dump($client->add(1, 2));

/* 透過 call 呼叫 */
var_dump($client->call("add", array(3, 2)));


/* 無法呼叫 __add */
var_dump($client->_add(1, 2));
?>

以上範例將會輸出類似以下的內容

int(3)
int(5)
PHP Fatal error:  Uncaught exception 'Yar_Server_Exception' with message 'call to api Operator::_add() failed' in *

範例 #4 Yar 並行 Client 範例

<?php
function callback($ret, $callinfo) {
echo
$callinfo['method'] , " 結果: ", $ret , "\n";
}

/* 註冊非同步呼叫到遠端服務 */
Yar_Concurrent_Client::call("http://example.com/operator.php", "add", array(1, 2), "callback");
Yar_Concurrent_Client::call("http://example.com/operator.php", "sub", array(2, 1), "callback");
Yar_Concurrent_Client::call("http://example.com/operator.php", "mul", array(2, 2), "callback");

/* 送出所有請求並等待回應 */
Yar_Concurrent_Client::loop();
?>

以上範例將會輸出類似以下的內容

mul result: 4
sub result: 1
add result: 3
新增註釋

使用者貢獻的註釋 1 則註釋

124960772 at qq dot com
9 年前
<?php
function callback($ret, $callinfo) {
echo
$callinfo['method'] , " 結果: ", $ret , "\n";
}

/* 註冊一個非同步呼叫 */
Yar_Concurrent_Client::call("http://example.com/operator.php", "add", array(1, 2), "callback");
/* 發送所有已註冊的呼叫,等待返回,返回後 Yar 會呼叫 callback 回呼函式 */
Yar_Concurrent_Client::loop();
/* 重設 call,否則上面的 call 會被呼叫 */
Yar_Concurrent_Client::reset();
Yar_Concurrent_Client::call("http://example.com/operator.php", "sub", array(2, 1), "callback");
Yar_Concurrent_Client::loop();

?>
To Top