2010-05-30 29 views
16

Tôi đã sử dụng các ứng dụng mails, merb, django và asp.net mvc trong quá khứ. Những gì họ có chung (có liên quan đến câu hỏi) là họ có mã thiết lập khuôn khổ. Điều này thường có nghĩa là tạo các đối tượng và trạng thái được duy trì cho đến khi máy chủ web được tái chế (như thiết lập định tuyến hoặc kiểm tra bộ điều khiển nào có sẵn, v.v.).Cách duy trì đối tượng giữa các yêu cầu trong PHP

Theo như tôi biết PHP là giống như một kịch bản CGI được biên dịch một số bytecode mỗi khi nó chạy, và sau khi yêu cầu nó bị loại bỏ. Tất nhiên bạn có thể có các phiên, để duy trì dữ liệu giữa các yêu cầu từ cùng một người dùng, và như tôi thấy có các phần mở rộng như APC, mà bạn có thể lưu giữ các đối tượng giữa các yêu cầu ở cấp độ máy chủ.

Câu hỏi của tôi là: làm thế nào người ta có thể tạo một ứng dụng PHP hoạt động như đường ray và như vậy? Tôi có nghĩa là một ứng dụng mà trên các yêu cầu đầu tiên thiết lập khuôn khổ, sau đó trên các yêu cầu thứ 2 và sau đó sử dụng các đối tượng đã được thiết lập. Có một số được xây dựng trong bộ nhớ đệm cơ sở trong mod_php? (ví dụ: lưu trữ bytecode được biên dịch của các ứng dụng php đã thực hiện) Hoặc đang sử dụng APC hoặc một số phần mở rộng tương tự là cách duy nhất để giải quyết vấn đề này? Bạn sẽ làm điều này như thế nào?

Cảm ơn.

EDIT: Câu hỏi thay thế: nếu tôi tạo một ứng dụng PHP lớn có thời gian cài đặt rất lớn, nhưng thời gian chạy nhỏ (như trong các khung được đề cập ở trên) thì tôi nên "lưu" những thứ đã được đặt lên (điều này có thể có nghĩa là rất nhiều thứ, ngoại trừ có lẽ các kết nối cơ sở dữ liệu, bởi vì bạn đã có các kết nối liên tục trong PHP).

Để biện minh cho thời gian thiết lập lớn: điều gì sẽ xảy ra nếu tôi đang sử dụng phản chiếu PHP để kiểm tra xem đối tượng nào có sẵn và đặt thời gian chạy theo đó. Thực hiện rất nhiều phản ánh thường chậm, nhưng người ta phải làm điều đó chỉ một lần (và chỉ đánh giá lại nếu mã nguồn được sửa đổi).

EDIT2: Có vẻ như đó là APC rồi. Thực tế là nó lưu trữ bytecode tự động là tốt để biết.

Trả lời

5

Không chắc chắn liệu APC có phải là giải pháp duy nhất hay không nhưng APC sẽ giải quyết mọi vấn đề của bạn.

Đầu tiên, tập lệnh của bạn sẽ được biên dịch một lần với APC và mã byte được lưu trữ trong bộ nhớ.

Nếu bạn có điều gì đó mất nhiều thời gian để thiết lập, bạn cũng có thể lưu nó trong APC dưới dạng dữ liệu người dùng. Ví dụ: tôi thực hiện việc này mọi lúc,

  $table = @apc_fetch(TABLE_KEY); 

      if (!$table) { 
        $table = new Table(); // Take long time 
        apc_store(TABLE_KEY, $table); 
      } 

Với APC, nhiệm vụ tạo bảng chỉ được thực hiện một lần cho mỗi trường hợp máy chủ.

+0

Việc biên dịch trước các tập lệnh chỉ là một phần của công việc. Nhưng nếu tôi thấy nó một cách khoa học, tôi cũng phải làm phần này bằng cách sử dụng PHP, đúng không? Tôi có nghĩa là ví dụ mod_php sẽ không làm điều này cho tôi. – SztupY

