Example #1
0
/**
 * 加入dht网络
 * @return void
 */
function join_dht()
{
    global $table, $bootstrap_nodes;
    //write(date('Y-m-d H:i:s', time()) . " join_dht\n");
    // 循环操作
    foreach ($bootstrap_nodes as $node) {
        // 将node域名解析为IP地址, 并发送find_node请求
        find_node(array(gethostbyname($node[0]), $node[1]));
    }
}
Example #2
0
*/
function &find_node($key, &$node)
{
    //xdebug_debug_zval('node');
    $item =& $node[$key];
    //这里的&不能省略,原因如下:
    /*这里如果省去&,$item和$node[$key]虽然指向同一个zval,但是return的时候会有问题,因为php引用赋值的一个特点,如下。
      $a = 1; $b = $a; $c = &$b; 这里第三步的时候,会复制一个zval(int 1),$c和$b指向他,而$a还是指向最开始的那个zval。
      好了,当return $item; $item = &find_node()的时候,由于$item不是一个引用,便会复制一个zval,函数中的item和全局变量item都指向他,但是函数结束后,function中的symbol全部被unset,这时刚才创建的zval便只剩下一个引用refcount=1,所以他的is_ref会被设为0。
      */
    //xdebug_debug_zval('node');
    //xdebug_debug_zval('item');
    return $item;
}
$tree = array('one', 'two', 'three', 'four');
$item =& find_node(3, $tree);
//xdebug_debug_zval('item');
//xdebug_debug_zval('tree');
$item = 'new value';
var_dump($tree[3]);
/*
函数返回引用的时候,必须在定义和使用的时候都加上&,这点和参数传入引用不同
*/
function &func()
{
    static $static = 0;
    $static++;
    return $static;
}
$var1 =& func();
//xdebug_debug_zval('var1');
Example #3
0
/**
 * 加入dht网络
 * @return void
 */
function join_dht()
{
    global $table, $bootstrap_nodes;
    // 循环操作
    foreach ($bootstrap_nodes as $node) {
        // 将node域名解析为IP地址, 并发送find_node请求
        find_node(array(gethostbyname($node[0]), $node[1]));
    }
}
Example #4
0
<?php

function read_xml($skip_white)
{
    $xml = file_get_contents(__DIR__ . "/skipwhite.xml");
    $parser = xml_parser_create();
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, $skip_white);
    xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
    $array = array();
    $index = array();
    xml_parse_into_struct($parser, $xml, $array, $index);
    return $array;
}
function find_node($array, $node)
{
    foreach ($array as $key => $val) {
        if ($val["tag"] == $node) {
            return $val;
        }
    }
    return array();
}
// WITH XML_OPTION_SKIP_WHITE=0 WORKS FINE
$array = read_xml(0);
$node = find_node($array, "query");
print_r($node);
// WITH XML_OPTION_SKIP_WHITE=1 FAILS
$array = read_xml(1);
$node = find_node($array, "query");
print_r($node);
function &find_node(&$node, $nodeid)
{
    if ($node['id'] == $nodeid) {
        return $node;
    }
    if (isset($node['left'])) {
        $res =& find_node($node['left'], $nodeid);
        if (!is_array($res)) {
            $res =& find_node($node['right'], $nodeid);
        }
        return $res;
    }
    return $nodeid;
}