2011-02-10 51 views
6

OK, điều này nghe có vẻ hơi điên rồ, nhưng hãy chịu đựng tôi ở đây trong một phút.Trình phân tích cú pháp SSI được viết bằng PHP?

Tôi đang làm việc trên một trang web nơi tiêu chuẩn là sử dụng SSI để bao gồm tiêu đề trang, chân trang và menu. Các tệp được bao gồm sử dụng các điều kiện SSI để xử lý các trình duyệt khác nhau, một số #include làm tổ và một số mẹo #set/#if để làm nổi bật trang hiện tại trong menu. Nói cách khác, nó không chỉ là #include chỉ thị trong SSI.

Tôi chắc chắn một số có thể tranh luận với tính thẩm mỹ, nhưng nó thực sự hoạt động khá độc đáo, đối với HTML tĩnh.

Bây giờ, vấn đề: Tôi muốn chỉ "#include" cùng một tệp tiêu đề và chân trang html được phân tích cú pháp SSI từ tập lệnh PHP của tôi, do đó tránh trùng lặp mã và vẫn duy trì giao diện thống nhất của trang web. Nếu PHP đang chạy trong môi trường mod_php thông thường, tôi có thể làm điều đó bằng cách sử dụng hàm virtual() của PHP. Thật không may, trang web đang sử dụng FastCGI/suexec để chạy PHP (để mỗi VirtualHost có thể chạy như một người dùng khác), và điều này phá vỡ ảo().

Tôi đã sử dụng một trình phân tích cú pháp SSI khá đơn giản mà tôi đã viết bằng PHP (nó xử lý #includes và một số câu lệnh #if đơn giản), nhưng tôi muốn một giải pháp tổng quát hơn. Vì vậy, trước khi tôi đi hạt và viết một số phân tích cú pháp SSI đầy đủ, đầy đủ hơn, có ai biết về một trình phân tích cú pháp SSI hoàn chỉnh được viết bằng PHP không? Đương nhiên, tôi cũng mở cửa cho các giải pháp khác hoạt động theo những ràng buộc mà tôi đã vạch ra.

Cảm ơn bạn rất nhiều vì đã dành thời gian.

+1

Tôi sẽ không gọi cho SSI bao gồm các tệp có "' # include' nesting và '# set' /' # if' trickery "* static * HTML. ;) Nếu không, câu hỏi thú vị. : D – deceze

+0

Việc triển khai duy nhất tôi biết là http://nanoweb.si.kz/manual/mod_include.html - nhưng điều đó chỉ thực hiện ba chức năng tiêu chuẩn và không cấu thành nhiều bộ phân tích cú pháp. – mario

+0

@deceze: Vâng ... chúng "tĩnh" theo nghĩa là mỗi tệp HTML do người dùng yêu cầu tạo ra cùng một đầu ra mỗi lần. Tuy nhiên, tôi đồng ý rằng các tệp được bao gồm SSI không tĩnh. –

Trả lời

2

Hãy xem ESI: http://en.wikipedia.org/wiki/Edge_Side_Includes

Bạn có thể tạo một PHP-proxy để xử lý chúng, đó là HttpCache trong Symfony2: https://github.com/fabpot/symfony/blob/master/src/Symfony/Component/HttpKernel/HttpCache/Esi.php

Hoặc sử dụng một proxy HTTP như Varnish, hơn performant hơn Symfony2. ..

+0

Ý tưởng thú vị. Thật không may, tôi không có toàn quyền kiểm soát máy chủ, vì vậy tôi không thể cài đặt một proxy đầy đủ như Varnish. Symfony có vẻ hữu ích, và tôi chắc chắn sẽ điều tra nó hơn nữa cho các mục đích khác, nhưng tôi thực sự hy vọng cho một giải pháp nhỏ hơn đáng kể. Symfony có vẻ trên 20 megabyte để cài đặt cơ sở. Tôi không biết làm thế nào tốt là tải modularly, nhưng nó chắc chắn có vẻ như overkill nghiêm trọng cho vấn đề tương đối đơn giản này. –

1

Tôi nhận ra đây là một câu hỏi cũ, nhưng tôi đã gặp phải vấn đề tương tự như vậy vài năm trước, mặc dù với một triển khai perl. Tôi đã đi trước và chia rẽ một nỗ lực trước đó và có khá xa để thực hiện một apache (2.2.22) mod_include giả lập/phân tích cú pháp như một mô-đun perl http://search.cpan.org/dist/CGI-apacheSSI/lib/CGI/apacheSSI.pm Ngay sau đó tôi tìm thấy apache output filters và nhận ra giải pháp hoàn hảo cho nhu cầu của tôi . Về cơ bản, bạn có thể yêu cầu apache phân tích cú pháp đầu ra của tập lệnh của bạn như thể nó là tệp .shtml hoặc .php (hoặc bất kỳ tệp nào). Vì vậy, bạn có thể xuất ra đánh dấu SSI từ một kịch bản perl hoặc php (hoặc bất cứ điều gì), và có phân tích cú pháp apache đó. Đây là cách bạn có thể làm điều đó (trong tập tin .htaccess của bạn):

AddOutputFilter INCLUDES .cgi 

Đó là cho các tập tin cgi bình thường, nhưng hãy cẩn thận, điều này cho biết thêm khá nhiều chi phí cho tất cả các file cgi được thực thi, vì vậy những gì tôi thực sự làm là tạo một phần mở rộng đặc biệt để nó chạy như một cgi mà sau đó đã sản lượng của nó phân tích cú pháp, mà không có chi phí bổ sung vào file cgi bình thường:

<Files ~ ".pcgi$"> 
    Options +SymLinksIfOwnerMatch +Includes 
    AddOutputFilter INCLUDES .pcgi 
</Files> 

cho php bạn chỉ có thể làm điều gì đó như:

<Files ~ ".pphp$"> 
    Options +SymLinksIfOwnerMatch +Includes 
    AddOutputFilter INCLUDES .pphp 
</Files> 

và điều đó nên làm các thủ thuật! Hy vọng rằng sẽ giúp một ai đó ra khỏi đó.

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