2010-01-02 21 views
74

Tôi có một tập lệnh phổ biến mà Im bao gồm trong các tệp PHPcron của tôi và các tệp đang truy cập thông qua trình duyệt. Một số phần của mã, tôi chỉ cần cho các tập tin không phải cron. Làm thế nào tôi có thể phát hiện xem thực hiện là từ CLI hoặc thông qua trình duyệt (Tôi biết nó có thể được thực hiện bằng cách đi qua một số đối số với các tập tin cron nhưng tôi không có quyền truy cập vào crontab). Còn cách nào khác không ?Trong PHP, làm thế nào để phát hiện việc thực hiện là từ chế độ CLI hoặc thông qua trình duyệt?

Trả lời

136

Sử dụng php_sapi_name() chức năng.

if (php_sapi_name() == "cli") { 
    // In cli-mode 
} else { 
    // Not in cli-mode 
} 

Dưới đây là một số lưu ý liên quan từ các tài liệu:

php_sapi_name - Trả về loại của giao diện giữa máy chủ web và PHP

Mặc dù chưa hoàn chỉnh, các giá trị lợi nhuận có thể bao gồm AOLserver , apache, apache2filter, apache2handler, caudium, cgi (cho đến khi PHP 5.3), cgi-fcgi, cli, cli-server, liên tục, nhúng, isapi, litespeed, milter, nsapi, phttpd, pi3web, roxen, thttpd, tux và webjames .

+2

+1 cách duy nhất để thực hiện điều đó. –

+4

PHP_SAPI cũng có thể được sử dụng cho điều này, vì vậy nó không thực sự là cách duy nhất để làm điều này – mishu

+11

Đây từng là một liên kết chỉ trả lời cho đến khi ai đó sao chép câu trả lời của @Linus Unnebäck. Bad habbit! Downvote này, upvote khác ... –

3

Tôi nghĩ bạn có thể thấy nó từ biến $ _SERVER. Hãy thử in ra mảng $ _SERVER cho cả hai trình duyệt & CLI và bạn sẽ thấy sự khác biệt.

+1

này có thể đúng, nhưng có thể không phải là một cách đáng tin cậy để xác định giao diện được sử dụng. Cách thích hợp để kiểm tra là với 'php_sapi_name()'. – DesignerGuy

13

Có một hằng số PHP_SAPI có cùng giá trị với php_sapi_name().

(có sẵn trong PHP> = 4.2.0)

+0

Đây là cách tốt nhất! – Ankit

-4

Bạn có thể sử dụng:

if (isset($argc)) 
{ 
    // CLI 
} 
else 
{ 
    // NOT CLI 
} 
+3

-1 - '$ argc' có thể đã được đặt trong ứng dụng, phải không? Không phải là một phương pháp đáng tin cậy. Chi phí cho tôi nửa ngày làm việc một lần. 'php_sapi_name()' là cách duy nhất tôi biết. –

+0

cũng $ argv/$ argc có thể được lấp đầy bằng các biến GET trên một số cấu hình! –

61
if(php_sapi_name() == "cli") { 
    //In cli-mode 
} else { 
    //Not in cli-mode 
} 
Các vấn đề liên quan