Tôi cần phải xác định xem tệp PHP đang được tải thông qua cron hoặc dòng lệnh trong mã. Tôi có thể làm cái này như thế nào?Cách xác định xem tệp PHP được tải thông qua cron/dòng lệnh
Trả lời
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;
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à
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.
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
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';
Mặc dù không liên quan ở đây, có rất ít lý do để sử dụng toán tử '=='. – Nathaniel
Đâ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']
Loaded vào những gì? Trong môi trường nào? – wallyk
Trùng lặp: http://stackoverflow.com/questions/1848803/execute-php-via-cron-no-input-file-specified –