php yield Generator 处理大数组

https://www.jianshu.com/p/86fefb0aacd9
http://www.laruence.com/2015/05/28/3038.html

yield

让出,返回的意思,返回一个生成器对象,可以被遍历,每次他都返回yield右侧的值并中断在那里
如果你调用生成器的current()方法,将获取到当前值,如果调用send()方法,将改变当前值,并执行到下一个yield后停下来,如果yeild在等号右侧,send()会先改变当前值,然后赋值,如下所示

也就是说,yield的current send方法获取到的总是当前的值,而yield左侧的值如果有send就是是send过去的

function gen()
{
    $ret = (yield 'yield1');
    var_dump($ret); // 2.ret1
    $ret = (yield 'yield2');
    var_dump($ret); // 4.ret2
}
$gen = gen();
var_dump($gen->current());    // 1.yield1
var_dump($gen->send('ret1')); // 3.yield2
var_dump($gen->send('ret2')); // 5.null

function gen()
{
    yield 'foo';
    yield 'bar';
}
$gen = gen();
var_dump($gen->current());         // foo
var_dump($gen->send('something')); // bar
var_dump($gen->next());            // null
var_dump($gen->current());         // null

yield通信

function logger($fileName)
{
    $fileHandle = fopen($fileName, 'a');
    while (true)
    {
        fwrite($fileHandle, yield  . "\n");
    }
}
$logger = logger(__DIR__ . '/log');
$logger->send('Foo');
$logger->send('Bar');

处理大数组

// common方式
// 耗时0.2237251秒
// 内存: 58212.46875K
$t1 = microtime(true);
class common_data
{
    public function data()
    {
        $array = [];
        for ($i = 1; $i <= 1000000; $i++)
        {
            $array[] = 'item_' . $i;
        }
        return $array;
    }
    public function callback($param)
    {
        return $param;
    }
}
$commn = new common_data();
$data  = $commn->data();
foreach ($data as $value)
{
    $commn->callback($value);
}
$t2 = microtime(true);
echo '耗时' . round($t2 - $t1, 7) . '秒' . PHP_EOL;
echo '内存: ' . memory_get_usage() / 1024 . 'K' . PHP_EOL;

// yield方式
// 耗时0.2580891秒
// 内存: 339K
$t1 = microtime(true);
class yield_data
{
    public function data()
    {
        for ($i = 1; $i <= 1000000; $i++)
        {
            $array = 'item_' . $i;
            yield $array;
        }
    }
    public function callback($param)
    {
        return $param;
    }
}
$yield = new yield_data();
$data  = $yield->data();
foreach ($data as $value)
{
    $yield->callback($value);
}
$t2 = microtime(true);
echo '耗时' . round($t2 - $t1, 7) . '秒' . PHP_EOL;
echo '内存: ' . memory_get_usage() / 1024 . 'K' . PHP_EOL;

Generator

Generator implements Iterator {
    public mixed current ( void )//返回当前产生的值
    public mixed key ( void ) //返回当前产生的键
    public void next ( void )//生成器继续执行
    public void rewind ( void ) //重置迭代器,如果迭代已经开始了,这里会抛出一个异常。
    public mixed send ( mixed $value ) //向生成器中传入一个值,当前yield接收值,然后继续执行下一个yield
    public void throw ( Exception $exception )  //向生成器中抛入一个异常
    public bool valid ( void )  //检查迭代器是否被关闭,已被关闭返回 FALSE,否则返回 TRUE
    public void __wakeup ( void ) //序列化回调
    public mixed getReturn ( void )//返回generator函数的返回值,PHP version 7+
}

相关文章

此处评论已关闭