2024-06-07

PHP异步编程:协程与传统同步编程的性能差异

协程作为 php 中的异步编程技术,相较传统同步编程,在处理大量并发请求时具有显著性能优势。实战案例显示,协程爬虫的执行时间约为同步爬虫的三分之一,这归因于协程的非阻塞性质,使其可以在不阻塞当前线程的情况下执行并发操作。

PHP异步编程:协程与传统同步编程的性能差异

PHP异步编程:协程与传统同步编程的性能差异

引言

PHP中协程是一种异步编程技术,它允许在不阻塞当前线程的情况下执行并发操作。与传统同步编程相比,协程在处理大量并发请求时具有显著的性能优势。本文将通过代码示例和实战案例,展示协程与同步编程之间的性能差异。

协程用法

协程可以使用 go 关键字创建,其语法如下:

go (function () {
  // 协程代码
});
登录后复制

协程将被调度到一个独立的线程中执行,在执行期间可以通过 yield 关键字将控制权让回主程序。

同步编程用法

传统同步编程通常使用 curl_multi 扩展或 PHP 内置的 stream_context_create 函数来处理并发请求。

实战案例:爬取大型网站

为了比较协程和同步编程的性能,我们编写了两个爬虫来爬取一个大型网站,并记录每个爬虫的执行时间。

协程爬虫

use Clue/React/Buzz/Browser;
use React/EventLoop/Factory;

$loop = Factory::create();
$browser = new Browser($loop);

$urls = ['https://example.com', 'https://example.com/page2', 'https://example.com/page3'];

$loop->addTimer(0, function () use ($browser, $urls) {
  foreach ($urls as $url) {
    $browser->get($url)->then(function () use ($url) {
      echo "Fetched $url" . PHP_EOL;
    });
  }
});

$loop->run();
登录后复制

同步爬虫

$ch = curl_multi_init();
$handles = [];

foreach ($urls as $url) {
  $chHandle = curl_init($url);
  curl_multi_add_handle($ch, $chHandle);
  $handles[] = $chHandle;
}

$running = null;
do {
  curl_multi_exec($ch, $running);
  curl_multi_select($ch, 0.1);
} while ($running);

foreach ($handles as $chHandle) {
  echo "Fetched " . curl_getinfo($chHandle, CURLINFO_EFFECTIVE_URL) . PHP_EOL;
}

curl_multi_close($ch);
登录后复制

性能差异

执行这两个爬虫后,我们观察到协程爬虫明显快于同步爬虫。协程爬虫的执行时间约为同步爬虫的三分之一。

这种性能差异是由协程的非阻塞性质造成的。协程可以在不阻塞当前线程的情况下执行并发操作,而同步编程则必须等待每个请求完成。

结论

协程为 PHP 中的异步编程提供了一种高效且可扩展的解决方案。与传统同步编程相比,协程在处理大量并发请求时具有显著的性能优势。

以上就是PHP异步编程:协程与传统同步编程的性能差异的详细内容,更多请关注php中文网其它相关文章!

https://www.php.cn/faq/823057.html

发表回复

Your email address will not be published. Required fields are marked *