2009-12-06 7 views

Trả lời

15

Nếu bạn có quyền kiểm soát cron hoặc lệnh, bạn có xem xét chuyển đối số dòng lệnh và đọc nó với $_SERVER['argv'][0] không?

* * * * * /usr/bin/php /path/to/script --cron 

Trong kịch bản:

<?php 
if(isset($_SERVER['argv'][0]) and $_SERVER['argv'][0] == '--cron') 
    $I_AM_CRON = true; 
else 
    $I_AM_CRON = false; 
+0

+1 Đề xuất tuyệt vời vẫn còn đơn giản. – David

+1

Làm việc cho tôi, mặc dù trong trường hợp của tôi, tôi đã phải sử dụng '$ _SERVER ['argv'] [1]' :) – bbeckford

6

Cách đáng tin cậy nhất và đầy đủ để kiểm tra nơi kịch bản của bạn là chạy được biết đến với tôi là

php_sapi_name()

Cả này cũng không bất kỳ các phương pháp được liệt kê khác được liệt kê ở đây, tuy nhiên, sẽ cung cấp cho bạn một sự phân biệt giữa chế độ CLI "bình thường" và một cuộc gọi cron. Ý tưởng đối số dòng lệnh của gahooa có lẽ là giải pháp tốt nhất và đáng tin cậy nhất.

+0

Tôi không chắc chắn nếu một cái gì đó đã thay đổi trong vài năm qua, nhưng trên hệ thống của tôi (CentOS 6.6 , PHP 5.4.38, chạy Litespeed), có một sự khác biệt. 'php_sapi_name()' trả về 'cli' khi chạy từ dòng lệnh. Nó trả về 'cgi-fcgi' khi chạy qua cron. – rinogo

2

Bạn có thể kiểm tra PHP_SAPI liên tục để kiểm tra xem người phiên dịch CLI đang được sử dụng:

$is_cli= PHP_SAPI == 'cli';

+0

Mặc dù không liên quan ở đây, có rất ít lý do để sử dụng toán tử '=='. – Nathaniel

6

Đây là một cách đơn giản. Một số thành phần của mảng $_SERVER chỉ được đặt nếu được gọi từ HTTP. Vì vậy bạn có thể:

if(!isset($_SERVER['REQUEST_METHOD'])){ 
// from cron or command line 
}else{ 
// from HTTP 
} 

người khác bao gồm: $_SERVER['HTTP_HOST']

+0

+1 Đề xuất tuyệt vời yêu cầu thay đổi tối thiểu! – David

+1

@David Bạn có thể cho chúng tôi biết những thay đổi mà bạn nghĩ tới không? – matte