Tôi cần xác định xem lời gọi hiện tại của PHP là từ dòng lệnh (CLI) hay từ máy chủ web (trong trường hợp của tôi, Apache với mod_php).
Bất kỳ phương pháp được đề nghị?
Tôi cần xác định xem lời gọi hiện tại của PHP là từ dòng lệnh (CLI) hay từ máy chủ web (trong trường hợp của tôi, Apache với mod_php).
Bất kỳ phương pháp được đề nghị?
Câu trả lời:
php_sapi_name
là chức năng bạn sẽ muốn sử dụng vì nó trả về một chuỗi chữ thường của loại giao diện. Ngoài ra, có hằng số PHP PHP_SAPI
.
Tài liệu có thể được tìm thấy ở đây: http://php.net/php_sapi_name
Ví dụ: để xác định xem PHP có đang được chạy từ CLI hay không, bạn có thể sử dụng chức năng này:
function isCommandLineInterface()
{
return (php_sapi_name() === 'cli');
}
return php_sapi_name() == 'cli';
php-cgi
điều này sẽ không hoạt động. Đổi lại, nó sẽ trả về cgi-fcgi
String. Nếu bạn tải tập lệnh dưới dạng trang web từ trình duyệt, bạn sẽ nhận được apache2handler
. Hi vọng điêu nay co ich. Tôi cần sử dụng php-cgi
để giới thiệu $_GET
các biến : php-cgi myscript.php arg1=one arg2=two
. Kiểm tra cho không bằng apache2handler
nên được ok cho apache
.
"cli"
khi chạy từ công việc định kỳ. Có một số khóa khác nhau để chọn từ bên trong $_SERVER
để xác định đáng tin cậy hơn liệu yêu cầu có đến qua HTTP hay không.
Tôi đã sử dụng chức năng này trong một vài năm
function is_cli()
{
if ( defined('STDIN') )
{
return true;
}
if ( php_sapi_name() === 'cli' )
{
return true;
}
if ( array_key_exists('SHELL', $_ENV) ) {
return true;
}
if ( empty($_SERVER['REMOTE_ADDR']) and !isset($_SERVER['HTTP_USER_AGENT']) and count($_SERVER['argv']) > 0)
{
return true;
}
if ( !array_key_exists('REQUEST_METHOD', $_SERVER) )
{
return true;
}
return false;
}
array_key_exists('REQUEST_METHOD', $_SERVER) return true;
BÌNH THƯỜNG?
array_key_exists('REQUEST_METHOD', $_SERVER)
chính xác để hỗ trợ phát hiện nguồn yêu cầu . Khi ở CLI , $_SERVER
mảng Super Global KHÔNG CÓ khóa REQUEST_METHOD
, nó chỉ tồn tại khi yêu cầu được thực hiện qua Web, do đó, tác giả hoàn toàn nhắm mục tiêu khi kiểm tra nó.
return false;
hay làm gì if ( ! array_key_exists(…)) return true;
?
'REQUEST_METHOD'
là KHÔNG được tìm thấy, thì hàm sẽ trả về FALSE
để chỉ "CLI". Tôi xin lỗi vì đã không chú ý đến phạm vi của chính chức năng ... Tác giả nên sửa nó vì chức năng thực sự hoạt động!
php_sapi_name()
thực sự không phải là cách tốt nhất để thực hiện kiểm tra này bởi vì nó phụ thuộc vào việc kiểm tra đối với nhiều giá trị có thể. Nhị phân php-cgi có thể được gọi từ dòng lệnh, từ tập lệnh shell hoặc như một công việc định kỳ và (trong hầu hết các trường hợp) chúng cũng nên được coi là 'cli' nhưng php_sapi_name()
sẽ trả về các giá trị khác nhau cho những điều này (lưu ý rằng đây không phải là ' Trường hợp với phiên bản đơn giản của PHP nhưng bạn muốn mã của mình hoạt động ở bất cứ đâu, phải không?). Chưa kể rằng năm tới có thể có những cách mới để sử dụng PHP mà bây giờ chúng ta không thể biết. Tôi không muốn nghĩ về điều đó khi tất cả những gì tôi quan tâm là thời tiết tôi có nên bọc đầu ra của mình bằng HTML hay không.
May mắn thay, PHP có một cách để kiểm tra cụ thể. Chỉ cần sử dụng http_response_code()
mà không có bất kỳ tham số nào và nó sẽ trả về TRUE nếu được chạy từ môi trường loại máy chủ web và FALSE nếu được chạy từ môi trường loại CLI. Đây là mã:
$is_web=http_response_code()!==FALSE;
Điều này thậm chí sẽ hoạt động nếu bạn vô tình (?) Đặt mã phản hồi từ tập lệnh chạy từ CLI (hoặc một cái gì đó giống như CLI) trước khi bạn gọi nó.
http_response_code()
đặt mã / trả về mã đặt khi chạy từ CLI. Xác minh bởi <?php function t() { echo var_export(http_response_code(), true) . ' -> ' . (http_response_code() !== false ? 'web' : 'cli') . "\n"; } t(); http_response_code(200); t(); http_response_code(false); t();
. Vì vậy, nếu http_response_code()===false
sau đó, bạn nên đặt cược an toàn để giả sử CLI, nhưng nếu không, bạn cần kiểm tra các số liệu khác.
Tôi nghĩ rằng anh ta có nghĩa là nếu PHP CLI đang được gọi hoặc nếu đó là một phản hồi từ một yêu cầu web. Cách tốt nhất là sử dụng php_sapi_name()
nếu nó đang chạy một yêu cầu web sẽ lặp lại Apache nếu đó là những gì nó đang chạy.
Để liệt kê một số được lấy từ các tài liệuphp_sapi_name()
php trên :
function is_cli() {
return !http_response_code();
}
thí dụ:
if (is_cli()) {
echo 'command line';
} else {
echo 'browser';
}
http_response_code(200);
... nếu bây giờ tôi gọi http_response_code()
nó sẽ trả về 200;
http_response_code();
được gọi từ môi trường CLI, nó sẽ luôn trả về SAI bất kể mã trạng thái thực tế. Tôi đã giải thích điều này trong câu trả lời của mình nhưng bạn cũng có thể tìm ra điều này bằng cách đọc trang hướng dẫn trong phần "Giá trị trả về" hoặc bằng cách thử nó.
php -r 'http_response_code(200); echo http_response_code()."\n";'
xuất ra "200" Trừ khi bạn có thể đảm bảo rằng một số thư viện hoặc khung không biết gì đã không đặt mã phản hồi với http_response_code
(ngay cả trong cli env), thì điều này sẽ hoạt động. Cá nhân, tôi sử dụng$isCli = \defined('STDIN') || isset($_SERVER['argv']) || \array_key_exists('REQUEST_METHOD', $_SERVER)
Tôi đã sử dụng điều này:
php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)
Đây là từ Drush codebase, môi trường. Nơi họ có kiểm tra tương tự để thực hiện.
Thử
isset($_SERVER['REQUEST_METHOD'])
nếu được đặt, bạn đang ở trong trình duyệt.
Thay thế, bạn có thể kiểm tra nếu
isset($_SERVER['argv'])
nhưng điều đó có thể không đúng trên windows CLI, IDK.
Theo http://jp2.php.net/manual/en/features.commandline.php Có một số hằng số chỉ được đặt khi chạy từ CLI. Các hằng số này là STDIN, STDOUT và STDERR. Thử nghiệm cho một trong số đó sẽ cho bạn biết nếu nó ở chế độ cli
cách j Joomla
if (array_key_exists('REQUEST_METHOD', $_SERVER)) die();
Phương pháp ưa thích của tôi:
if (array_key_exists('SHELL', $_ENV)) {
echo "Console invocation";
}
else {
echo "HTTP invocation";
}
// Detect CLI calls
define("IS_CLI_CALL",( strcmp(php_sapi_name(),'cli') == 0 ));
if(IS_CLI_CALL){
//do you stuff here
}
Một cách dễ dàng là thẩm vấn $argv
biến, (Dù sao bạn cũng có thể sẽ làm cho các tham số dòng lệnh). Ngay cả khi không có tham số $argv
trả về một mảng trống.
Nếu nó được đặt, thì cli đã được sử dụng. Sau đó, bạn có thể giả sử tất cả các yêu cầu khác thông qua một số máy chủ web hoặc khác.
ví dụ:
if (isset($argv)) {
// Do the cli thing.
}
Dựa trên câu trả lời của Silver Moon ở trên , tôi đang sử dụng chức năng này để trả về các ngắt dòng chính xác:
/**
* Linebreak function
* @return "/n" if cli, else return <br>
*/
protected static function lb(){
return (defined('STDIN') || php_sapi_name() === 'cli' || isset($_ENV['SHELL']) ||
(empty($_SERVER['REMOTE_ADDR']) && !isset($_SERVER['HTTP_USER_AGENT']) && count($_SERVER['argv']) > 0) ||
!isset($_SERVER['REQUEST_METHOD'])) ? "\n" : "<br>";
}
Câu trả lời chính xác cho câu hỏi này phụ thuộc vào ý định thực sự đằng sau nó:
Nếu trước đây các câu trả lời được đưa ra và ý kiến được viết là đủ để tìm ra một giải pháp hiệu quả.
Nếu sau này, các công thức được đưa ra ở đây sẽ thất bại nếu công cụ được chạy dưới dạng cronjob hoặc làm công việc nền từ một trình nền khác - trong trường hợp đó tôi đề nghị kiểm tra thêm nếu STDIN
là TTY:
function at_tty() {
return defined("\STDIN") && posix_isatty(\STDIN);
}
Tôi sẽ thử:
echo exec('whoami');
Thông thường máy chủ web được chạy dưới một tên người dùng khác, vì vậy điều đó nên được nói.