Php đồng bộ

API đồng bộ hóa cho phép bạn giữ một bản sao cục bộ của tất cả nội dung của một không gian được cập nhật thông qua cập nhật delta. Hướng dẫn này sẽ hướng dẫn bạn cách sử dụng API đồng bộ hóa với thư viện máy khách Contentful PHP

Xin lưu ý. API đồng bộ hóa hiện chỉ được hỗ trợ khi sử dụng nhánh master. Khi cố gắng thực hiện các hoạt động liên quan đến đồng bộ hóa trên máy khách được định cấu hình với bất kỳ môi trường nào khác, một \RuntimeException sẽ được đưa ra

Bắt đầu

Sau khi hoàn tất, bạn cần thiết lập ứng dụng khách và tải phiên bản trình quản lý đồng bộ hóa. Đối với hướng dẫn này, chúng tôi sẽ sử dụng một không gian ví dụ

$client = new \Contentful\Delivery\Client($accessToken, $spaceId);
$syncManager = $client->getSynchronizationManager();

Bây giờ chúng tôi có thể bắt đầu đồng bộ hóa ban đầu

$result = $syncManager->startSync();
$items = $result->getItems();

Vì đây là lần đồng bộ đầu tiên nên $items sẽ chứa các mục nhập và nội dung trong không gian của bạn. Việc lưu trữ các đối tượng này vào hệ thống tập tin hoặc cơ sở dữ liệu sẽ do bạn quyết định. Để làm cho nó dễ dàng hơn một chút, tất cả các đối tượng có thể được tuần tự hóa thành JSON và sau đó được xây dựng lại

$json = \json_encode($items[0]);
$object = $client->parseJson($json);

Nếu bạn có một không gian lớn hơn không gian mẫu, quá trình đồng bộ hóa có thể liên quan đến nhiều bản ghi hơn mà không thể xử lý bằng một lệnh gọi API. Để có được tất cả mọi thứ bạn phải kiểm tra $result->isDone()

$result = $syncManager->startSync();

while (!$result->isDone()) {
    $result = $syncManager->continueSync($result);
}

Tiếp tục đồng bộ hóa

Để có thể nhận các thay đổi mới sau này, bạn cần lưu mã thông báo cuối cùng sau khi quá trình đồng bộ ban đầu hoàn tất. Sử dụng mã thông báo này, sau đó bạn có thể tiếp tục đồng bộ hóa ở trạng thái cuối cùng mà bạn đã lưu

$token = $result->getToken();

// Whenever you want to sync again
$result = $syncManager->continueSync($token);

Khi tiếp tục đồng bộ hóa, bạn có thể gặp các phiên bản của các lớp

$result = $syncManager->startSync();
$items = $result->getItems();
0 và
$result = $syncManager->startSync();
$items = $result->getItems();
0. Những thứ này cấp cho bạn quyền truy cập vào một số siêu dữ liệu, quan trọng nhất là ID, để xóa tài nguyên khỏi bộ nhớ cục bộ của bạn

Hoàn thành đồng bộ hóa

Thư viện máy khách cũng cung cấp một cách để thực hiện đồng bộ hóa đầy đủ một cách rõ ràng

foreach ($syncManager->sync() as $result) {
    $items = $result->getItems();
    // Do something...
}

Phương pháp

$result = $syncManager->startSync();
$items = $result->getItems();
2 không thực hiện tất cả các truy vấn cùng một lúc. Trên thực tế, bên trong nó sử dụng
$result = $syncManager->startSync();
$items = $result->getItems();
3 để tạm dừng thực thi và trả về đối tượng kết quả hiện tại. Điều này có nghĩa là vòng lặp
$result = $syncManager->startSync();
$items = $result->getItems();
4 của bạn sẽ phản hồi ngay lập tức và truy vấn tiếp theo sẽ được thực hiện trong lần lặp tiếp theo

Phần kết luận

