Làm cách nào để sử dụng async trong PHP?

Lập trình bất đồng bộ, ta hiểu theo nghĩa đen, có thể hiểu là code được thực thi không đồng bộ. Lập trình không đồng bộ có thể được quy cho bốn chế độ. gọi lại, trình lắng nghe sự kiện, xuất bản/đăng ký, chế độ lời hứa. Hai chế độ mà chúng ta quen thuộc nhất là gọi lại và xử lý sự kiện, đưa ra hai ví dụ javascript đơn giản nhất, ajax và liên kết sự kiện nhấp chuột

$.getJSON("uri", params, function(result) {
do_something_with_data(result);
});
$("#id").click(function(){
do_something_when_user_click_id();
});

Đặc điểm chung của 2 ví dụ trên là hàm này được truyền dưới dạng tham số cho hàm khác. Hàm được truyền có thể được gọi là một bao đóng và việc thực thi bao đóng phụ thuộc vào thời điểm hàm cha gọi nó

Ưu điểm và nhược điểm Lập trình không đồng bộ có những ưu điểm sau
  • Tách rời, bạn có thể tách logic nghiệp vụ phức tạp thành nhiều logic xử lý sự kiện thông qua liên kết sự kiện
  • Đồng thời, kết hợp với IO không chặn, cho phép truy cập đồng thời vào IO trong một quy trình (hoặc luồng);
  • Hiệu quả, trong trường hợp không có cơ chế sự kiện, chúng ta thường cần sử dụng tính năng bỏ phiếu để xác định xem một sự kiện có được tạo hay không
Nhược điểm của lập trình không đồng bộ

Nhược điểm của lập trình không đồng bộ thực sự rõ ràng - lồng gọi lại. Tôi tin rằng một số người đã gặp phải cảnh như vậy khi viết ajax

$.getJSON("uri", params, function(result_1) {
$.getJSON("uri", result_1, function(result_2) {
$.getJSON("uri", result_2, function(result_3) {
do_something_with_data(result_3);
});
});;
});

Điều này thường được thực hiện do các vấn đề phụ thuộc vào dữ liệu, yêu cầu ajax thứ hai phụ thuộc vào việc trả lại yêu cầu đầu tiên và ajax thứ ba phụ thuộc vào yêu cầu thứ hai. Điều này gây ra lồng gọi lại sâu và khả năng đọc mã giảm đáng kể. Mặc dù có một số khung có thể giải quyết các vấn đề như vậy thông qua một số mẫu, nhưng khả năng đọc mã vẫn kém hơn nhiều so với cách viết đồng bộ

Một nhược điểm khác của lập trình không đồng bộ là quá trình viết và gỡ lỗi phức tạp hơn. Đôi khi bạn không biết khi nào các hàm của mình sẽ được gọi và thứ tự chúng được gọi. Và chúng ta đã quen với lập trình nối tiếp đồng bộ hơn

Tuy nhiên, tôi tin rằng một khi bạn bắt đầu sử dụng lập trình bất đồng bộ, bạn sẽ thích cách tiếp cận này vì nó sẽ mang lại cho bạn nhiều tiện ích hơn

Tổng quan về lập trình bất đồng bộ PHP

Trong ngôn ngữ php, việc sử dụng bất đồng bộ không nhiều như trong javascript. Lý do chính là php thường hoạt động trong môi trường web, nhận yêu cầu -> đọc dữ liệu -> tạo trang, bản chất có vẻ là nối tiếp. Quá trình;

Chế độ lập trình không đồng bộ trong 4 trong javascript có thể được thực hiện trong php

array_walk($arr, function($key, $value){
$value += 1;
});
print_r($arr);

Trong trường hợp gọi lại, trong hầu hết các trường hợp, mã vẫn được thực thi tuần tự (thứ tự array_walk->print_r). Ý nghĩa của hàm gọi lại là người qua đường có thể gọi hàm gọi lại để xử lý dữ liệu, có ưu điểm là cung cấp khả năng mở rộng và tách rời tốt hơn. Ta có thể hiểu callback function này như một formatter xử lý dữ liệu giống nhau. Khi tôi vượt qua bộ lọc json, kết quả trả về có thể là chuỗi nén json, khi tôi vượt qua bộ lọc xml. Kết quả trả về có thể là một chuỗi xml (ý tưởng hơi đa hình)

