2012-11-24 34 views
6

Tôi có một tập lệnh PHP "A" bắt đầu một tập lệnh PHP "B" khác, chạy tối đa 5 giờ. Tôi sử dụng chức năng curl cho điều đó. Nhưng vấn đề của tôi là tập lệnh "A" không chắc chắn giữ kết nối với tập lệnh "B". Tôi đã thay đổi max_execution_time, timeout, socket-timeout, vv ... nhưng không có gì hữu ích.Các vấn đề liên quan đến kết nối còn sống

Tôi có cần gửi tiêu đề đến tập lệnh "B" với curl hay gì đó không?

$curl_header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text 
/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 
$curl_header[] = "Cache-Control: max-age=0"; 
$curl_header[] = "Connection: keep-alive"; 
$curl_header[] = "Keep-Alive: 84600"; 

$url = 'http://test.de/test_B.php'; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'); 
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $curl_header); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 300); 
curl_setopt($ch, CURLOPT_TIMEOUT, 84600); 
curl_setopt($ch, CURLOPT_NOSIGNAL, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_URL, $url); 
$result = curl_exec($ch); 
$curl_errno = curl_errno($ch); 
curl_close($ch); 

'

+1

dán một số mã? – GBD

+0

Tập lệnh php có gọi chính nó hết thời gian chờ không? Bạn đã đặt thời gian max_execution trên scipt gọi đến 0? Ngoài ra, bạn có đặt tỷ lệ chuyển thấp không - nếu bạn nhận được phản hồi một phần (bao gồm khoảng trắng) và sau đó không có gì, CURLOPT_LOW_SPEED_TIME có thể khởi động? – Robbie

Trả lời

1

Nếu kịch bản "B" phải mất thời gian dài để hoàn thành nó có thể hữu ích để đặt trong quá trình thực một số echo "something"; flush(); rằng mantain kết nối còn sống.

Điều này xảy ra với tôi gần đây khi thực hiện tương tự.

0

Có kịch bản B lưu trữ kết quả của nó ở đâu đó và sau đó sau 5 giờ kết nối và kiểm tra. Máy chủ HTTP không được thiết kế cho những thời gian này và bạn có thể phải chịu bất kỳ loại thời gian chờ nào.

0

Bạn có thể sử dụng kiến ​​trúc sau:

Script Một kịch bản gọi B chạy script C qua yêu cầu vỏ ở chế độ nền và trả về một số identificator. Về cơ bản, Script B chỉ bắt đầu công việc 5 giờ sẽ hoạt động ở chế độ nền và bạn không phải giữ kết nối. Bạn có thể lưu trữ tiến trình trong cơ sở dữ liệu hoặc một số tệp. Sau đó, kịch bản A có thể gọi cho tiến trình trên kịch bản 5 giờ C bằng cách gọi một số giao diện lặp lại, chúng ta hãy gọi nó Script D, sẽ đọc cơ sở dữ liệu hoặc tập tin và theo dõi bao xa kịch bản C đã đi với nhiệm vụ của nó.

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