Với thông tin này, bạn sẽ có thể triển khai giải pháp đồng bộ hóa nội dung của mình với bộ nhớ cục bộ. Nếu bạn gặp bất kỳ rắc rối nào, vui lòng mở một vấn đề

Lập trình không đồng bộ là theo yêu cầu ngày hôm nay. Đặc biệt là trong phát triển web, nơi khả năng đáp ứng của ứng dụng đóng một vai trò rất lớn. Không ai muốn lãng phí thời gian của mình và đợi ứng dụng đóng băng, trong khi bạn đang thực hiện một số truy vấn cơ sở dữ liệu, gửi email hoặc chạy một số tác vụ có thể chạy lâu khác. Người dùng muốn nhận phản hồi cho hành động của họ và họ muốn những phản hồi này ngay lập tức. Khi ứng dụng của bạn trở nên chậm chạp, bạn bắt đầu mất khách hàng của mình. Khi người dùng phải xử lý ứng dụng bị đóng băng, trong hầu hết các trường hợp, người dùng chỉ cần đóng ứng dụng đó và không bao giờ quay lại. Khi giao diện người dùng bị treo theo quan điểm của người dùng, không rõ liệu ứng dụng của bạn có bị hỏng hay nó đang thực hiện một số tác vụ kéo dài và cần một chút thời gian cho nó

khả năng đáp ứng

Các ứng dụng hiện đại có xu hướng phản hồi nhanh, nhưng một số tác vụ có khả năng chạy lâu hoặc chặn các hoạt động chẳng hạn như I/O mạng và hệ thống tệp hoặc truy vấn cơ sở dữ liệu có thể làm chậm ứng dụng của bạn một cách đáng kể. Để ngăn ứng dụng bị chặn bởi các hoạt động này, chúng tôi có thể chạy chúng ở chế độ nền, do đó ẩn độ trễ mà chúng mang lại. Vì vậy, một ứng dụng luôn đáp ứng vì nó có thể tiếp tục với công việc khác, ví dụ: nó có thể trả lại luồng cho giao diện người dùng hoặc phản hồi các sự kiện khác

Song song vs Không đồng bộ

Hầu hết mọi người khi họ nhìn thấy mã không đồng bộ sẽ ngay lập tức nghĩ rằng “Ồ, thật tuyệt. Tôi có thể chạy công cụ của mình song song. ”. Tôi có thể làm bạn thất vọng nhưng thực ra, điều đó không đúng, đồng thời và song song không giống nhau. Nó thường bị hiểu lầm, vì vậy hãy cố gắng hiểu tại sao

Khi chạy một cái gì đó không đồng bộ, điều đó có nghĩa là thực thi không bị chặn mà không cần chờ hoàn thành. Thay vào đó, tính song song có nghĩa là chạy nhiều tác vụ riêng biệt cùng lúc với tư cách là các đơn vị công việc độc lập

không đồng bộ

Tự làm nhiệm vụ ở một nơi khác và cho tôi biết khi bạn hoàn thành và mang lại cho tôi kết quả. Đến lúc này tôi có thể tiếp tục chạy nhiệm vụ của riêng mình

Mã không đồng bộ yêu cầu xử lý các phụ thuộc giữa thứ tự thực thi và điều này được thực hiện thông qua các cuộc gọi lại. Khi một số công việc được thực hiện, nó sẽ thông báo cho một công việc khác những gì nó đã hoàn thành. Mã không đồng bộ chủ yếu xử lý thời gian (thứ tự sự kiện)

Php đồng bộ

Song song, tương đông

Thuê bao nhiêu người tùy thích và chia nhiệm vụ giữa họ để hoàn thành nhiệm vụ này nhanh hơn và thông báo cho tôi khi bạn hoàn thành. Tôi có thể tiếp tục làm những công việc khác của mình hoặc nếu nhiệm vụ cấp bách, tôi sẽ ở đây và đợi cho đến khi bạn quay lại với kết quả. Sau đó, tôi có thể kết hợp các kết quả từ những người này. Thực thi song song thường yêu cầu nhiều tài nguyên hơn nên chủ yếu phụ thuộc vào phần cứng

