Examples of using curl_multi functions in php _ PHP Tutorial

Source: Internet
Author: User
Example of using the curl_multi series functions in php. Examples of using curl_multi functions in php I believe that many people have a headache with curl_multi functions that are not detailed in the php Manual. they have few documents, the example is simple, so that you do not have the curl_multi series functions in php.

I believe that many people have a headache for the curl_multi family of functions that are not detailed in the php Manual. they have fewer documents, and the examples are even simpler for you to learn from. I have also found many web pages, none of them have seen a complete application example.

  • Curl_multi_add_handle
  • Curl_multi_close
  • Curl_multi_exec
  • Curl_multi_getcontent
  • Curl_multi_info_read
  • Curl_multi_init
  • Curl_multi_remove_handle
  • Curl_multi_select

Generally, when you want to use these functions, it is obvious that you need to request multiple URLs at the same time, instead of one request in sequence. Otherwise, it is better to call curl_exec cyclically.

The steps are summarized as follows:

Step 1: Call curl_multi_init
Step 2: call curl_multi_add_handle cyclically
Note that the second parameter of curl_multi_add_handle is the sub-handle from curl_init.
Step 3: continuously call curl_multi_exec
Step 4: call curl_multi_getcontent cyclically to obtain the result as needed
Step 5: call curl_multi_remove_handle and call curl_close for each handle.
Step 6: call curl_multi_close

Here is a simple online search example by dirty (I will explain why dirty later ):

The code is as follows:


/*
Here's a quick and dirty example for curl-multi from PHP, tested on PHP 5.0.0RC1 CLI/FreeBSD 5.2.1
*/

$ Connomains = array (
"Http://www.baidu.com /",
"Http://www.google.com /",
"Http://www.jb51.net /"
);
$ Mh = curl_multi_init ();

Foreach ($ connomains as $ I => $ url ){
$ Conn [$ I] = curl_init ($ url );
Curl_setopt ($ conn [$ I], CURLOPT_RETURNTRANSFER, 1 );
Curl_multi_add_handle ($ mh, $ conn [$ I]);
}

Do {$ n = curl_multi_exec ($ mh, $ active);} while ($ active );

Foreach ($ connomains as $ I => $ url ){
$ Res [$ I] = curl_multi_getcontent ($ conn [$ I]);
Curl_close ($ conn [$ I]);
}

Print_r ($ res );

This is almost the same throughout the use process. However, this simple code has a fatal weakness, that is, in the do loop section, it is an endless loop during the whole url request, it can easily cause 100% CPU usage.

Now let's improve it. here we need to use a function named curl_multi_select, which has almost no documentation. Although the C curl Library describes select, the interfaces and usage in php are indeed different from those in C.

Change the do section above to the following:

The code is as follows:


Do {
$ Mrc = curl_multi_exec ($ mh, $ active );
} While ($ mrc = CURLM_CALL_MULTI_PERFORM );
While ($ active and $ mrc = CURLM_ OK ){
If (curl_multi_select ($ mh )! =-1 ){
Do {
$ Mrc = curl_multi_exec ($ mh, $ active );
} While ($ mrc = CURLM_CALL_MULTI_PERFORM );
}
}

Because $ active changes to false only after all url data is accepted, the returned value of curl_multi_exec is used to determine whether there is any data. when there is data, curl_multi_exec is called continuously, if no data is available for the moment, the select phase is started, and the new data can be awakened to continue execution. The advantage here is that there is no unnecessary CPU consumption.

In addition, there are some details that may sometimes be encountered:

Control the timeout time of each request. use curl_setopt before curl_multi_add_handle:

The code is as follows:

Curl_setopt ($ ch, CURLOPT_TIMEOUT, $ timeout );

Determine whether the request times out or other errors. use curl_error ($ conn [$ I]) before curl_multi_getcontent.

I believe that many people have a headache for the curl_multi family of functions that are not detailed in the php Manual. they have fewer documents, and the examples are even simpler...

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.