2011-10-17 40 views
5

Tôi đang làm việc trên một ứng dụng sử dụng API MWS của Amazon được viết chủ yếu bằng PHP. Ứng dụng này cho phép người bán Amazon đăng ký, cung cấp một số thông tin người bán Amazon và ứng dụng sau đó bắt đầu tải xuống các đơn đặt hàng của người dùng này từ Amazon đặt chúng vào cơ sở dữ liệu MySQL.Cách hiệu quả nhất để chạy các hàm không đồng bộ trong PHP là gì?

Tôi đã xây dựng các phương pháp để đồng bộ hóa dữ liệu chính xác với cơ sở dữ liệu bằng cách sử dụng tập lệnh có nhiều chức năng nhưng nhận thấy quá trình này mất quá nhiều thời gian. Kịch bản này chỉ đơn giản là vòng lặp thông qua tất cả người dùng trong cơ sở dữ liệu và lặp lại tất cả các đơn đặt hàng tại một thời điểm. Ngay bây giờ, chỉ với 5 người dùng thử nghiệm, thời gian có thể thực hiện được nhưng tôi đang tìm một phương pháp có thể mở rộng hơn. Hãy suy nghĩ về 500 người dùng tất cả chạy đồng thời một lúc. WAY quá lâu!

Tôi khá mới đối với PHP và đặc biệt là chạy các quá trình không đồng bộ từ nó. Cách duy nhất tôi đã tìm thấy rằng tôi có thể làm điều này là để có một kịch bản starter mà tìm thấy tất cả người dùng trong cơ sở dữ liệu và sinh ra một kịch bản đồng bộ cho mỗi người dùng sau đó phát hành nó. Tôi không thích ý tưởng này bởi vì nếu tôi đã có hơn 500 người dùng, đồng bộ hàng đêm của tôi sẽ bao gồm 500 trường hợp sinh sản của tập lệnh PHP này.

Có ai đã làm điều gì đó tương tự như trước đây không? Nếu vậy, tôi muốn nghe cách tốt nhất để làm cho đồng bộ hóa này hiệu quả hơn.

Trả lời

1

Đồng ý w/DaveRandom, hãy kiểm tra HTTP Request Pool để thực hiện, chứ không phải là cán của riêng bạn http://www.php.net/manual/en/class.httprequestpool.php

+0

Tôi chưa bao giờ nghe nói về lớp HTTPRequestPool.Tuy nhiên, từ điều này tôi có thể tìm ra cách để làm cho nó gửi các yêu cầu HTTP không đồng bộ nhưng tôi cũng cần xử lý từng kết quả mà tôi lấy từ các kết quả này một cách riêng biệt. Điều này có thể được thực hiện? –

+0

Tôi tin như vậy. Bạn đã đọc tài liệu chưa? Đặc biệt kiểm tra phương thức "getFinishedRequests" - http://www.php.net/manual/en/function.httprequestpool-getfinishedrequests.php – rICh

2

Kể từ PHP không thể đa luồng , trong thực tế bạn chỉ có 2 lựa chọn (có một số phương pháp để làm điều này, nhưng tất cả đều đun sôi xuống sau để loại):

  • Có 1 quy trình cho mỗi hoạt động của người dùng. Như bạn nói, với một cơ sở dữ liệu lớn, điều này có thể dẫn đến nhiều quá trình.
  • Có quy trình giao dịch với nhiều người dùng. Điều này sẽ có tiềm năng mất nhiều thời gian hơn, vì mỗi quá trình có hiệu quả đồng bộ.

Tôi nghĩ đặt cược tốt nhất là kết hợp hai phương pháp tiếp cận, vì vậy bạn có nhiều quy trình xử lý nhiều người dùng. Vì vậy, nếu bạn có 500 người dùng, sinh ra 100 quy trình xử lý 5 người dùng mỗi hoặc 50 quy trình xử lý 10 người dùng mỗi người. Ngoài ra, có thể đáng để viết một chương trình bằng ngôn ngữ phù hợp hơn với tác vụ - một thứ hỗ trợ đa luồng, như Java hoặc Perl - bạn có thể bắt đầu từ PHP nếu được yêu cầu.

Sửa 03/2013: PHP bây giờ có thể được đa luồng, nhưng nó không được khuyến khích sử dụng sản xuất như phần mở rộng pthreads vẫn còn rất không ổn định, và nó cũng không được khuyến khích cho người dùng trung bình, chỉ sử dụng này nếu bạn thực sự biết những gì bạn đang làm

+0

Cảm ơn bạn đã trả lời. Tôi muốn giữ điều này trong PHP vì toàn bộ ứng dụng được viết bằng PHP tuy nhiên có thể, trên thực tế, một giải pháp tốt hơn. Đây là một nhược điểm lớn của PHP. : ( –

+0

Không quan tâm, làm thế nào để bạn sinh ra các tiến trình con? Với 'pcntl_fork()', 'exec ('php script.php>/dev/null &');' hoặc một số phương pháp khác mà tôi không thể nghĩ ra ngay bây giờ ? – DaveRandom

+0

Tôi đã không đưa ra một giải pháp rõ ràng Tuy nhiên, ý tưởng của tôi là sử dụng chức năng exec –

0

tôi đã kết thúc sử dụng passthru và đi qua các kịch bản để nền. Mọi thứ dường như đang hoạt động tốt cho đến nay.

Các vấn đề liên quan