2013-01-09 50 views
44

Tôi đang làm việc trên một ứng dụng web PHP và tôi cần thực hiện một số hoạt động mạng trong yêu cầu như tìm nạp ai đó từ máy chủ từ xa dựa trên yêu cầu của người dùng.Gọi hàm không đồng bộ trong PHP

Có thể mô phỏng hành vi không đồng bộ trong PHP do tôi phải chuyển một số dữ liệu vào một hàm và cũng cần đầu ra từ nó.

Mã của tôi cũng giống như:

<?php 

    $data1 = processGETandPOST(); 
    $data2 = processGETandPOST(); 
    $data3 = processGETandPOST(); 

    $response1 = makeNetworkCall($data1); 
    $response2 = makeNetworkCall($data2); 
    $response3 = makeNetworkCall($data3); 

    processNetworkResponse($response1); 
    processNetworkResponse($response2); 
    processNetworkResponse($response3); 

    /*HTML and OTHER UI STUFF HERE*/ 

    exit; 
?> 

Mỗi hoạt động mạng mất khoảng 5 giây để hoàn thành thêm tổng cộng 15 giây để thời gian phản hồi của ứng dụng của tôi cho tôi thực hiện 3 yêu cầu.

Hàm makeNetworkCall() chỉ cần thực hiện yêu cầu HTTP POST.

Máy chủ từ xa là API của bên thứ 3 nên tôi không có quyền kiểm soát ở đó.

PS: Vui lòng không trả lời đưa ra đề xuất về AJAX hoặc những thứ khác. Tôi hiện đang tìm kiếm nếu tôi có thể làm điều này thông qua PHP có thể được với một phần mở rộng C + + hoặc một cái gì đó như thế.

+0

Hãy thử sử dụng 'CURL' để kích hoạt yêu cầu và tìm nạp một số dữ liệu từ web ... –

+0

có thể trùng lặp [PHP luồng gọi đến hàm php không đồng bộ] (http://stackoverflow.com/questions/13846192/ php-threading-call-to-a-php-function-asynchronously) – CRABOLO

+0

Bạn có thể sử dụng chức năng [stream_select] (https://secure.php.net/manual/en/function.stream-select.php) của PHP để chạy mã không chặn. [React] (http://reactphp.org/) sử dụng điều này để tạo ra một vòng lặp sự kiện tương tự như node.js (https://speakerdeck.com/igorw/react-phpnw). –

Trả lời

26

Tôi tin rằng câu trả lời đẻ ở đây:

PHP threading call to a php function asynchronously

nhanh lưu ý: sử dụng luồng

+2

Chủ yếu là, lý do tôi đã không đề cập đến chủ đề trong câu trả lời của tôi là vì OP đã đề cập rằng họ đang xây dựng một ứng dụng web. Sử dụng các chủ đề trong PHP dưới Apache có thể nguy hiểm và người ta thực sự cần phải suy nghĩ về những gì họ đang làm. Nhưng, nếu điều này làm việc cho anh ta, sau đó tuyệt vời! –

+10

@ColinMorelli bạn có thể giải thích thêm một chút về nguy hiểm không? Tôi đang nghĩ đến việc sử dụng threds quá nhưng muốn xem xét chúng. – Manuel

+0

Tôi sẽ nói, hãy thử syslog. http://php.net/manual/en/function.syslog.php – Abhidemon

2

cURL sẽ là lựa chọn thực sự duy nhất của bạn ở đây (hoặc là, hoặc sử dụng các ổ cắm không chặn và một số logic tùy chỉnh).

This link sẽ gửi cho bạn đúng hướng. Không có xử lý không đồng bộ trong PHP, nhưng nếu bạn đang cố gắng tạo nhiều yêu cầu web đồng thời, cURL multi sẽ xử lý điều đó cho bạn.

1

Tôi nghĩ rằng nếu HTML và các công cụ giao diện người dùng khác cần dữ liệu được trả lại thì sẽ không có cách nào để đồng bộ hóa nó.

Tôi tin rằng cách duy nhất để làm điều này trong PHP là ghi nhật ký yêu cầu trong cơ sở dữ liệu và kiểm tra cron mỗi phút hoặc sử dụng xử lý hàng đợi Gearman hoặc có thể exec() một quy trình dòng lệnh

Trong khi chờ đợi, trang php của bạn sẽ phải tạo một số html hoặc js làm cho nó tải lại sau vài giây để kiểm tra tiến trình, không phải lý tưởng.

Để tránh vấn đề này, bạn mong đợi bao nhiêu yêu cầu khác nhau? Bạn có thể tải xuống tất cả tự động mỗi giờ hoặc lâu hơn và lưu vào cơ sở dữ liệu không?

2

Tôi không có một câu trả lời trực tiếp, nhưng bạn có thể muốn xem xét những điều sau:

2

Ngày nay, nó là tốt hơn để sử dụng queues hơn đề (đối với những người không sử dụng Laravel có tấn hiện thực khác ngoài kia like this).

Ý tưởng cơ bản là, tập lệnh PHP gốc của bạn đặt nhiệm vụ hoặc công việc vào hàng đợi. Sau đó, bạn có công nhân làm việc hàng đợi chạy ở nơi khác, lấy việc ra khỏi hàng đợi và bắt đầu xử lý chúng một cách độc lập với PHP ban đầu.

Những lợi thế là:

  1. Khả năng mở rộng - bạn chỉ có thể thêm các nút công nhân để theo kịp với nhu cầu. Bằng cách này, các tác vụ được chạy song song.
  2. Độ tin cậy - người quản lý hàng đợi hiện đại như RabbitMQ, ZeroMQ, Redis, v.v., được thực hiện là cực kỳ đáng tin cậy.
Các vấn đề liên quan