Hướng dẫn dùng php async trong PHP
What is asyncChắc hẳn bạn đã nghe tới cái khác niệm lập trình đồng bộ (synchronous) và lập trình bất đồng bộ (asynchronous), gọi tắt là sync và async. Show Lập trình đồng bộ tức là các dòng code được thực hiện tuần tự, đoạn code ở dưới phải đợi cho đến khi đoạn code ở trên kết thúc. Còn đối với xử lý bất đồng bộ thì đoạn code ở dưới có thể chạy khi mà đoạn code ở trên chưa thực thi xong. Hai function được gọi theo thứ tự, nhưng function được gọi sau không phải chờ
function được gọi trước kết thúc, mà có thể thực hiện gần như đồng thời. Các bạn có thể quen thuộc với kiểu lập trình này ở JS qua việc sử dụng Có thể kể đến một số ứng dụng của async programming như:
Async in PHPĐa số người ta viết PHP code theo cách đồng bộ. Tuy nhiên cũng có khá nhiều thư viện hỗ trợ lập trình async trong PHP như amphp, ReactPHP, Swoole, Guzzle, hay thậm chí ext-curl của PHP và gần đây là PHP Fibers. Trong loạt bài viết lần này mình sẽ giới thiệu và thực hành một số use case bằng các thư viện trên. Bắt đầu với use case đơn giản. Request đồng thời nhiều HTTP requests. Giả sử bạn muốn lấy data từ 1 list urls, và việc xử lý data của các url này là độc lập với nhau, thay vì phải đợi request và xử lý từng url thì chúng ta có thể tăng tốc bằng cách request đồng thời. Trước hết, ta sẽ giả lập response trả về bằng 1 đoạn script đơn giản sau (nhận request, sleep random từ 1 - 5 giây và trả về thông tin thời gian bắt đầu request, thời gian kết thúc):
Using curl_multi_* functionsCode sẽ trông như thế này, tham khảo ví dụ từ php.net:
Chạy và đo thời gian:
Các bạn có thể thấy các request được thực hiện bất đồng bộ (response trả về không theo thứ tự url index), gần như là đồng thời và thời gian tổng cả cũng chỉ là 5.034s, trong khi nếu thực hiện chạy đồng bộ lấy từng url thì thời gian ít nhất cần để chạy đó là 2+3+3+4+5=17s. Using stil/curl-easystil/curl-easy là một thư viện nhỏ nhằm mục đích đơn giản hoá API khi làm việc với Ngoài việc support HTTP request như thông thường (tức là request url và đợi kết quả trả về), thư viện này còn support non-blocking request (sử dụng event và loop ) và concurrent requests (sử dụng request queue...)Ví dụ đơn giản về non-blocking request:
Đoạn code thực hiện:
Đối với nhiều request, thư viện cũng support gọi nhiều request đồng thời:
Kết quả cho thấy các request được thực hiện gần như đồng thời, không theo thứ tự:
Các bạn có thể xem thêm các ví dụ khác, cách xử lý lỗi, đã được tài liệu rất chi tiết tại github repo. Using GuzzleGuzzle là một HTTP Client khá phổ biến, có hỗ trợ thực hiện async requests, với API linh hoạt và đơn giản. Ví dụ 1:
Ở đây có 2 cách handle requests:
Tuy nhiên, lưu ý là do đã handle từng promise thông qua
Hoặc có thể thay
Lưu ý tiếp theo là nếu handle promise thông qua
Promise object được implements theo Promises/A+ spec, và nằm trong thư viện có thể dùng riêng biệt Guzzle promises. Trường hợp không xác định được tổng số lượng requests cần thực hiện, chúng ta có thể sử dụng Pool object để gửi tối đa X requests mỗi lần:
Ví dụ trên ta có tổng 9 requests tạo bằng Tuy nhiên, bạn có thể thấy là requests sẽ không được thực hiện cho đến khi bạn gọi các function Để dễ hình dung hơn, bạn có thể thử đoạn code dưới đây:
Nếu không gọi
To be continued
Trên đây là một ví dụ nhỏ về ứng dụng của async programming trong PHP. Trong bài tiếp theo chúng ta sẽ cùng tìm hiểu về thư viện |