<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/class.yar-concurrent-client.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'zh',
  ),
  'this' => 
  array (
    0 => 'yar-concurrent-client.call.php',
    1 => 'Yar_Concurrent_Client::call',
    2 => '注册一个并发调用',
  ),
  'up' => 
  array (
    0 => 'class.yar-concurrent-client.php',
    1 => 'Yar_Concurrent_Client',
  ),
  'prev' => 
  array (
    0 => 'class.yar-concurrent-client.php',
    1 => 'Yar_Concurrent_Client',
  ),
  'next' => 
  array (
    0 => 'yar-concurrent-client.loop.php',
    1 => 'Yar_Concurrent_Client::loop',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'zh',
    'path' => 'reference/yar/yar_concurrent_client/call.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="yar-concurrent-client.call" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">Yar_Concurrent_Client::call</h1>
  <p class="verinfo">(PECL yar &gt;= 1.0.0)</p><p class="refpurpose"><span class="refname">Yar_Concurrent_Client::call</span> &mdash; <span class="dc-title">注册一个并发调用</span></p>

 </div>

 <div class="refsect1 description" id="refsect1-yar-concurrent-client.call-description">
  <h3 class="title">说明</h3>
  <div class="methodsynopsis dc-description">
   <span class="modifier">public</span> <span class="modifier">static</span> <span class="modifier">function</span> <span class="methodname"><strong>Yar_Concurrent_Client::call</strong></span>(<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$uri</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$method</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><span class="type"><a href="language.types.null.php" class="type null">?</a></span><span class="type"><a href="language.types.array.php" class="type array">array</a></span></span> <code class="parameter">$parameters</code><span class="initializer"> = null</span></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><span class="type"><a href="language.types.null.php" class="type null">?</a></span><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span></span> <code class="parameter">$callback</code><span class="initializer"> = null</span></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><span class="type"><a href="language.types.null.php" class="type null">?</a></span><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span></span> <code class="parameter">$error_callback</code><span class="initializer"> = null</span></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><span class="type"><a href="language.types.null.php" class="type null">?</a></span><span class="type"><a href="language.types.array.php" class="type array">array</a></span></span> <code class="parameter">$options</code><span class="initializer"> = null</span></span><br>): <span class="type"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span>|<span class="type"><a href="language.types.singleton.php" class="type false">false</a></span>|<span class="type"><a href="language.types.null.php" class="type null">null</a></span></span></div>

  <p class="simpara">
   注册一个远程 RPC 调用。请求不会立即发送；所有已注册的调用由
   <span class="methodname"><a href="yar-concurrent-client.loop.php" class="methodname">Yar_Concurrent_Client::loop()</a></span> 一起发出，
   响应按到达的先后顺序处理。
  </p>
  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <p class="simpara">
    仅支持 HTTP 和 HTTPS URI。并发调用通过 curl 的 multi-handle 接口同时发出，
    TCP/Unix socket 传输方式没有提供该能力。
   </p>
  </p></blockquote>
 </div>


 <div class="refsect1 parameters" id="refsect1-yar-concurrent-client.call-parameters">
  <h3 class="title">参数</h3>
  <dl>
   
    <dt><code class="parameter">uri</code></dt>
    <dd>
     <p class="simpara">
      RPC 服务的地址，以
      <code class="literal">http://</code> 或 <code class="literal">https://</code> 开头。
     </p>
    </dd>
   
   
    <dt><code class="parameter">method</code></dt>
    <dd>
     <p class="simpara">
      远程服务方法的名称。
     </p>
    </dd>
   
   
    <dt><code class="parameter">parameters</code></dt>
    <dd>
     <p class="simpara">
      传递给远程方法的参数列表。
     </p>
    </dd>
   
   
    <dt><code class="parameter">callback</code></dt>
    <dd>
     <p class="simpara">
      当此次调用的响应到达时调用的 <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>，
      接收两个参数：响应值，以及一个描述该调用的
      <code class="literal">callinfo</code> <span class="type"><a href="language.types.array.php" class="type array">array</a></span>：
     </p>
     <ul class="simplelist">
      <li><code class="literal">sequence</code> ——注册该调用时返回的序列号</li>
      <li><code class="literal">uri</code> ——服务的地址</li>
      <li><code class="literal">method</code> ——远程方法的名称</li>
     </ul>
     <p class="simpara">
      如果省略，则使用
      <span class="methodname"><a href="yar-concurrent-client.loop.php" class="methodname">Yar_Concurrent_Client::loop()</a></span> 的
      <code class="literal">callback</code>；两者都不设置时的行为参见该方法。
     </p>
    </dd>
   
   
    <dt><code class="parameter">error_callback</code></dt>
    <dd>
     <p class="simpara">
      当此次调用失败时调用的 <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>，
      接收三个参数：错误类型（<code class="literal">YAR_ERR_*</code>
      错误码之一）、错误消息，以及上述的 <code class="literal">callinfo</code> <span class="type"><a href="language.types.array.php" class="type array">array</a></span>。
      如果省略，则使用
      <span class="methodname"><a href="yar-concurrent-client.loop.php" class="methodname">Yar_Concurrent_Client::loop()</a></span> 的
      <code class="literal">error_callback</code>；两者都不设置时的行为参见该方法。
     </p>
    </dd>
   
   
    <dt><code class="parameter">options</code></dt>
    <dd>
     <p class="simpara">
      客户端选项的 <span class="type"><a href="language.types.array.php" class="type array">array</a></span>，以
      <code class="literal">YAR_OPT_*</code> 常量作为键，参见
      <span class="methodname"><a href="yar-client.setopt.php" class="methodname">Yar_Client::setOpt()</a></span>。
      仅对本次调用生效。
     </p>
    </dd>
   
  </dl>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-yar-concurrent-client.call-returnvalues">
  <h3 class="title">返回值</h3>
  <p class="simpara">
   返回已注册调用的序列号，这是一个从 <code class="literal">1</code>
   开始的唯一 ID，用于标识该调用。
   如果并发客户端已经在
   <span class="methodname"><a href="yar-concurrent-client.loop.php" class="methodname">Yar_Concurrent_Client::loop()</a></span> 中，
   或已达到 <code class="literal">128</code> 个已注册调用的上限，则返回 <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>；
   这两种情况都会产生一条警告。
   如果 URI 或方法名为空，或 URI 不是 HTTP(S) 地址，则返回 <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>，并产生一条警告。
  </p>
 </div>


 <div class="refsect1 examples" id="refsect1-yar-concurrent-client.call-examples">
  <h3 class="title">示例</h3>
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php

</span><span style="color: #007700">function </span><span style="color: #0000BB">callback</span><span style="color: #007700">(</span><span style="color: #0000BB">$retval</span><span style="color: #007700">, </span><span style="color: #0000BB">$callinfo</span><span style="color: #007700">)
{
    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$retval</span><span style="color: #007700">);
}

