Table of Contents
You can see that it only took
With
In coroutine programming, you may need to automatically execute some tasks and clean up when the coroutine exits. Similar to
Conclusion
Home Backend Development PHP Tutorial Detailed explanation of PHP coroutines: Go + Chan + Defer

Detailed explanation of PHP coroutines: Go + Chan + Defer

Jun 27, 2021 pm 05:01 PM
golang php swoole

Swoole4 provides a powerful CSP# for the PHP language ##Coroutine programming mode. The bottom layer provides 3 keywords, which can easily implement various functions. The PHP coroutine

syntax provided by
  • Swoole4 is borrowed from Golang, and I would like to express my sincere thanks to the GO development team Tribute
  • PHP SwooleCoroutines can complement Golang very well. Golang: static language, rigorous, powerful and good in performance, PHP Swoole: dynamic language, flexible, simple and easy to use
This article is based on
Swoole-4.2. 9 and PHP-7.2.9 version
Keywords

  • go: Create a coroutine
  • chan: Create a channel
  • defer: Delay task, executed when the coroutine exits, first in, last out
This The underlying implementation of

3 functions are all memory operations, without any IO resource consumption. Just like PHPArray is very cheap. You can use it directly if necessary. This is different from socket and file operations. The latter need to apply for ports and file descriptors from the operating system, and reading and writing may cause blocking IO waiting.

Recommended learning: "

PHP Video Tutorial"

Coroutine Concurrency

Use the

go function to make a Functions are executed concurrently. During the programming process, if a certain piece of logic can be executed concurrently, it can be placed in the gocoroutine for execution.

Sequential execution

function test1() 
{
    sleep(1);
    echo "b";
}
    
function test2() 
{
    sleep(2);
    echo "c";
}

test1();
test2();
Copy after login

Execution results:

htf@LAPTOP-0K15EFQI:~$ time php b1.php
bc
real    0m3.080s
user    0m0.016s
sys     0m0.063s
htf@LAPTOP-0K15EFQI:~$
Copy after login

In the above code,

test1 and test2 will be executed sequentially, which requires3It takes seconds to complete the execution.

Concurrent execution

Using

go to create a coroutine can make the two functions test1 and test2 become concurrent executions .

Swoole\Runtime::enableCoroutine();

go(function () 
{
    sleep(1);
    echo "b";
});
    
go(function () 
{
    sleep(2);
    echo "c";
});
Copy after login
Swoole\Runtime::enableCoroutine()The function is to use the stream, sleep,# provided by PHP ##pdo, mysqli, redis and other functions switch from synchronous blocking to asynchronous coroutine IOExecution results:
bchtf@LAPTOP-0K15EFQI:~$ time php co.php
bc
real    0m2.076s
user    0m0.000s
sys     0m0.078s
htf@LAPTOP-0K15EFQI:~$
Copy after login

You can see that it only took

2

seconds to complete the execution.

The sequential execution time is equal to the sum of the execution time of all tasks:
    t1 t2 t3...
  • The concurrent execution time is equal to the execution time of all tasks The maximum value:
  • max(t1, t2, t3, ...)
  • Coroutine communication

With

go

key After the word, concurrent programming is much simpler. At the same time, it brings new problems. If there are 2 coroutines executing concurrently, and another coroutine needs to rely on the execution results of these two coroutines, how to solve this problem? The answer is to use a channel (

Channel

). You can create a channel by using new chan in the Swoole4 coroutine. A channel can be understood as a queue with its own coroutine scheduling. It has two interfaces push and pop:

    push
  • : writes content to the channel, if it is full, it It will enter the waiting state and automatically recover when there is space
  • pop
  • : Read the content from the channel. If it is empty, it will enter the waiting state and automatically recover when there is data
  • Using channels can easily achieve
Concurrency management

.

$chan = new chan(2);

# 协程1
go (function () use ($chan) {
    $result = [];
    for ($i = 0; $i < 2; $i++)
    {
        $result += $chan->pop();
    }
    var_dump($result);
});

# 协程2
go(function () use ($chan) {
   $cli = new Swoole\Coroutine\Http\Client('www.qq.com', 80);
       $cli->set(['timeout' => 10]);
       $cli->setHeaders([
       'Host' => "www.qq.com",
       "User-Agent" => 'Chrome/49.0.2587.3',
       'Accept' => 'text/html,application/xhtml+xml,application/xml',
       'Accept-Encoding' => 'gzip',
   ]);
   $ret = $cli->get('/');
   // $cli->body 响应内容过大,这里用 Http 状态码作为测试
   $chan->push(['www.qq.com' => $cli->statusCode]);
});

