2012-04-26 36 views
9

Tôi đang ở một điểm trong API phía máy chủ PHP, nơi tôi đang thực hiện rất nhiều truy vấn MySQL và tôi muốn tăng tốc nó bằng cách có các chuỗi mutliple làm việc trên các truy vấn khác nhau và sau đó trả lại kết quả.đồng thời trong PHP

Nhưng làm cách nào để tạo một chuỗi khác trong PHP? Tôi đang đi qua các tham số POST, vì vậy, shell_exec() đơn giản có thể hoạt động, nhưng có vẻ như không an toàn. Tùy chọn Tôi đang xem xét:

1) Thực hiện một yêu cầu cURL sử dụng các thông số tôi có, quá trình JSON từ yêu cầu và sau đó trở

2) Gọi một shell_exec() với PHP CLI và bằng cách nào đó (làm thế nào tôi sẽ làm này ??) xử lý phản hồi trong PHP

các tùy chọn tốt nhất ở đây là gì?

+0

Thông thường nó được thực hiện với hàng đợi và công nhân, giám sát nó – zerkms

+0

cách thực hiện? – lollercoaster

+0

bạn thiết lập một số phần mềm quản lý hàng đợi (ví dụ: rabbitmq). Sau đó, kịch bản của bạn thêm nhiệm vụ vào hàng đợi và một số nhân viên nền thực hiện nó – zerkms

Trả lời

4

Không có hỗ trợ luồng trong PHP. Tuy nhiên, bạn có thể sử dụng tiện ích mở rộng pcntl để sinh đẻ và quản lý dĩa, nhưng tốt nhất bạn nên xem lại thuật toán của mình nếu bạn đạt đến kết luận rằng mọi thứ nên được thực hiện với luồng.

Tùy chọn để xử lý các hoạt động chạy không đồng bộ sẽ lưu trữ chúng trong cơ sở dữ liệu và có quy trình nhân viên nền đưa chúng từ cơ sở dữ liệu, tính kết quả, sau đó lưu trữ kết quả trong cơ sở dữ liệu. Sau đó, kịch bản hướng về phía trước sẽ tìm kiếm chúng trong cơ sở dữ liệu để xem chúng có hoàn thành hay không và kết quả là gì.

+1

các trang web có quy mô lớn được xây dựng bằng PHP như thế nào? – lollercoaster

+1

@lollercoaster: cách "quy mô lớn" có liên quan đến chủ đề? – zerkms

+1

dường như với tôi rằng các API/trang web có hiệu suất cao với nhiều tương tác cơ sở dữ liệu sẽ cần đồng thời – lollercoaster

3

Khám phá pcntl extension. PHP không hỗ trợ luồng thực sự, vì vậy bạn sẽ phải thực hiện các luồng giả bằng fork() ing. Lưu ý rằng fork() ing một quá trình là nhiều "nặng" hơn sinh ra một sợi.

2

PHP chưa triển khai đề tài (và có khả năng sẽ không bao giờ) vì nhiều thư viện của PHP KHÔNG an toàn. Thay đổi đó là pcntl kết thúc tốt đẹp chức năng C fork.

Tôi đã created a handy wrapper cho các chức năng này để tôi quản lý chúng ở cấp độ cao hơn.

$thread1 = new Thread(function($thread) { 
    sleep(4); 
    $thread->write("Hello\n"); 
}); 

$thread2 = new Thread(function($thread) { 
    sleep(5); 
    $thread->write("World\n"); 
}); 

$thread3 = new Thread(function($thread) { 
    sleep(6); 
}); 

print $thread1->read(); // time: 0 -> 4 
print $thread2->read(); // time: 4 -> 5 
$thread3->join(); // time 5 -> 6 

// More advanced handling: 
// Thread::selectUntilJoin(array($thread1, $thread2, $thread3), function() { ... }, function() { ... }); 
+0

"có nghĩa là các chức năng không thể được gọi từ các chủ đề khác nhau" --- nó không phải là định nghĩa chính xác cho mã TS – zerkms