+1

Mã-bộ nhớ đệm là minh bạch. Bạn chỉ cần cài đặt APC và nó sẽ tự động lưu trữ mã byte của bạn trừ khi bạn vô hiệu hóa nó. Dữ liệu ứng dụng của bạn như $ table trong ví dụ của tôi sẽ không được lưu trữ tự động. Bạn phải làm điều đó cho chính bản thân mình. –

+4

Tại sao địa ngục bạn đang kìm nén 'apc_fetch'? ** 'afc_fetch' trả về biến được lưu trữ hoặc mảng biến thành công; FALSE về lỗi **. –

0

Tôi nghĩ bạn đang thực hiện một số khái quát hóa không chính xác. Tất cả các khung công tác đó (ví dụ: Rails) có thể chạy với các cấu hình khác nhau. Theo một số, một quá trình được tạo ra cho mọi yêu cầu. Điều này rõ ràng làm tổn thương hiệu suất, nhưng nó cho thấy rằng các khuôn khổ này không phụ thuộc vào một quá trình chạy dài. Họ có thể thiết lập mọi thứ (tệp cấu hình thô, tạo đối tượng, v.v.) mọi yêu cầu nếu cần.

Tất nhiên, mod_php (cách PHP thường được sử dụng) chạy bên trong quy trình máy chủ web, không giống như CGI. Vì vậy, tôi không thấy bất cứ điều gì khác biệt về cơ bản giữa CakePHP (ví dụ) và Rails.

Tôi nghĩ có lẽ bạn đang tìm kiếm một cái gì đó giống như của Python WSGI hoặc của Ruby Rack, nhưng đối với PHP. Điều này chỉ định một giao diện (độc lập với cách ngôn ngữ được chạy) cho một ứng dụng. Đối với một yêu cầu mới, một cá thể mới của một đối tượng ứng dụng được tạo ra. Theo tôi biết, điều này không tồn tại cho PHP.

+1

Có, nhưng chúng thường không bị loại bỏ và được tạo lại sau mỗi yêu cầu. Tất nhiên bạn có thể làm cho đường ray hoạt động theo cách đó, nhưng nó cũng sẽ có nghĩa là bạn có 3-4 giây thời gian thiết lập mỗi yêu cầu. Và đối với một số thậm chí nếu có các quy trình mới được tạo ra, chúng sẽ chia sẻ điều gì đó từ khung công tác thiết lập. – SztupY

+0

3-4 giây của thời gian thiết lập là một chút cường điệu cực đại, yêu cầu đường ray tiêu chuẩn mất ít hơn 100 miliseconds trên máy phát triển của tôi (có nghĩa là RoR đang chạy trong phát triển có nghĩa là nó phân tích các tệp mỗi lần). Chỉnh sửa: Bạn có thể có một thiết lập phức tạp hơn nhiều so với những gì một khung tiêu chuẩn có để bình luận này là không tồn tại. –

+0

Rails thường được chạy như một quá trình riêng biệt mà máy chủ web kết nối khi nó cần để phục vụ một quá trình khác. Hành khách/mod_rails được sử dụng để xử lý các quy trình này. AFAIK mod_php sẽ không tạo ra một quá trình ứng dụng máy chủ riêng biệt (cũng như nó sẽ kết nối với nó), nó sẽ chỉ giải thích tập tin php, và nó thuộc vào tập tin php này để làm những gì nó cần làm. Nhìn vào mã nguồn CakePHP có vẻ như nó có một số hỗ trợ bộ nhớ đệm, nhưng tôi không biết những gì nó thực sự lưu trữ. – SztupY

3

PHP (và ruby ​​cho vấn đề đó) là ngôn ngữ diễn giải. Đó là họ phân tích cú pháp các tập tin mỗi khi chúng được yêu cầu và tôi cho rằng bạn có thể nói được chuyển đổi thành một mã byte giả. Đó là nhiều hơn 'rõ ràng' người ta có thể nói rằng PHP là nhiều hơn như thế này hơn nói RoR nhưng cả hai đều hành xử theo cùng một cách.