# 协程3
go(function () use ($chan) {
   $cli = new Swoole\Coroutine\Http\Client('www.163.com', 80);
   $cli->set(['timeout' => 10]);
   $cli->setHeaders([
       'Host' => "www.163.com",
       "User-Agent" => 'Chrome/49.0.2587.3',
       'Accept' => 'text/html,application/xhtml+xml,application/xml',
       'Accept-Encoding' => 'gzip',
   ]);
   $ret = $cli->get('/');
   // $cli->body 响应内容过大,这里用 Http 状态码作为测试
   $chan->push(['www.163.com' => $cli->statusCode]);
});
Copy after login
Execution results:

htf@LAPTOP-0K15EFQI:~/swoole-src/examples/5.0$ time php co2.php
array(2) {
  ["www.qq.com"]=>
  int(302)
  ["www.163.com"]=>
  int(200)
}

real    0m0.268s
user    0m0.016s
sys     0m0.109s
htf@LAPTOP-0K15EFQI:~/swoole-src/examples/5.0$
Copy after login

go

is used here to create 3 coroutines, coroutines 2 and coroutines Cheng 3 requests the homepages of qq.com and 163.com respectively. Coroutine 1 needs to get the result of Http request. chan is used here to achieve concurrency management.

Coroutine
    1
  • Loop twice to pop the channel, because the queue is empty, it will enter the waiting stateCoroutine
  • 2
  • After the execution of the coroutine 3 is completed, the data will push. The coroutine 1 gets the result and continues to execute
  • Delayed tasks

In coroutine programming, you may need to automatically execute some tasks and clean up when the coroutine exits. Similar to

register_shutdown_function

of PHP, it can be implemented using defer in Swoole4. <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">Swoole\Runtime::enableCoroutine(); go(function () {     echo &quot;a&quot;;     defer(function () {         echo &quot;~a&quot;;     });     echo &quot;b&quot;;     defer(function () {         echo &quot;~b&quot;;     });     sleep(1);     echo &quot;c&quot;; });</pre><div class="contentsignin">Copy after login</div></div>Execution results:

htf@LAPTOP-0K15EFQI:~/swoole-src/examples/5.0$ time php defer.php
abc~b~a
real    0m1.068s
user    0m0.016s
sys     0m0.047s
htf@LAPTOP-0K15EFQI:~/swoole-src/examples/5.0$
Copy after login

Conclusion

Swoole4

The Go Chan Defer provided isPHP It brings a new CSP concurrent programming model. Flexible use of various features provided by Swoole4 can solve the design and development of various complex functions at work.

The above is the detailed content of Detailed explanation of PHP coroutines: Go + Chan + Defer. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

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

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1664
14
PHP Tutorial
1268
29
C# Tutorial
1246
24
PHP and Python: Comparing Two Popular Programming Languages PHP and Python: Comparing Two Popular Programming Languages Apr 14, 2025 am 12:13 AM

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 in Action: Real-World Examples and Applications PHP in Action: Real-World Examples and Applications Apr 14, 2025 am 12:19 AM

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: A Key Language for Web Development PHP: A Key Language for Web Development Apr 13, 2025 am 12:08 AM

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

The Enduring Relevance of PHP: Is It Still Alive? The Enduring Relevance of PHP: Is It Still Alive? Apr 14, 2025 am 12:12 AM

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 and Python: Code Examples and Comparison PHP and Python: Code Examples and Comparison Apr 15, 2025 am 12:07 AM

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.

PHP vs. Other Languages: A Comparison PHP vs. Other Languages: A Comparison Apr 13, 2025 am 12:19 AM

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: Different Paradigms Explained PHP and Python: Different Paradigms Explained Apr 18, 2025 am 12:26 AM

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 vs. Python: Core Features and Functionality PHP vs. Python: Core Features and Functionality Apr 13, 2025 am 12:16 AM

PHP and Python each have their own advantages and are suitable for different scenarios. 1.PHP is suitable for web development and provides built-in web servers and rich function libraries. 2. Python is suitable for data science and machine learning, with concise syntax and a powerful standard library. When choosing, it should be decided based on project requirements.

See all articles