Download the PHP package kawakami-o3/co without Composer
On this page you can find all versions of the php package kawakami-o3/co. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download kawakami-o3/co
More information about kawakami-o3/co
Files in kawakami-o3/co
Package co
Short Description Asynchronous cURL executor simply based on resource and Generator
License MIT
Informations about the package co
Co

Asynchronous cURL executor simply based on resource and Generator
| PHP | :question: | Feature Restriction |
|---|---|---|
| 7.0~ | :smile: | Full Support |
| 5.5~5.6 | :anguished: | Generator is not so cool |
| ~5.4 | :boom: | Incompatible |
The requests are executed as parallelly as possible :smile:
Note that there is only 1 process and 1 thread.
Table of Contents
- Installing
- API
- Co::wait()
- Co::async()
- Co::isRunning()
- Co::any() / Co::race() / Co::all()
- Co::setDefaultOptions() / Co::getDefaultOptions()
- Rules
- Conversion on Resolving
- Exception-safe or Exception-unsafe Priority
- Pseudo-sleep for Each Coroutine
- Comparison with Generators of PHP7.0+ or PHP5.5~5.6
- Appendix
- Timing Charts
Installing
Install via Composer.
And require Composer autoloader in your scripts.
API
Co::wait()
Wait for all the cURL requests to complete.
The options will override static defaults.
Arguments
(mixed)$value
Any values to be parallelly resolved.(array<string, mixed>)$options
Associative array of options.
| Key | Default | Description |
|---|---|---|
throw |
true |
Whether to throw or capture CURLException or RuntimeException on top-level. |
pipeline |
false |
Whether to use HTTP/1.1 pipelining. At most 5 requests for the same destination are bundled into single TCP connection. |
multiplex |
true |
Whether to use HTTP/2 multiplexing. All requests for the same destination are bundled into single TCP connection. |
autoschedule |
false |
Whether to use automatic scheduling by CURLMOPT_MAX_TOTAL_CONNECTIONS. |
interval |
0.002 |
curl_multi_select() timeout seconds. 0 means real-time observation. |
concurrency |
6 |
Limit of concurrent TCP connections. 0 means unlimited.The value should be within 10 at most. |
Throwablethose are not extended fromRuntimeException, such asErrorExceptionLogicExceptionare not captured. If you need to capture them, you have to write your own try-catch blocks in your functions.- HTTP/1.1 pipelining can be used only if the TCP connection is already established and verified that uses keep-alive session. It means that the first bundle of HTTP/1.1 requests CANNOT be pipelined. You can use it from second
yieldinCo::wait()call. - To use HTTP/2 multiplexing, you have to build PHP with libcurl 7.43.0+ and
--with-nghttp2. - To use
autoschedule, PHP 7.0.7 or later is required.
When autoschedule Disabled:
curl_multi_add_handle()call can be delayed.concurrencycontrolling withpipeline/multiplexCANNOT be correctly driven. You should set higherconcurrencyin those cases.
When autoschedule Enabled:
curl_multi_add_handle()is always immediately called.CURLINFO_TOTAL_TIMECANNOT be correctly calculated. "Total Time" includes the time waiting for other requests are finished.
The details of CURLIFNO_*_TIME timing charts are described at the bottom of this page.
Return Value
(mixed)
Resolved values; in exception-safe context, it may contain...
CURLExceptionwhich has been raised internally.RuntimeExceptionwhich has been raised by user.
Exception
- Throws
CURLExceptionorRuntimeExceptionin exception-unsafe context.
Co::async()
Execute cURL requests along with Co::wait() call, without waiting resolved values.
The options are inherited from Co::wait().
This method is mainly expected to be used ...
- When you are not interested in responses.
- In
CURLOPT_WRITEFUNCTIONorCURLOPT_HEADERFUNCTIONcallbacks.
Arguments
(mixed)$value
Any values to be parallelly resolved.(mixed)$throw
OverridesthrowinCo::wait()options when you passedtrueorfalse.
Return Value
(null)
Exception
CURLExceptionorRuntimeExceptioncan be thrown in exception-unsafe context.
Note that you CANNOT capture top-level exceptions unless you catch outside ofCo::wait()call.
Co::isRunning()
Return if Co::wait() is running().
With this check, you can safely call Co::wait() or Co::async().
Co::any()
Co::race()
Co::all()
Return a Generator that resolves with specific value.
| Family | Return Value | Exception |
|---|---|---|
Co::any() |
First Success | AllFailedException |
Co::race() |
First Success | First Failure |
- Jobs CANNOT be canceled.
Incomplete jobs remain even ifCo::any()orCo::race()is resolved. Co::all(...)is just a wrapper of(function () { return yield ...; })().
It should be only used withCo::race()orCo::any().
Co::setDefaultOptions()
Co::getDefaultOptions()
Overrides/gets static default settings.
Rules
Conversion on Resolving
The all yielded/returned values are resolved by the following rules.
Yielded values are also resent to the Generator.
The rules will be applied recursively.
| Before | After |
|---|---|
| cURL resource | curl_multi_getconent() result or CURLException |
| Array | Array (with resolved children) or RuntimeException |
| Generator Closure Generator |
Return value (after all yields done) or RuntimeException |
"Generator Closure" means Closure that contains yield keywords.
Exception-safe or Exception-unsafe Priority
Context in Generator
Exception-unsafe context by default.
The following yield statement specifies exception-safe context.
This is equivalent to:
Context on Co::wait()
Exception-unsafe context by default.
The following setting specifies exception-safe context.
This is equivalent to:
Context on Co::async()
Contexts are inherited from Co::wait().
The following setting overrides parent context as exception-safe.
The following setting overrides parent context as exception-unsafe.
Pseudo-sleep for Each Coroutine
The following yield statements delay the coroutine processing:
Comparison with Generators of PHP7.0+ or PHP5.5~5.6
return Statements
PHP 7.0+:
PHP 5.5~5.6:
Although experimental aliases Co::RETURN_ Co::RET Co::RTN are provided,
Co::RETURN_WITH is recommended in terms of readability.
yield Statements with Assignment
PHP 7.0+:
PHP 5.5~5.6:
finally Statements
Be careful that return triggers finally while yield Co::RETURN_WITH => does not.
Appendix
Timing Charts
Note that S is equal to Q when autoschedule is disabled.
Basic
| ID | When |
|---|---|
| Q | curl_multi_exec() immediately after curl_multi_add_handle() called |
| S | Processing started actually |
| DNS | DNS resolution completed |
| TCP | TCP connection established |
| TLS | TLS/SSL session established |
| HS | All HTTP request headers sent |
| BS | Whole HTTP request body sent |
| HR | All HTTP response headers received |
| BR | Whole HTTP response body received |
| Constant | Time |
|---|---|
| CURLINFO_NAMELOOKUP_TIME | DNS - S |
| CURLINFO_CONNECT_TIME | TCP - S |
| CURLINFO_APPCONNECT_TIME | TLS - S |
| CURLINFO_PRETRANSFER_TIME | HS - S |
| CURLINFO_STARTTRANSFER_TIME | HR - S |
| CURLINFO_TOTAL_TIME | BR - Q |
With Redirections by CURLOPT_FOLLOWLOCATION
| ID | When |
|---|---|
| Q | curl_multi_exec() immediately after curl_multi_add_handle() called |
| S | Processing started actually |
| DNS(1) | DNS resolution completed |
| TCP(1) | TCP connection established |
| TLS(1) | TLS/SSL session established |
| HS(1) | All HTTP request headers sent |
| BS(1) | Whole HTTP request body sent |
| HR(1) | All HTTP response headers received |
| DNS(2) | DNS resolution completed |
| TCP(2) | TCP connection established |
| TLS(2) | TLS/SSL session established |
| HS(2) | All HTTP request headers sent |
| BS(2) | Whole HTTP request body sent |
| HR(2) | All HTTP response headers received |
| BR(2) | Whole HTTP response body received |
| Constant | Time |
|---|---|
| CURLINFO_REDIRECT_TIME | HR(1) - Q |
| CURLINFO_NAMELOOKUP_TIME | DNS(2) - HR(1) |
| CURLINFO_CONNECT_TIME | TCP(2) - HR(1) |
| CURLINFO_APPCONNECT_TIME | TLS(2) - HR(1) |
| CURLINFO_PRETRANSFER_TIME | HS(2) - HR(1) |
| CURLINFO_STARTTRANSFER_TIME | HR(2) - HR(1) |
| CURLINFO_TOTAL_TIME | BR(2) - Q |