Giám sát sự kiện (bộ đếm thời gian, sự kiện thời gian).
$loop = React\EventLoop\Factory::create();
$loop->addPeriodicTimer(5, function () {
$memory = memory_get_usage() / 1024;
$formatted = number_format($memory, 3).'K';
echo "Current memory usage: {$formatted}\n";
});

$loop->run();

Trình xử lý sự kiện không được sử dụng nhiều trong PHP, nhưng không phải không có, chẳng hạn như pcntl_signal() lắng nghe tín hiệu hệ điều hành và theo dõi các sự kiện IO khác. Ví dụ trên là một trình lắng nghe các sự kiện sự kiện và chức năng gọi lại được thực thi cứ sau 5 giây

Trong bốn chế độ không đồng bộ, ứng dụng giám sát sự kiện có ý nghĩa hơn. Tuy nhiên, hãy xem một ví dụ đồng bộ. Đoạn mã sau được sử dụng để gửi yêu cầu tới Yahoo và Google (một trang web không tồn tại). Quá trình đồng bộ hóa được viết bằng cách yêu cầu Yahoo hoặc Google trước và chờ yêu cầu kết thúc trước khi yêu cầu khác

$http = new HTTP(); 
echo $http->get( 'http://www.yahoo.com' );
echo $http->get( 'http://www.google.com' );

Xử lý dựa trên sự kiện có thể như thế này

$http = new HTTP(); 
$http->get ( 'www.yahoo.com' );
$http->get ( 'www.bing.com' );
$http->on('response', function($response){
echo $response . PHP_EOL;
});
$http->run();

Viết không đồng bộ cho phép chúng tôi xử lý nhiều giao dịch cùng một lúc. Ai xử lý trước thì xử lý ai xử lý trước. Một máy khách http không đồng bộ đơn giản nhìn thấy. không đồng bộ-http-php

PHP có một số tiện ích mở rộng và gói cung cấp hỗ trợ cho việc này

Tiện ích mở rộng libevent ex-libevent, dựa trên thư viện libevent, hỗ trợ các sự kiện thời gian và IO không đồng bộ

Tiện ích mở rộng sự kiện ngoài sự kiện, hỗ trợ cho các sự kiện thời gian và IO không đồng bộ

Tiện ích mở rộng libev Ext-libev, dựa trên thư viện libev, hỗ trợ các sự kiện thời gian và IO không đồng bộ

Tiện ích mở rộng ex-eio eio, dựa trên thư viện eio, hỗ trợ hoạt động của đĩa không đồng bộ

Ext-swoole swoole mở rộng, hỗ trợ IO không đồng bộ và thời gian, máy chủ socket không đồng bộ dễ viết, khuyến nghị

Gói phản ứng gói-phản ứng cung cấp lập trình không đồng bộ toàn diện, bao gồm IO, sự kiện thời gian, đĩa IO, v.v.

Package-worker gói worker, tương tự như swoole, php

Theo dõi công khai.
$lookup = new nsqphp\Lookup\Nsqlookupd;
$nsq = new nsqphp\nsqphp($lookup);
$nsq->subscribe('mytopic', 'somechannel', function($msg) {
echo $msg->getId() . "\n";
})->run();
Lời hứa.
function getJsonResult()
{
return queryApi()
->then(
// Transform API results to an object
function ($jsonResultString) {
return json_decode($jsonResultString);
},
// Transform API errors to an exception
function ($jsonErrorString) {
$object = json_decode($jsonErrorString);
throw new ApiErrorException($object->errorMessage);
}
);
}

// Here we provide no rejection handler. If the promise returned has been
// rejected, the ApiErrorException will be thrown
getJsonResult()
->done(
// Consume transformed object
function ($jsonResultObject) {
// Do something with $jsonResultObject
}
);

