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. |
Throwable
those 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 |