Nếu lệnh được thực thi không thể tìm thấy, một hợp lệ tài nguyên sẽ được trả lại. Điều này có vẻ kỳ lạ, nhưng có ý nghĩa;
Bài viết hướng dẫn cách thực thi dòng lệnh trên máy chủ bằng PHP nhưng hiển thị đầu ra thời gian thực trên trình duyệt
Có nhiều hàm thực thi dòng lệnh, tôi thường sử dụng hàm
1 để có thể kiểm tra giám sát được cả 2, 3 và 4Hiển thị thời gian thực không cần xử lý gì ở máy khách
Để hiển thị thời gian thực trên trình duyệt mà không cần xử lý gì ở máy khách thì phía máy chủ phải đảm bảo 2 vấn đề
- Tắt bộ đệm đầu ra cho mỗi khi lệnh có đầu ra thì hiện ra đúng lúc chứ không bị lưu lại trong bộ đệm đầu ra
- Loại nội dung phải là 5
Ví dụ sau hiển thị đầu ra của lệnh
0 trên màn hình duyệtkiểm tra ping. php
Nếu chú ý bạn sẽ thấy các thẻ đóng [điển hình là của
1, 2 và chứa thẻ đầu ra của lệnh ở đây là 3] sẽ không được ghi ra cho đến khi thực hiện xong lệnhĐặc biệt nếu HTML có chứa CSS và JavaScript sẽ khó có thể thực thi chính xác khi DOM chưa sẵn sàng
Vì vậy, giải pháp tốt hơn là hãy sử dụng Sự kiện do máy chủ gửi cho phía khách hàng đầu ra lệnh của một cách chủ động khi mọi thứ đã sẵn sàng
Hiển thị thời gian thực bằng Server-sent Events
Ta edit lại đoạn mã trên một chút
- Change content type to 4
- Ghi chuỗi đầu ra theo định dạng của luồng sự kiện. Xem thêm ›
ping-test-sse. php
Trong đó phần được thay đổi là
header["Content-type: text/event-stream; charset=utf-8"]; while [$s = fgets[$pipes[1]]] { print "data: " . $s . PHP_EOL; print PHP_EOL; flush[]; // dump the line immediately } $retval = proc_close[$process]; print "id: close" . PHP_EOL; // notify end of script print "data: Command returned $retval" . PHP_EOL; print PHP_EOL;
Phía sau máy khách chuẩn bị HTML nội dung như sau
________số 8Đoạn mã JavaScript sử dụng EventSource để đọc đầu ra của lệnh, thêm vào giữa
5 mỗi khi có dữ liệu mớisse. js
0Như vậy với cách làm này, thì phần xử lý CSS và JavaScript đã được tải đầy đủ khi thực hiện lệnh, giao diện hiển thị kết quả sẽ được đảm bảo