2013-04-17 41 views
6

Tôi có trang web php 5.4/mysql với 5 triệu lượt truy cập mỗi ngày, chạy trên máy chủ Linux có nginxphp-fpm. Cơ sở dữ liệu nằm trên một máy chủ riêng biệt.Bất kỳ cách nào để giảm htmlspecialchars() CPU sử dụng?

Tôi đã nhận thấy rằng vào thời điểm cao điểm, tải máy chủ web của tôi lên đến 15, thay vì bình thường 4 cho bộ vi xử lý lõi tứ. Tôi đã lược tả ứng dụng php của mình với xdebugxhprof và thấy rằng 90% công việc CPU được thực hiện bằng chức năng htmlspecialchars() trong Twig mẫu mà tôi sử dụng để hiển thị dữ liệu. Đôi khi, từ 100 đến 1000 htmlspecialchars() cuộc gọi trên mỗi trang. Tôi đã cố gắng giảm thoát không tự nguyện, nhưng nó vẫn không thể tránh được.

Có cách nào tôi có thể giảm mức sử dụng CPU theo chức năng htmlspecialchars() không? Có lẽ có một số loại bộ nhớ đệm trong php cho điều này? Hay có cách nào khác?

+1

nếu bạn thoát quá nhiều dữ liệu, có thể tốt hơn là lưu trữ dữ liệu đã thoát? –

+0

@Artjom Kurapov, hầu hết dữ liệu được thêm bởi người dùng. Để cho phép họ chỉnh sửa nó, tôi sẽ phải unescape nó và sau đó thoát khỏi nó một lần nữa, đó sẽ là một nỗi đau thực sự. Đó chỉ là một trong những trường hợp ... –

+0

Nếu bạn thiếu CPU nhưng không phải trên dung lượng lưu trữ, bạn có thể lưu trữ cả hai thoát khỏi một chế độ không thoát. Thoát một lần, khi được cập nhật và bất cứ khi nào người dùng muốn chỉnh sửa, hãy sử dụng phiên bản gốc. Đây là một cái gì đó tôi sử dụng với markdown và tôi đã hài lòng với kết quả. – Maerlyn

Trả lời

1

Không sử dụng Twig. Chỉ cần sử dụng các tệp php với mã này:

<?php 
// Load a php-file and use it as a template 
function template($tpl_file, $vars=array()) { 
    $dir='/usr/local/app/view/'.$tpl_file.'.php'; 
    if(file_exists($dir)){ 
     // Make variables from the array easily accessible in the view 
     extract($vars); 
     // Start collecting output in a buffer 
     ob_start(); 
     require($dir); 
     // Get the contents of the buffer 
     $applied_template = ob_get_contents(); 
     // Flush the buffer 
     ob_end_clean(); 
     return $applied_template; 
    } 
} 
+0

Báo cáo có điều kiện? Vòng lặp? –

+0

Đặt chúng bằng thẻ nội tuyến PHP – Gustav

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