Php đồng bộ

Để minh họa sự khác biệt giữa thực thi không đồng bộ và song song trên các ví dụ thực tế, chúng ta có thể so sánh hai máy chủ web phổ biến. Apache và Nginx. Họ minh họa hoàn hảo sự khác biệt này. Nginx không đồng bộ và dựa trên sự kiện, trong khi Apache sử dụng các luồng song song. Apache tạo các luồng mới cho mọi kết nối bổ sung, do đó, có số lượng kết nối được phép tối đa tùy thuộc vào bộ nhớ khả dụng trong hệ thống. Khi đạt đến giới hạn kết nối này, Apache sẽ từ chối các kết nối bổ sung. Yếu tố hạn chế trong việc điều chỉnh Apache là bộ nhớ (hãy nhớ rằng việc thực thi song song thường phụ thuộc vào phần cứng). Nếu một luồng dừng, máy khách sẽ đợi phản hồi cho đến khi luồng trở nên rảnh và do đó, nó có thể gửi phản hồi

Nginx hoạt động khác với Apache và nó không tạo chủ đề mới cho mỗi yêu cầu đến. Nó có một quy trình công nhân chính (hoặc một số công nhân, thường có quy tắc ngón tay cái là có một quy trình công nhân cho mỗi CPU), là quy trình đơn luồng. Nhân viên này có thể xử lý hàng nghìn kết nối đồng thời. Nó thực hiện điều này không đồng bộ với một luồng, thay vì sử dụng thực thi song song đa luồng

Vì vậy, đồng thời là một cách để xây dựng mọi thứ. Nó là một thành phần của những thứ thực hiện độc lập. Song song là thực thi đồng thời nhiều thứ (chúng có thể liên quan và có thể không). Trong đồng thời, chúng tôi đang xử lý rất nhiều thứ khác nhau cùng một lúc. Song song là làm nhiều việc cùng một lúc. Tưởng chừng như giống nhau nhưng thực chất lại là những ý tưởng khác nhau. Đồng thời là về cấu trúc, trong khi song song là về thực thi

Sử dụng có thể so sánh đồng thời với trình điều khiển I\O trong HĐH của bạn (chuột, bàn phím, màn hình). Tất cả chúng đều được quản lý bởi hệ điều hành, nhưng mỗi chúng là một thứ độc lập bên trong kernel. Những thứ này đồng thời, có thể song song nhưng không cần thiết. Họ không cần phải chạy song song. Vì vậy, để làm cho hoạt động đồng thời, bạn phải tạo giao tiếp giữa các phần độc lập này để phối hợp chúng

Tại sao phải bận tâm đến Back-End?

Bây giờ bạn có thể phàn nàn rằng trên back-end, sự kiện của bạn không quan tâm đến khả năng phản hồi. Bạn có tất cả những thứ JavaScript không đồng bộ tuyệt vời này ở giao diện người dùng và mọi thứ máy chủ của bạn làm chỉ đơn giản là đáp ứng các yêu cầu, do đó, nhiệm vụ của giao diện người dùng là cung cấp khả năng phản hồi cho người dùng, chứ không phải của bạn. Vâng, đó là sự thật, nhưng back-end không chỉ giới hạn ở các phản hồi API. Đôi khi bạn phải quản lý một số tác vụ phức tạp, chẳng hạn như máy chủ để tải video lên. Trong trường hợp này, có thể khả năng phản hồi không phải là yếu tố chính, nhưng chúng ta đang gặp vấn đề về tài nguyên vì một ứng dụng phải đợi. Nó có thể chờ các hoạt động của hệ thống tệp, cho giao tiếp mạng, cho các truy vấn cơ sở dữ liệu, v.v. Thông thường, các thao tác I/O này cực kỳ chậm so với tính toán của CPU, chẳng hạn như khi chúng tôi chuyển đổi tệp video. Và trong khi chúng tôi đang lưu trữ hoặc đọc tệp một cách chậm rãi, CPU của chúng tôi phải đợi và không làm gì cả, thay vì thực hiện một số công việc hữu ích. Như chúng tôi đã xem xét thay vì chờ đợi, chúng tôi có thể chạy các tác vụ này ở chế độ nền. Làm sao?

