


Comparison of php cURL and Rolling cURL concurrency methods_PHP tutorial
In the process of actual projects or writing your own gadgets (such as news aggregation, commodity price monitoring, price comparison), you usually need to obtain data from a third-party website or API interface. When you need to process a URL queue, in order to improve For performance, you can use the curl_multi_* family of functions provided by cURL to achieve simple concurrency.
This article will discuss two specific implementation methods and make a simple performance comparison of different methods.
1. Classic cURL concurrency mechanism and its existing problems
Classic cURL The implementation mechanism is easy to find online. For example, refer to the following implementation method in the PHP online manual:
function
classic_curl($urls,
$delay)
{
$queue
= curl_multi_init();
$map
= array();
foreach
($urls
as
$url)
{
//
create cURL resources
$ch
= curl_init();
//
set URL and other appropriate options
curl_setopt($ch,
CURLOPT_URL, $url);
curl_setopt($ch,
CURLOPT_TIMEOUT, 1);
curl_setopt($ch,
CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,
CURLOPT_HEADER, 0);
curl_setopt($ch,
CURLOPT_NOSIGNAL, true);
//
add handle
curl_multi_add_handle($queue,
$ch);
$map[$url]
= $ch;
}
$active
= null;
//
execute the handles
do
{
$mrc
= curl_multi_exec($queue,
$active);
}
while
($mrc
== CURLM_CALL_MULTI_PERFORM);
while
($active
> 0 && $mrc
== CURLM_OK) {
if
(curl_multi_select($queue,
0.5) != -1) {
do
{
$mrc
= curl_multi_exec($queue,
$active);
}
while
($mrc
== CURLM_CALL_MULTI_PERFORM);
}
}
$responses
= array();
foreach
($map
as
$url=>$ch)
{
$responses[$url]
= callback(curl_multi_getcontent($ch),
$delay);
curl_multi_remove_handle($queue,
$ch);
curl_close($ch);
}
curl_multi_close($queue);
return
$responses;
}
First push all URLs into the concurrent queue, then execute the concurrent process, wait for all requests to be received, and perform subsequent processing such as data parsing. In the actual processing process, the recipient Due to the influence of network transmission, the content of some URLs will be returned prior to other URLs, but classic cURL concurrency must wait for the slowest URL to return before starting processing. Waiting means CPU idleness and waste. If the URL queue is very short, This kind of idleness and waste is still within the acceptable range, but if the queue is very long, this kind of waiting and waste will become unacceptable.
2. Improved Rolling cURL concurrency method
After careful analysis, it is not difficult to find that there is still room for optimization of classic cURL concurrency. The optimization method is to process a URL request as quickly as possible after it is completed, and wait for other URLs to return while processing, instead of waiting for the slowest interface. Start processing and other work only after returning, thereby avoiding CPU idleness and waste. Without further ado, here is the specific implementation:
function
rolling_curl($urls,
$delay)
{
$queue
= curl_multi_init();
$map
= array();
foreach
($urls
as
$url)
{
$ch
= curl_init();
curl_setopt($ch,
CURLOPT_URL, $url);
curl_setopt($ch,
CURLOPT_TIMEOUT, 1);
curl_setopt($ch,
CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,
CURLOPT_HEADER, 0);
curl_setopt($ch,
CURLOPT_NOSIGNAL, true);
curl_multi_add_handle($queue,
$ch);
$map[(string)
$ch]
= $url;
}
$responses
= array();
do
{
while
(($code
= curl_multi_exec($queue,
$active))
== CURLM_CALL_MULTI_PERFORM) ;
if
($code
!= CURLM_OK) { break;
}
//
a request was just completed -- find out which one
while
($done
= curl_multi_info_read($queue))
{
//
get the info and content returned on the request
$info
= curl_getinfo($done['handle']);
$error
= curl_error($done['handle']);
$results
= callback(curl_multi_getcontent($done['handle']),
$delay);
$responses[$map[(string)
$done['handle']]]
= compact('info',
'error',
'results');
//
remove the curl handle that just completed
curl_multi_remove_handle($queue,
$done['handle']);
curl_close($done['handle']);
}
//
Block for data in / output; error handling is done by curl_multi_exec
if
($active
> 0) {
curl_multi_select($queue,
0.5);
}
}
while
($active);
curl_multi_close($queue);
return
$responses;
}
3. 两种并发实现的性能对比
改进前后的性能对比试验在LINUX主机上进行, 测试时使用的并发队列如下:
http://a.com/item.htm?id=14392877692
http:/a.com/item.htm?id=16231676302
http://a.com/item.htm?id=5522416710
http://a.com/item.htm?id=16551116403
简要说明下实验设计的原则和性能测试结果的格式: 为保证结果的可靠, 每组实验重复20次, 在单次实验中, 给定相同的接口URL集合, 分别测量Classic(指经典的并发机制)和Rolling(指改进后的并发机制)两种并发机制的耗时(秒为单位), 耗时短者胜出(Winner), 并计算节省的时间(Excellence, 秒为单位)以及性能提升比例(Excel. %). 为了尽量贴近真实的请求而又保持实验的简单, 在对返回结果的处理上只是做了简单的正则表达式匹配, 而没有进行其他复杂的操作. 另外, 为了确定结果处理回调对性能对比测试结果的影响, 可以使用usleep模拟现实中比较负责的数据处理逻辑(如提取, 分词, 写入文件或数据库等).
性能测试中用到的回调函数为:
function
callback($data,
$delay)
{
preg_match_all('/
(.+)
/iU',$data,
$matches);
usleep($delay);
return
compact('data',
'matches');
}
When there is no delay in data processing callback: Rolling Curl is slightly better, but the performance improvement effect is not obvious.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics











