2011-07-14 44 views
9

Biến tĩnh PHP kéo dài bao lâu, tức là "chạy PHP" kéo dài bao lâu? Với việc nói một chương trình dòng lệnh có một khởi đầu và kết thúc được xác định, nhưng trong web w/AJAX tôi không biết cách xác định điều này.Biến tĩnh PHP kéo dài bao lâu?

Dưới đây là 3 cách tôi đã thấy một tập lệnh PHP được bắt đầu.

  1. tài khoản (Requesing một trang PHP)
  2. javacript gọi PHP (AJAX)
  3. PHP gọi hơn PHP qua một tiêu đề()

Trong ứng dụng thực tế của tôi, tôi có javascript gọi một php script thông qua AJAX script sử dụng header() để tải lại trang web. Điều này sẽ được coi là hai lần chạy khác nhau. Mỗi biến có các biến tĩnh của riêng chúng không liên quan.

Trả lời

15

Biến PHP tồn tại suốt đời của tập lệnh chạy qua trình thông dịch. Trong trường hợp yêu cầu web, đây là thời gian xử lý các yêu cầu. Ba trường hợp của bạn là tất cả các yêu cầu tới một máy chủ, và do đó được xử lý giống nhau: các biến tĩnh tồn tại cho đến khi tập lệnh chấm dứt sau khi xử lý yêu cầu.

Tuổi thọ của PHP (và các biến của nó) trên một yêu cầu:

  1. Yêu cầu được gửi đến máy chủ, cho dù bằng cách sử dụng, ajax, curl qua PHP hoặc những gì-có-bạn
  2. PHP liên quan tập lệnh được thực thi, cho dù là một mô-đun trên máy chủ web của bạn, quy trình công nhân CGI hay các tùy chọn khác
  3. Kịch bản được thực hiện, phản hồi yêu cầu (nếu có) được tạo và gửi
  4. (tùy chọn) tập lệnh tiếp tục thực thi một số công việc khác cho đến khi chấm dứt cuối cùng, tại thời điểm đó tất cả các biến của nó d tức là với nó.
+0

Giả sử cuộc gọi Ajax của tôi gọi tệp tin1.php, nó bao gồm tệp2.php và instatiates một ojbect gửi tiêu đề. Điều này sẽ được coi là hai lần chạy. Tệp 1 chỉ đơn giản bao gồm File2 vì vậy đây là một lần chạy, nhưng tôi gọi một tiêu đề() để tải lại trang. Đây có phải là lần chạy thứ hai, lệnh gọi header() không? Nó được gọi từ run1 –

+0

Cuộc gọi ajax của bạn tạo ra một yêu cầu thực hiện file1.php, bao gồm nội dung của file2.php, gửi một tiêu đề hơn là kết thúc cho lần chạy # 1. Tiêu đề tải lại được gửi bởi chạy # 1 tạo ra một yêu cầu mới (cho trang được tải lại), và do đó bắt đầu chạy # 2. Nếu chạy # 2 là một yêu cầu khác cho file1.php trên một lần nữa, nó không phải là chạy cùng file1.php như chạy # 1! – shelhamer

+0

bao gồm một tệp trong PHP là * không * giống như thực hiện một yêu cầu web khác. các biến tồn tại trên các lệnh 'include' và' require', nhưng chúng không được truyền qua các cuộc gọi 'curl', trừ khi bạn sử dụng một phương thức chia sẻ dữ liệu khác, chẳng hạn như Cơ sở dữ liệu, Cookie và Phiên. – zzzzBov

1

Cả ba đều giống nhau.

Trong mỗi trường hợp, trình duyệt của người dùng đang thực hiện yêu cầu http cho url. Thời gian chạy là từ thời điểm máy chủ nhận được yêu cầu đến khi nó được điền đầy đủ.

2

Trong dòng lệnh có đầu và cuối được xác định.

Không có sự khác biệt trong PHP đang chạy trên máy chủ. Khi yêu cầu web được thực hiện cho tập lệnh, tập lệnh sẽ chạy đến cuối tập lệnh hoặc cho đến khi nó bị lỗi hoặc có thời gian chờ (và có thể là các vấn đề tương tự khác).

AJAX không chạy phía máy chủ. AJAX là một cuộc gọi không đồng bộ phía máy khách khác với tài nguyên máy chủ. Tất cả mọi thứ được thực hiện cho yêu cầu đầu tiên như xa như xác thực, xác nhận, kiểm tra đầu vào, vv phải được thực hiện với mọi yêu cầu tiếp theo. Sự khác biệt trong phản hồi AJAX là tập lệnh PHP có khả năng trả về chỉ nội dung được yêu cầu.

Thời gian duy nhất một chương trình sẽ "tồn tại" là nếu nó được yêu cầu tiếp tục. PHP có thể được yêu cầu chờ đợi và thực hiện các hành động thông qua các ổ cắm web, nhưng điều đó dường như nằm ngoài phạm vi câu hỏi của bạn.

1

Tĩnh PHP (có thể được coi là "toàn cầu" theo cách thủ tục) không tồn tại trong bất kỳ trường hợp nào của bạn.

Trong mỗi yêu cầu HTTP mới được thực hiện và trạng thái biến Php bị mất.

2

"Chạy PHP" luôn bắt đầu thực hiện cho đến khi kết thúc tập lệnh. Vì vậy, nếu bạn gọi một kịch bản PHP với ajax hoặc PHP gọi một PHP khác thông qua một header(), mỗi cuộc gọi là một lần chạy duy nhất. Các biến tĩnh được khởi tạo trước đó không có trạng thái liên tục và sẽ được định nghĩa lại.

Biến tĩnh hoặc không ... nếu bạn muốn có trạng thái dữ liệu liên tục trong suốt các yêu cầu đó, bạn sẽ phải lưu nó trong phiên, cookie, cơ sở dữ liệu hoặc trong bộ nhớ cache.

1

Tùy thuộc vào thiết lập máy chủ. Thông thường, khi bạn thực hiện một yêu cầu, trình thông dịch PHP được tải, phân tích cú pháp tập lệnh, máy chủ của bạn phun ra các kết quả và trình thông dịch bị phá hủy. Điều này xảy ra cho mỗi yêu cầu, bất kể yêu cầu đó có bắt nguồn từ trình duyệt của người dùng hay AJAX hay không.Điều này có nghĩa là các biến "tĩnh" chỉ hợp lệ cho đến khi thông dịch viên bị phá hủy, một lần nữa, là ở cuối mỗi yêu cầu. (HTTP là không trạng thái)

Bạn có ý gì khi "PHP gọi PHP nhiều hơn thông qua tiêu đề()"? Bạn đang đề cập đến một chuyển hướng? Trong trường hợp đó, đó là một yêu cầu mới. Nếu bạn có nghĩa là "PHP gọi PHP nhiều hơn thông qua một bao gồm", nó thường không phải là một yêu cầu mới (trường hợp cạnh là bạn đang bao gồm một kịch bản PHP từ một bên thứ 3 .. nguy hiểm và không được khuyến khích). Với một bao gồm, PHP chỉ đơn giản là tải và thực hiện các tập tin trong bối cảnh tương tự như kịch bản gốc.

1

Tập lệnh PHP dừng khi bạn thoát, đến cuối tập lệnh hoặc không thành công.

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