2015-11-15 13 views
5

Tôi hiện đang sử dụng lệnh php exec sau để tải url ở phía máy chủ vì tôi cần giải pháp không liên quan đến công việc cron và cũng không đồng bộ tức là người dùng có thể điều hướng hình thức trang sau khi nhiệm vụ được bắt đầu và nhiệm vụ vẫn sẽ thực hiện:Curl thay thế cho Cron Job PHP

exec("nohup curl ".$dbupdateurl." > /dev/null 2>&1 & echo $!"); 

Điều này hoạt động tốt nhất trong thời gian này là khá khó lường. Có cách nào tốt hơn/vững chắc hơn để đạt được điều này không?

Cảm ơn,

Matt

+0

Bạn có ý nghĩa gì bởi * không thể đoán trước *? –

+0

Tôi đang sử dụng trang để xây dựng cơ sở dữ liệu trong môi trường wordpress. Đôi khi tập lệnh không kết thúc, tức là chỉ xây dựng 80% cơ sở dữ liệu. – user1419810

+0

giống như một vấn đề với tập lệnh không liên quan đến cách gọi –

Trả lời

0

Nếu bạn đang sử dụng PHP-FPM, bạn có thể sử dụng fastcgi_finish_request:

chức năng này sẽ xóa toàn bộ dữ liệu đáp ứng cho khách hàng và kết thúc theo yêu cầu. Điều này cho phép thực hiện các tác vụ tốn thời gian mà không cần phải thoát khỏi kết nối với máy khách.

Bằng cách này bạn có thể sử dụng các chức năng gốc của PHP để thực hiện yêu cầu web của bạn sau khi người dùng đã nhận được phản hồi. Một ví dụ về cách sử dụng chức năng này có thể được tìm thấy trong example of how to use fastcgi_finish_request()

Nếu bạn không sử dụng PHP-FPM, bạn có thể sử dụng một JobQueue như Gearman để làm việc bên ngoài yêu cầu ban đầu. Đây có lẽ là cách đáng tin cậy nhất để làm điều đó, vì nó là một hệ thống chuyên dụng để xử lý các loại công việc này.

Cũng lưu ý rằng curl can do async http requests. Nếu vấn đề là bạn không muốn đợi câu trả lời http, đây có thể là một giải pháp dễ dàng hơn là giới thiệu một JobQueue.

Cuối cùng nhưng không kém phần quan trọng, bạn có thể ngắt thêm quy trình PHP để thực hiện công việc. Xem How can I do time consuming task after sending response to clientphp execute a background process

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