PHP is a scripting language widely used on the server side, especially suitable for web development. 1.PHP can embed HTML, process HTTP requests and responses, and supports a variety of databases. 2.PHP is used to generate dynamic web content, process form data, access databases, etc., with strong community support and open source resources. 3. PHP is an interpreted language, and the execution process includes lexical analysis, grammatical analysis, compilation and execution. 4.PHP can be combined with MySQL for advanced applications such as user registration systems. 5. When debugging PHP, you can use functions such as error_reporting() and var_dump(). 6. Optimize PHP code to use caching mechanisms, optimize database queries and use built-in functions. 7

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHP is suitable for web development, with simple syntax and high execution efficiency. 2. Python is suitable for data science and machine learning, with concise syntax and rich libraries.

PHP and Python each have their own advantages, and choose according to project requirements. 1.PHP is suitable for web development, especially for rapid development and maintenance of websites. 2. Python is suitable for data science, machine learning and artificial intelligence, with concise syntax and suitable for beginners.

PHP is widely used in e-commerce, content management systems and API development. 1) E-commerce: used for shopping cart function and payment processing. 2) Content management system: used for dynamic content generation and user management. 3) API development: used for RESTful API development and API security. Through performance optimization and best practices, the efficiency and maintainability of PHP applications are improved.

PHP is still dynamic and still occupies an important position in the field of modern programming. 1) PHP's simplicity and powerful community support make it widely used in web development; 2) Its flexibility and stability make it outstanding in handling web forms, database operations and file processing; 3) PHP is constantly evolving and optimizing, suitable for beginners and experienced developers.

PHP is mainly procedural programming, but also supports object-oriented programming (OOP); Python supports a variety of paradigms, including OOP, functional and procedural programming. PHP is suitable for web development, and Python is suitable for a variety of applications such as data analysis and machine learning.

PHP is suitable for web development, especially in rapid development and processing dynamic content, but is not good at data science and enterprise-level applications. Compared with Python, PHP has more advantages in web development, but is not as good as Python in the field of data science; compared with Java, PHP performs worse in enterprise-level applications, but is more flexible in web development; compared with JavaScript, PHP is more concise in back-end development, but is not as good as JavaScript in front-end development.

PHP and Python have their own advantages and disadvantages, and the choice depends on project needs and personal preferences. 1.PHP is suitable for rapid development and maintenance of large-scale web applications. 2. Python dominates the field of data science and machine learning.
