2011-06-29 59 views
5

từ sự hiểu biết của tôi, nếu bạn sử dụng một chương trình đệm ẩn PHP như APC, eAccelerator, v.v ... thì opcodes sẽ được lưu trữ trong bộ nhớ để thực hiện nhanh hơn khi có yêu cầu tiếp theo. Câu hỏi của tôi là, tại sao nó không phải là tốt hơn/nhanh hơn để biên dịch kịch bản của bạn, giả sử bạn đang sử dụng một trình biên dịch như phc hoặc thậm chí HPHP (mặc dù tôi biết họ có vấn đề với cấu trúc động)? Tại sao phải lưu trữ opcodes vì ​​chúng phải được Zend Engine đọc lại, sử dụng các hàm C để thực thi nó, khi bạn chỉ có thể biên dịch và bỏ qua bước đó?Câu hỏi về bộ nhớ cache PHP vs biên dịch

+0

Ngoài ra còn có phần 2 cho câu hỏi này, mà tôi đã bắt đầu một chuỗi riêng biệt cho: http://stackoverflow.com/questions/6525187/why-are-dynamic-constructs-difficult-for-php-compilers-hphp – blacktie24

Trả lời

2

Bạn không thể đơn giản biên dịch sang c và có tập lệnh php của bạn thực hiện theo cùng một cách. HPHP thực sự biên dịch, nhưng nó không hỗ trợ toàn bộ superset của các tính năng php.

Trình biên dịch khác thực sự chỉ nhúng trình thông dịch php vào nhị phân, do đó bạn chưa thực sự biên dịch mã.

PHP không có nghĩa là được biên soạn. opcode caching rất nhanh và đủ tốt cho 99% các ứng dụng trên mạng. Nếu bạn có mức lưu lượng truy cập của facebook và bạn đã tối ưu hóa db cuối của mình, việc biên dịch có thể là cách duy nhất để tăng hiệu suất.

PHP không phải là lớp mỏng đối với thư viện std c.

+0

gracias dành thời gian để trả lời. Bạn có thể giải thích thêm ý nghĩa của bạn khi bạn nói "PHP không phải là một lớp mỏng đối với thư viện std c"? – blacktie24

1

Nếu PHP không có eval(), có thể bạn sẽ có thể thực hiện một bản dịch nhị phân PHP được biên dịch trực tiếp một cách dễ dàng. Nhưng kể từ khi PHP có thể tự động xây dựng/thực thi các kịch bản trên bay qua eval(), nó không thể thực hiện một nhị phân đầy đủ. Bất kỳ nhị phân nào cũng nhất thiết phải chứa toàn bộ PHP vì trình biên dịch sẽ không biết mã động của bạn có thể làm gì. Bạn sẽ đi từ một kịch bản 1 hoặc 2k nhỏ thành một nhị phân lớn megabyte.

+0

thx để trả lời! Giả sử tôi không sử dụng eval() và tôi gặp vấn đề về cấu trúc động (có một câu hỏi khác về trình biên dịch và cấu trúc động trong một chuỗi khác, mà tôi đã đăng dưới dạng nhận xét theo câu hỏi ban đầu), sau đó có thể hiệu quả để biên dịch? – blacktie24

+0

Tôi không biết về 'hiệu quả', nhưng không thể thấy tại sao nó không thể thực hiện được. –

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