2016-10-18 15 views
6

Mục tiêu

Mục tiêu cơ bản của tôi là để đạt được trigger asynchornous trong PHP sử dụng Yii2 Web ApplicationPHP Chạy việc làm nền mà không cần chờ cho chế độ phản ứng không Chặn Giống như kích hoạt loại

tôi cần phải chạy các công việc php mẻ nhưng tôi không muốn chờ trong trình duyệt /cron để thực hiện công việc. Để chạy công việc tôi cần phải sử dụng tập tin khác nhau của ứng dụng của tôi như

http://myapp/foojob.php 

Các foojob.php nên không đồng bộ gọi nhiều trường hợp php [Mỗi trường hợp mang một công việc] dựa trên các công việc availble trong tay. Giới hạn thời gian của cuộc gọi (foojob.php) nhỏ hơn 60 giây.i cần kích hoạt các phiên bản php mới trước khi vượt quá giá trị thời gian chờ.

tôi giới thiệu & Cố gắng

  1. curl_multi - i could't tìm ra chế độ không chặn trong đó.
  2. fsock_open - Điều này có thể bằng cách gửi Kết nối: Gần cuộc gọi (Nhưng mở khóa fsock không phải lúc nào cũng khả dụng trên nhiều máy chủ lưu trữ được chia sẻ hoặc không hoạt động bình thường). Bạn có thể gợi ý cho tôi bất kỳ giải pháp đáng tin cậy nào với việc vận chuyển fsock không?
  3. pcntl_exec -Tôi chưa thử trong thời gian thực nhưng thống kê thời gian thực cho thấy 45% máy chủ đã tắt chức năng này. Tôi không biết lý do tại sao.
  4. vận chuyển luồng - Tôi không biết cách hoạt động?

Câu hỏi của tôi:

  1. Non chặn async yêu cầu Có giải pháp nào có thể đã tồn tại trong git để đạt được trong PHP?
  2. Hãy tham khảo nếu có bất kỳ phương tiện vận chuyển nào khác mà tôi cần xem xét
  3. có cơ chế chuyển mạch thông minh nào (curl/fsock) dựa trên môi trường không?

Edit:

Ứng dụng này là sản phẩm tự lưu trữ. nó sẽ hoạt động trên các dịch vụ lưu trữ khác nhau. Shared Hosting sẽ không cho phép/Cung cấp bất kỳ tiện ích mở rộng bên ngoài nào cho khách hàng của họ.

+0

Bạn hãy nhìn vào [php-cứu] (https://github.com/chrisboulton/php-resque)? –

+0

@old_mountain cảm ơn. tôi đã có một cái nhìn. Nó cần redis Redis 2.2+. Không có bất kỳ sự phụ thuộc khó khăn nào sẽ tốt hơn cho trường hợp của chúng ta? – Babu

+0

Bạn đã kiểm tra 'ignore_user_abort()' chưa? với điều đó bạn có thể sử dụng 'nohup' nếu bạn có các hộp unix để làm cho nó hoạt động. – Gogol

Trả lời

1

Bạn có thể thực hiện một cách tiếp cận nơi bạn gửi tiêu đề chính xác để trình duyệt đóng kết nối và sau đó chạy quá trình đồng bộ và dường như không đồng bộ với người dùng cuối.

Đây là điều tôi đã viết một thời gian dài trước đây mà bạn có thể xem làm ví dụ. http://www.phpclasses.org/package/8388-PHP-Defer-execution-of-actions-until-the-script-ends.html

Tôi giả sử có một số vị trí trong yii mà bạn có thể kết nối sau khi nội dung được gửi đến nơi bạn có thể làm một điều tương tự.

Phiên bản ngắn của tiêu đề ("Nội dung dài:".$ length); tiêu đề ("Kết nối: Đóng");

ob_flush(); // headers 
echo $html; 
flush(); 

doWork(); 
+0

Cảm ơn câu trả lời. Có một số khái niệm php không chặn đang có trong socket và lệnh. Đây là một trong những hữu ích và tôi viết câu trả lời của riêng tôi với một số phương pháp không chặn php ở đây. – Babu

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