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+
}
最后更新于 2019-04-30 08:41:27 并被添加「PHP yield Generator 处理大数组」标签,已有 647 位童鞋阅读过。
此处评论已关闭