Download the PHP package mpyw/co without Composer
On this page you can find all versions of the php package mpyw/co. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
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. |
Throwable
which are not extended fromRuntimeException
, such asError
Exception
LogicException
are 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
yield
inCo::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.concurrency
controlling withpipeline
/multiplex
CANNOT be correctly driven. You should set higherconcurrency
in those cases.
When autoschedule
Enabled:
curl_multi_add_handle()
is always immediately called.CURLINFO_TOTAL_TIME
CANNOT 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...
CURLException
which has been raised internally.RuntimeException
which has been raised by user.
Exception
- Throws
CURLException
orRuntimeException
in 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_WRITEFUNCTION
orCURLOPT_HEADERFUNCTION
callbacks.
Arguments
(mixed)
$value
Any values to be parallelly resolved.(mixed)
$throw
Overridesthrow
inCo::wait()
options when you passedtrue
orfalse
.
Return Value
(null)
Exception
CURLException
orRuntimeException
can 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 |
All versions of co with dependencies
lib-curl Version >=7.20.0
ext-reflection Version *
react/promise Version ^2.4