PHP không đồng bộ

Thế giới JavaScript đã có giải pháp và hỗ trợ vượt trội để viết mã không đồng bộ. Và chúng ta cũng có NodeJs cho phép viết các ứng dụng back-end không đồng bộ. Trong JavaScript, chúng ta có thể sử dụng hàm setTimeout() để chứng minh một số mã không đồng bộ

setTimeout(function() {
    console.log('After timeout');
}, 1);

console.log('Before timeout');

Khi chạy mã này, chúng ta thấy như sau

Before timeout
After timeout

Hàm setTimeout() xếp hàng mã để chạy sau khi ngăn xếp cuộc gọi hiện tại hoàn tất. Điều này có nghĩa là chúng tôi phá vỡ luồng mã đồng bộ và trì hoãn một số thực thi. Cuộc gọi console.log() thứ hai đang được thực hiện trước cuộc gọi được xếp hàng bên trong cuộc gọi setTimeout()

Nhưng còn PHP thì sao? . Không có setTimeout() tương đương và chúng tôi không thể đơn giản trì hoãn hoặc xếp hàng một số mã. Đó là lý do tại sao các framework và thư viện như Amp và ReactPHP bắt đầu xuất hiện. Ý tưởng chính của họ là ẩn các chi tiết cụ thể về ngôn ngữ cấp thấp với chúng tôi và cung cấp các công cụ và tóm tắt cấp cao có thể được sử dụng để viết mã không đồng bộ và quản lý đồng thời như chúng tôi có thể làm trong JavaScript và NodeJS

Tại sao tôi nên sử dụng PHP, nếu chúng tôi có NodeJ và Go?

Loại câu hỏi này thường được hỏi nhất khi nói về PHP không đồng bộ. Bằng cách nào đó, cộng đồng thường phản đối việc sử dụng PHP làm công cụ viết mã không đồng bộ. Luôn có người đề xuất chỉ cần sử dụng Go và NodeJs

Php đồng bộ

Tweet này của assertchris mô tả hoàn hảo nó

Về cơ bản tôi cảm thấy thế nào về mọi bài đăng "chỉ sử dụng ngôn ngữ khác thay vì không đồng bộ trong PHP". ảnh. Twitter. com/LnKXTIQodx

— assertchris (@assertchris) 8 tháng 2017 năm г

Tất nhiên, khi PHP được tạo ra, mục tiêu của nó không phải là một ngôn ngữ lập trình có thể được sử dụng để xây dựng các ứng dụng phức tạp lớn. Khi nó xảy ra, không có JavaScript và không có nội dung không đồng bộ nào trong tâm trí. Nhưng bây giờ chúng ta có PHP hoàn toàn khác, đã có sẵn một số chức năng gốc để viết mã không đồng bộ (như hàm stream_select())

Có, bạn có thể sử dụng Go hoặc NodeJs để tạo các ứng dụng back-end không đồng bộ, nhưng không phải lúc nào cũng vậy. Khi bạn đã có nền tảng vững chắc về PHP, bạn sẽ dễ dàng tìm hiểu một số thư viện và công cụ cho trường hợp sử dụng của mình, thay vì học một ngôn ngữ mới và một hệ sinh thái mới. Các công cụ như ReactPHP hoặc Amp cho phép bạn viết mã không đồng bộ giống như bạn viết mã trong NodeJS. Các công cụ này đã đủ trưởng thành và có các phiên bản ổn định nên bạn có thể yên tâm sử dụng chúng trong sản xuất

Không chỉ CLI