function </span><span style="color: #0000BB">error_callback</span><span style="color: #007700">(</span><span style="color: #0000BB">$type</span><span style="color: #007700">, </span><span style="color: #0000BB">$error</span><span style="color: #007700">, </span><span style="color: #0000BB">$callinfo</span><span style="color: #007700">)
{
    </span><span style="color: #0000BB">error_log</span><span style="color: #007700">(</span><span style="color: #0000BB">$error</span><span style="color: #007700">);
}

</span><span style="color: #0000BB">Yar_Concurrent_Client</span><span style="color: #007700">::</span><span style="color: #0000BB">call</span><span style="color: #007700">(</span><span style="color: #DD0000">"http://api.example.com/operator.php"</span><span style="color: #007700">, </span><span style="color: #DD0000">"some_method"</span><span style="color: #007700">, array(</span><span style="color: #DD0000">"parameters"</span><span style="color: #007700">), </span><span style="color: #DD0000">"callback"</span><span style="color: #007700">);

</span><span style="color: #FF8000">/* 如果不指定回调，将使用 loop() 的回调 */
</span><span style="color: #0000BB">Yar_Concurrent_Client</span><span style="color: #007700">::</span><span style="color: #0000BB">call</span><span style="color: #007700">(</span><span style="color: #DD0000">"http://api.example.com/operator.php"</span><span style="color: #007700">, </span><span style="color: #DD0000">"some_method"</span><span style="color: #007700">, array(</span><span style="color: #DD0000">"parameters"</span><span style="color: #007700">));

</span><span style="color: #FF8000">/* 该服务器接受 JSON 打包器 */
</span><span style="color: #0000BB">Yar_Concurrent_Client</span><span style="color: #007700">::</span><span style="color: #0000BB">call</span><span style="color: #007700">(</span><span style="color: #DD0000">"http://api.example.com/operator.php"</span><span style="color: #007700">, </span><span style="color: #DD0000">"some_method"</span><span style="color: #007700">, array(</span><span style="color: #DD0000">"parameters"</span><span style="color: #007700">), </span><span style="color: #DD0000">"callback"</span><span style="color: #007700">, </span><span style="color: #0000BB">NULL</span><span style="color: #007700">, array(</span><span style="color: #0000BB">YAR_OPT_PACKAGER </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"json"</span><span style="color: #007700">));

</span><span style="color: #FF8000">/* 自定义超时时间 */
</span><span style="color: #0000BB">Yar_Concurrent_Client</span><span style="color: #007700">::</span><span style="color: #0000BB">call</span><span style="color: #007700">(</span><span style="color: #DD0000">"http://api.example.com/operator.php"</span><span style="color: #007700">, </span><span style="color: #DD0000">"some_method"</span><span style="color: #007700">, array(</span><span style="color: #DD0000">"parameters"</span><span style="color: #007700">), </span><span style="color: #DD0000">"callback"</span><span style="color: #007700">, </span><span style="color: #0000BB">NULL</span><span style="color: #007700">, array(</span><span style="color: #0000BB">YAR_OPT_TIMEOUT </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">1000</span><span style="color: #007700">));

</span><span style="color: #FF8000">/* 此时请求尚未发送 */</span></code></pre></div>
   </div>

  </div>
 </div>


 <div class="refsect1 seealso" id="refsect1-yar-concurrent-client.call-seealso">
  <h3 class="title">参见</h3>
  <ul class="simplelist">
   <li><span class="methodname"><a href="yar-concurrent-client.loop.php" class="methodname" rel="rdfs-seeAlso">Yar_Concurrent_Client::loop()</a> - 发送并等待所有已注册的调用</span></li>
   <li><span class="methodname"><a href="yar-concurrent-client.reset.php" class="methodname" rel="rdfs-seeAlso">Yar_Concurrent_Client::reset()</a> - 清除所有已注册的调用</span></li>
  </ul>
 </div>


</div><?php manual_footer($setup); ?>