Tính năng lưu giữ dữ liệu giữa các yêu cầu là tính năng của máy chủ không phải ngôn ngữ của chính nó. Ví dụ, định tuyến RoR bạn nói là trong thực tế được lưu trữ nhưng được lưu trữ trong bộ nhớ cục bộ của máy chủ. Nó không được biên dịch và lưu trữ để đọc nhanh hơn.Máy chủ (và bởi máy chủ tôi có nghĩa là cả hai hộp & trường hợp dịch vụ web) khởi động lại thông tin này đã biến mất. Việc 'thiết lập khung công tác' mà bạn nói vẫn liên quan đến việc phân tích cú pháp tệp EACH liên quan đến khung công tác. Rails phân tích từng tập tin trong suốt quá trình yêu cầu một lần nữa và một lần nữa, các tính năng mức sản xuất có thể thực sự lưu dữ liệu này vào bộ nhớ nhưng chắc chắn trong quá trình phát triển nó không. Lý do duy nhất tôi đề cập đến là vì nó minh họa rằng đó là một tính năng của máy chủ chứ không phải ngôn ngữ.

Để đạt được điều tương tự trong PHP, bạn có thể sử dụng Máy chủ Zend. Theo tôi biết đây là trình thông dịch PHP duy nhất sẽ biên dịch và sử dụng mã byte khi được yêu cầu. Nếu không, bạn sẽ cần phải tìm cách lưu trữ dữ liệu bạn muốn tồn tại lâu hơn các yêu cầu. APC như bạn đã đề cập là một tính năng rất mạnh mẽ, một bản phân phối nhiều hơn là Memcached và sau đó tất nhiên có nhiều dạng ổn định hơn như đĩa & sql.

Tôi muốn biết lý do bạn muốn tính năng cụ thể này. Bạn có nhận thấy các vấn đề về hiệu năng sẽ được 'giải quyết' bằng cách làm điều này không?

+0

Khi chỉnh sửa gợi ý tôi đang sử dụng sự phản chiếu để xây dựng rất nhiều thứ (chủ yếu là DRY), và nó khá chậm (ít nhất là về thời gian chạy tổng thể: 95% là thời gian thiết lập), nhưng chỉ cần được thực hiện một lần. Tôi chỉ tò mò về cách cộng đồng PHP giải quyết "vấn đề" như thế này (hoặc thực sự liệu họ có giải quyết được "vấn đề" này không?). – SztupY

+0

Bạn có sẵn sàng thảo luận về tình huống cụ thể bạn đang ở và có lẽ chúng ta có thể thảo luận về 'các giải pháp thay thế'? Đừng làm điều đó có nghĩa là "bạn đang làm sai" Tôi chỉ muốn có thêm một số thông tin để tôi có thể đưa bạn đến đúng nơi.Nếu chúng là những thứ cần phải được thiết lập hiếm khi sử dụng máy chủ bộ nhớ đệm như APC/Memcached (trước đây chỉ dành cho máy chủ đơn cài đặt, sau đó cho nhiều máy chủ và kiểm soát nhiều hơn). –

+0

Tôi thực sự chỉ tò mò. Trong 4 năm qua, tôi đã không sử dụng PHP, và đã quen với cách các khung công tác khác hoạt động. Tôi thích rằng họ sử dụng rất nhiều phản ánh (chủ yếu là ASP.NET MVC) trong giai đoạn thiết lập để được nhiều DRY, và tôi muốn làm như vậy trong PHP. Rõ ràng PHP không được thiết kế để sử dụng phản chiếu nhanh, nhưng tôi không quan tâm trừ khi điều này chỉ được thực hiện một vài lần và không phải cho tất cả các yêu cầu. – SztupY

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