Tôi không quan tâm đến việc viết một cuộc trò chuyện, máy chủ hoặc những thứ tương tự. Tôi chỉ muốn tăng tốc các trang web

Đó là một loại sáo rỗng phổ biến mà mã không đồng bộ chỉ có thể được sử dụng trong các tập lệnh CLI. Hoàn toàn ổn khi tích hợp một số phần không đồng bộ trong môi trường đồng bộ truyền thống của bạn, ngay cả trong một ứng dụng web truyền thống. Ví dụ: bạn có thể nhận một yêu cầu, sau đó gọi một số tài nguyên khác nhau một cách không đồng bộ và khi các cuộc gọi này được thực hiện, bạn có thể tiếp tục vòng đời phản hồi yêu cầu của mình và kết quả là trang sẽ được hiển thị nhanh hơn. Hoặc bạn cần thực hiện một số lệnh gọi API bên ngoài, chẳng hạn khi người dùng hoàn tất thanh toán, bạn muốn gửi email hoặc thông báo đẩy. Bạn có thể thực hiện các lệnh gọi API này một cách không đồng bộ và sau đó tiếp tục với luồng mã đồng bộ truyền thống của mình. Không cần viết lại toàn bộ ứng dụng và xóa tất cả nhân viên chặn. Chỉ cần tìm một số tắc nghẽn hiệu suất và có thể chúng có thể được sửa bằng mã không đồng bộ

Có, mã không đồng bộ trong hầu hết các trường hợp vẫn đang được sử dụng trong các tập lệnh CLI, nhưng nó không giới hạn ở các cuộc trò chuyện và máy chủ thời gian thực. Trong trường hợp bạn chỉ muốn tăng tốc một số trang web của mình, không cần phải loại bỏ khung Symfony hoặc Laravel và tạo máy chủ ứng dụng không đồng bộ hoàn toàn của riêng bạn

Phần kết luận

Đừng ngại học mô hình ngôn ngữ mới. PHP không chỉ là chạy tập lệnh, thực thi một số mã và chết. Bạn sẽ ngạc nhiên khi sử dụng ngôn ngữ PHP quen thuộc của mình theo một cách hoàn toàn mới, theo cách mà bạn chưa bao giờ sử dụng nó. Mã không đồng bộ và lập trình hướng sự kiện sẽ mở rộng cách bạn nghĩ về PHP và cách sử dụng ngôn ngữ này. Không cần phải học một ngôn ngữ mới để viết các ứng dụng không đồng bộ chỉ vì ai đó đổ lỗi cho PHP rằng nó không phải là một công cụ phù hợp cho nó hoặc vì đây là cách tôi luôn làm, nó không thể được cải thiện. Chỉ cần cung cấp cho nó một thử

PHP là đồng bộ hay không đồng bộ?

PHP phục vụ các yêu cầu một cách đồng bộ . Điều đó có nghĩa là mỗi dòng mã thực thi theo cách đồng bộ của tập lệnh. Sau khi nhận được kết quả từ một dòng, nó sẽ thực thi dòng tiếp theo hoặc đợi kết quả trước khi chuyển sang thực thi dòng mã tiếp theo.

PHP có phải là ngôn ngữ không đồng bộ không?

PHP không hỗ trợ lệnh gọi không đồng bộ tích hợp sẵn . Bạn có thể thực hiện cuộc gọi giả không đồng bộ bằng cách sử dụng curl.

PHP không đồng bộ theo mặc định?

Khi buzz gần đây về PHP v/s Nodejs xuất hiện, một điều luôn thu hút sự chú ý là thực tế là Nodejs đã triển khai I/O không chặn (hoặc không đồng bộ) theo mặc định và PHP did not.

PHP 8 có phải là không đồng bộ không?

PHP 8 sẽ nhanh hơn nhiều so với PHP 7 nhờ thiết kế không đồng bộ mới và trình biên dịch JIT, bạn sẽ có thể xây dựng các ứng dụng không đồng bộ trong PHP 8 which is a big deal for websites.