2008-12-05 17 views
60

Có cách nào để phân biệt nếu tập lệnh được gọi từ dòng lệnh hoặc bởi máy chủ web không?Cách phân biệt lệnh gọi dòng lệnh và máy chủ web?

(Xem What is the canonical way to determine commandline vs. http execution of a PHP script? cho câu trả lời tốt nhất và thảo luận chi tiết hơn - không tìm thấy một mà trước khi gửi bài)


Tôi có một (phi sản xuất) máy chủ với Apache 2.2.10 và PHP 5.2 .6. Trên đó, trong một thư mục có thể truy cập web là tập lệnh PHP của tôi, maintenance_tasks.php. Tôi muốn gọi tập lệnh này từ dòng lệnh hoặc thông qua yêu cầu HTTP (bằng cách mở trong trình duyệt). Có một số biến cho phép tôi xác định đáng tin cậy như thế nào kịch bản được gọi?

(Tôi đã giải quyết các vấn đề về quan điểm khác nhau đối với từng loại gọi và thời gian chờ phản ứng HTTP, chỉ cần tìm kiếm một cách để nói hai loại gọi ngoài)

Tôi sẽ cố gắng điều khác nhau và thêm tôi phát hiện bên dưới.

trùng lặp:What is the canonical way to determine commandline vs. http execution of a PHP script?

+0

Câu hỏi nào trùng lặp với câu hỏi này? Sẽ hữu ích nếu câu hỏi trùng lặp được liên kết đến. – starbeamrainbowlabs

+0

@starbeamrainbowlabs: "Trùng lặp: http://stackoverflow.com/questions/173851/what-is-the-canonical-way-to-determine-commandline-vs-http-execution-of-a-php-s" tại cuối cùng của câu hỏi là không đủ rõ ràng? – Piskvor

+0

Điều đó không hiển thị cho tôi vì một lý do nào đó, cảm ơn câu trả lời mặc dù :) – starbeamrainbowlabs

Trả lời

96

Nếu gọi từ dòng lệnh, biến máy chủ HTTP_USER_AGENT không được thiết lập. Tôi sử dụng liên tục này để xác định, cho dù kịch bản được gọi từ dòng lệnh hay không:

define("CLI", !isset($_SERVER['HTTP_USER_AGENT'])); 

UPDATE: Kể từ khi câu trả lời này vẫn được đánh dấu là 'đúng' một, tôi muốn muốn sửa lại tuyên bố của tôi - dựa vào tiêu đề "Tác nhân người dùng" có thể có vấn đề, vì đó là giá trị do người dùng xác định.

Vui lòng sử dụng php_sapi_name() == 'cli' hoặc PHP_SAPI == 'cli', theo đề xuất của Eugene/cam8001 trong phần nhận xét.

Cảm ơn bạn đã chỉ ra điều này!

+72

Sử dụng 'php_sapi_name() == 'cli'' thay vì –

+19

Hoặc bạn có thể sử dụng hằng số PHP_SAPI http://uk3.php.net /manual/en/function.php-sapi-name.php#refsect1-function.php-sapi-name-notes – cam8001

+3

Sử dụng hằng số ... nếu bạn cho phép người dùng CLI làm những việc bị hạn chế thông thường, thì tất cả tôi 'd cần làm là gửi cho bạn một HTTP_USER_AGENT tùy chỉnh với chuỗi "CLI" ở đâu đó trong đó. –

3

Tôi đã so sánh số siêu liên kết $_SERVER trong cả hai lời gọi. Dường như $_SERVER['argc'] (tức là số lượng đối số truyền cho script) chỉ được đặt khi chạy từ dòng vỏ/lệnh:

<?php 
if (isset($_SERVER['argc'])) { 
    define('CLI', true); 
} else { 
    define('CLI', false); 
} 

Đó dường như làm việc cả trên Linux và Windows host. (Đầu tiên tôi nghĩ đến việc kiểm tra một số biến môi trường, nhưng chúng khác nhau đối với mọi hệ điều hành. Ngoài ra, tất cả các tiêu đề $_SERVER['HTTP_*'] đều bị thiếu trong phiên bản CLI, nhưng tôi không chắc liệu đó có đủ đáng tin cậy không.)

+10

Điều này không hoạt động trên một số máy như argc/argv được làm đầy với các tham số! –

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