2011-12-03 28 views
5

Tôi có chương trình vỏ này mà tôi muốn thực thi bằng php. Vấn đề là nó có khả năng mất nhiều thời gian, và do đó tôi cần nó để cập nhật thời gian thực cho trình duyệt của người dùng.php shell_exec với thời gian thực cập nhật

Tôi đọc rằng tôi có thể cần phải sử dụng popen() để làm điều đó, nhưng tôi là loại (ok, tôi thực sự là: P) một PHP noob và không thể tìm ra cách tôi có thể làm điều đó .

Sẽ đánh giá cao bất kỳ trợ giúp nào!

Trả lời

13
if(($fp = popen("your command", "r"))) { 
    while(!feof($fp)){ 
     echo fread($fp, 1024); 
     flush(); // you have to flush buffer 
    } 
    fclose($fp); 
} 
+0

Cảm ơn câu trả lời nhanh và tuyệt vời, bạn đời! – MegaEduX

+1

Tại sao bạn phải xả bộ đệm? – dellsala

2

có hai hành vi có thể:

  1. Non Block, nơi bạn cần phải làm điều gì đó khác giữa flushs (@GameBit thấy làm thế nào để làm điều đó).

  2. Với Block, nơi bạn chờ cho đến khi được gọi là kết thúc lệnh, trong trường hợp này trông passthru function

+0

Tôi sẽ làm điều đó với passthru như thế nào? Ngoài ra, có bất kỳ bất lợi nào khi sử dụng mã của @ GameBit nếu tôi không cần làm bất cứ điều gì giữa các lần xả không? – MegaEduX

+0

Bạn truyền lệnh giống như trong giải pháp với popen, nhưng đầu ra từ chương trình bên ngoài đi trực tiếp đến đầu ra ... Nếu bạn biết sự khác biệt giữa fopen và readfile, thực tế là giống nhau, chỉ với các tiến trình. Đầu tiên cho phép bạn đọc byte theo byte và đưa vào một biến, xử lý dữ liệu, đọc và ghi đơn giản khác để xuất trực tiếp mà không có bất kỳ hành động nào. –

+0

OK. Trên thực tế là dễ sử dụng hơn. Obrigado! : D – MegaEduX

-1

thử mã này (thử nghiệm trên Windows máy + máy chủ wamp)

 header('Content-Encoding: none;'); 

     set_time_limit(0); 

     $handle = popen("<<< Your Shell Command >>>", "r"); 

     if (ob_get_level() == 0) 
      ob_start(); 

     while(!feof($handle)) { 

      $buffer = fgets($handle); 
      $buffer = trim(htmlspecialchars($buffer)); 

      echo $buffer . "<br />"; 
      echo str_pad('', 4096);  

      ob_flush(); 
      flush(); 
      sleep(1); 
     } 

     pclose($handle); 
     ob_end_flush(); 
1

có một tùy chọn dễ dàng bẩn

`yourcommand 1>&2`; 

chuyển hướng stdout sang thứ e stderr.

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