Ý nghĩa của chế độ lời hứa là tách rời. Vấn đề lồng nhau gọi lại không đồng bộ mà chúng tôi vừa đề cập có thể được giải quyết bằng lời hứa. Nguyên tắc là trong mỗi lần truyền hàm gọi lại, bạn sẽ nhận được một đối tượng promie và đối tượng này có một phương thức then, phương thức đó vẫn có thể trả về một đối tượng lời hứa, bạn có thể đạt được sự tách biệt của nhiều lớp bằng cách truyền đối tượng lời hứa. . Code cụ thể cần nghiên cứu mã nguồn hơi khó hiểu, PHP nên đọc. hứa

Nguyên tắc thực hiện không đồng bộ

Việc triển khai không đồng bộ thường có các sự kiện trình nghe vòng lặp. Ví dụ, chúng ta thấy $loop->run() ở trên, đây thực sự là một vòng lặp vô hạn. Khi sự kiện được lắng nghe, trình xử lý tương ứng được gọi. Bác nào rành về pcntl thì phải biết khai báo (tick=1), thực chất nó cũng là một vòng lặp, nghĩa là mỗi lần thực hiện code dòng tick kiểm tra xem có tín hiệu nào chưa xử lý không. Mặc dù sẽ có một vòng lặp chặn (trong hầu hết các trường hợp, khai báo là trường hợp đặc biệt), nhưng chúng ta có thể lắng nghe nhiều sự kiện và có thể dừng vòng lặp trong quá trình xử lý sự kiện nhất định, để truy cập IO không đồng bộ đồng thời, thậm chí nhiều hơn

Một mã giả như sau

________số 8_______

Toàn bộ bài viết thực sự không đủ chi tiết. Tốt nhất, nó là một bài viết giới thiệu, là một bản tóm tắt về lập trình không đồng bộ của tôi. Học lập trình bất đồng bộ không đơn giản như học một ngôn ngữ hay mẫu thiết kế. Nó đòi hỏi chúng ta phải thay đổi cách lập trình truyền thống. IO không đồng bộ cũng cao hơn một chút đối với người học. Trước tiên, bạn phải làm quen với các hoạt động IO đồng bộ hoặc thậm chí bạn cần hiểu một số phân tích cú pháp giao thức

Tôi hy vọng nội dung trên sẽ giúp một số người mới bắt đầu. Nếu có gì sai trong văn bản, tôi vẫn hy vọng sửa chữa nó

Làm cách nào để sử dụng hàm async trong PHP?

Async cũng được sử dụng để thực thi mã nhanh hơn và cho phép chúng tôi thực thi nhiều tác vụ. .
Hàm Async trong PHP. .
cú pháp. .
cú pháp. .
chức năng chờ đợi (). Chức năng chờ đợi cho phép chúng tôi đợi cho đến khi async trả về. .
Lời hứa. Một lời hứa đại diện cho một kết quả duy nhất của một hoạt động không đồng bộ

PHP có thể chạy không đồng bộ không?

. Vì quá trình xử lý không đồng bộ cho phép quản lý và hoàn thành nhiều tác vụ cùng một lúc, bạn có thể tăng đáng kể hiệu suất PHP bằng cách sử dụng nó thay vì PHP đồng bộ.

Làm cách nào để thực hiện cuộc gọi không đồng bộ trong PHP?

Bạn không thể thực hiện quy trình không đồng bộ trực tiếp thông qua php, nhưng bạn có thể thực hiện quy trình gián tiếp thông qua cơ chế lập kế hoạch hệ thống . Bạn có thể sử dụng crontab. Nếu bạn gửi một quy trình tới crontab, nó có thể lên lịch cho bạn.

PHP có async đang chờ không?

Chúng tôi có mô hình Async trong PHP cho phép chúng tôi thực hiện nhiều tác vụ cùng một lúc. Nó làm cho việc thực thi mã nhanh hơn và cũng tăng hiệu suất. Trong PHP chúng ta có thể sử dụng gói Spatie để tận dụng tính năng async