2010-01-31 33 views
10

Tiêu đề rất đơn giản. Tôi phải biết về phía máy chủ nếu kịch bản được gọi thông qua yêu cầu HTTP hoặc bằng dòng lệnh. Tôi có thể kiểm tra $_SERVER['argv'] hoặc $_SERVER['argc'].
thực dụng cách nào để thực hiện điều đó?Cách phân biệt giữa yêu cầu http và cli?

Trả lời

12

http://us3.php.net/manual/en/function.php-sapi-name.php

<?php 
echo PHP_SAPI; 
echo php_sapi_name(); 
?> 
+1

Thực hiện tốt, cảm ơn. – erenon

+0

+1 Đây là con đường để đi. Tôi đã gặp vấn đề với việc kiểm tra các biến $ _SERVER và những thứ tương tự. Cái này luôn hoạt động. –

+0

+1 không biết về chức năng này, cảm ơn! –

2

Nhìn vào các phím trong $_SERVER. Nếu nó là một yêu cầu cli, bạn sẽ không thấy bất kỳ bắt đầu với "HTTP".


Dưới đây là một số mã kiểm tra đơn giản:

<?php 

foreach($_SERVER as $k=>$v){ 
    echo "$k: $v\n"; 
} 

?> 

Và đây là kết quả:

[email protected]:~/so$ php cli.php |grep HTTP 
[email protected]:~/so$ 
+0

Không cần cho một vòng lặp khi bạn chỉ có thể kiểm tra một giá trị duy nhất. –

+0

@kemp, câu hỏi của OP được yêu cầu cụ thể cho các lựa chọn thay thế cho argc –

1

Có thể kiểm tra nếu không có $_SERVER['HTTP_HOST'] được thiết lập? Bởi vì tôi tin rằng biến đó được điền thông qua các tiêu đề yêu cầu được gửi đến một tệp trên exection và dòng lệnh có thể không gửi tiêu đề.

+0

Ha, trong vòng 1 giây của mỗi khác ... –

0

Bạn có thể kiểm tra xem biến toàn cầu $argc được đặt hay chưa.

0

Tôi đề nghị kiểm tra if(isset($_SERVER['SERVER_NAME']))

+0

Tôi không chắc chắn rằng điều này không được thiết lập. Nó có thể, đặc biệt nếu bạn đang thực thi tập tin PHP của bạn từ xa .. –

+0

Tôi nghĩ mảng $ _SERVER được dành riêng cho các giao dịch HTTP, nhưng bạn có thể đúng. Nó vẫn còn giá trị đi qua các thành viên khác nhau trong nó như tôi chắc chắn rằng họ khác nhau giữa thực hiện địa phương và từ xa. –

0

Nhưng bạn phải gửi dữ liệu thông qua http (tcp) anyway cho dù kịch bản được gọi là từ cli hoặc từ một trình duyệt

+0

Bạn chỉ là sai. – erenon

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