Chỉ số không xác định Cron.php 'SCRIPT_FILENAME'


7

Tóm tắc

Tôi đang gặp lỗi này:

Chỉ số không xác định Cron.php 'SCRIPT_FILENAME'

Tại sao mã sau đây trong lõi magento cron.php?

// Only for urls
// Don't remove this
$_SERVER['SCRIPT_NAME'] = str_replace(basename(__FILE__), 'index.php', $_SERVER['SCRIPT_NAME']);
$_SERVER['SCRIPT_FILENAME'] = str_replace(basename(__FILE__), 'index.php', $_SERVER['SCRIPT_FILENAME']);

Vì vậy, crontab của tôi có những điều sau đây (trong cPanel - vâng, tôi ghét cPanel nhưng tôi không có lựa chọn nào khác ):

*/5 * * * * /bin/sh /home/user/public_html/cron.sh 2>&1

Khi chạy, tôi nhận được đầu ra này:

Array
(
    [MAILTO] => ***
    [SHELL] => /usr/local/cpanel/bin/jailshell
    [USER] => ***
    [PATH] => /usr/bin:/bin
    [PWD] => /home/***
    [LANG] => en_US.UTF-8
    [HOME] => /home/***
    [SHLVL] => 2
    [LOGNAME] => ***
    [_] => /usr/bin/php
    [PHP_SELF] =>
    [REQUEST_TIME_FLOAT] => 1427981401.51
    [REQUEST_TIME] => 1427981401


    [argv] => Array
        (
            [0] => /home/***/public_html/cron.php
        )

    [argc] => 1
)

Câu trả lời:


3

Như mam08ixo đã tuyên bố một số _SERVERthuộc tính có sẵn trên CLI, tuy nhiên, do một số cấu hình bất thường, tôi đã giải quyết điều này bằng cách sử dụng php-cli:

php-cli /home/***/public_html/cron.php > /dev/null &2>1

3

Đây là những gì làm việc cho tôi:

php -f /home/USERNAME/www/cron.php >/dev/null 2>&1

Và tôi đã phải sửa đổi cron.php, chỉ cần sử dụng

$isShellDisabled = true;

thay vì

$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;

Tham khảo: http://support.xtento.com/wiki/Setting_up_the_Magento_cronjob

Tôi tiếp tục nhận được chỉ mục Không xác định trong nhật ký lỗi của tôi nhưng nó đã hoạt động. Tuy nhiên, để làm cho nó tốt hơn, tôi đã khởi tạo các biến trong cron.php để loại bỏ các lỗi. Thích như vậy:

$_SERVER['SCRIPT_NAME'] = '';
$_SERVER['SCRIPT_FILENAME'] = '';

2

Làm thế nào mà bạn "cuối cùng" nghĩ rằng $_SERVER thông tin môi trường thực thi (!) Không có sẵn khi chạy tập lệnh qua CLI?

Các tài liệu tham khảo ngôn ngữ PHP có chứa một số gợi ý và ý kiến mà nó thực hiện. Ngoài ra, trên bất kỳ máy nào trong khu vực của tôi, $_SERVERđều có dân số tốt. Vì vậy, nếu bạn nhận được một thông báo chỉ mục không xác định , rất có thể là do một số đặc sản với môi trường của bạn chứ không phải là một thất bại chung cron.php.

Đặc biệt chú ý đến các variables_orderthiết lập.

Phụ lục: Bạn có thể muốn coi $_SERVERthông tin có được từ thực thể phục vụ . Có thể là shell, mod_php, fastcgi hoặc bất cứ thứ gì. Đó là lý do tại sao nội dung (khóa) của biến phụ thuộc vào môi trường hiện tại. Điểm mấu chốt là, $_SERVERKHÔNG chỉ được điền khi được phục vụ qua máy chủ web.


Tôi sử dụng: /usr/bin/php -d display_errors=1 -f cron.phpvà các lỗi xảy ra. Ngoài ra tôi đã thực hiện một thử nghiệm với print_r($_SERVER)bên trong cron.phpvà các chỉ mục không tồn tại.
tro

dựa trên phụ lục của bạn, điều đó là chính xác - nhưng tại sao magento vẫn lỗi với các chỉ mục không xác định - thật ngu ngốc.
tro

2

Vì đây là kết quả hàng đầu trong việc Google mất tích SCRIPT_FILENAMEvới cron nên tôi sẽ kêu gọi.

Đối với tôi, trên một ecom khác (CS-Cart trên cPanel OpenVZ + FastCGI), các chỉ mục bị thiếu của cron đã được giải quyết / tìm thấy bằng cách sử dụng đường dẫn đến php trong cron thay vì chỉ phphoặc php-cli. Chạy which phptrong shell hoặc sau đó sử dụng nó trong cPanel cron builder. Tôi đang giả thuyết rằng điều này có thể là do cPanel sử dụng phiên bản PHP nội bộ của riêng mình, có lẽ có một số bí ẩn FastCGI, mặc dù tôi vẫn không chắc chắn lắm.

Ví dụ:

php /home/account/public_html/script.php <- Thất bại

php-cli /home/account/public_html/script.php <- Thất bại

$(which php) /home/account/public_html/script.php <- Hoạt động trong CLI dưới dạng tuyến động, nhưng sẽ thất bại trong trình tạo cronan cPanel

/usr/local/bin/php /home/account/public_html/script.php <- Hoạt động trong trình xây dựng cronan cPanel, mặc dù đó là tuyến tĩnh đến php, do đó có thể khác trên máy chủ của bạn


Tôi nhớ ban đầu có một số vấn đề $(which php)khi ghi lại câu trả lời của mình, tuy nhiên điều này sẽ hữu ích cho người khác, và nói chung là những gì tôi sẽ sử dụng cho mình một cách bình thường. Tôi đã quên nếu đó là cPanel hoặc Plesk đã gây ra vấn đề của tôi.
tro

@ash Vâng Tôi nghe nói về bạn which php, đặc biệt là với trình quản lý đa php CloudLinux / WHM, ném env vào các phiên bản khác. Nói về những thứ mà người khác có thể cần, tôi đã gặp phải nhiều tai ương hơn vào ngày khác khi cố gắng để Vtiger xác nhận / chạy chính xác theo php-cli. Đã tạo một tập lệnh trợ giúp nhỏ cố gắng hiển thị thêm env infos (chẳng hạn như chỉ mục "_") nếu có ai cần khắc phục sự cố: gist.github.com/dhaupin/7c88be87a543e59f5be9fb55c7b963a9
dhaupin

1

Có thể có 2 giải pháp cho vấn đề cụ thể / hệ thống cụ thể này mà tôi biết:

Trong crontab: Thêm 2 dòng sau vào đầu của nó:

SCRIPT_NAME = "cron.php"

SCRIPT_FILENAME = "cron.php"

HOẶC LÀ

Gói nó vào CRON chính nó:

* / 5 * * * * SCRIPT_NAME = cron.php; SCRIPT_FILENAME = cron.php; php ~ / public_html / cron.php> / dev / null 2> & 1


0

Đây là những gì làm việc cho tôi trên Godaddy Cpanel:

/usr/local/bin/php -q /home/USERNAME/public_html/path_to_cron.php >/dev/null 2>&1

Và tôi đã phải sửa đổi cron.php, chỉ cần sử dụng

$isShellDisabled = true;

thay vì

$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;

Cảm ơn bạn vì đã đăng câu trả lời của bạn, điều đó khiến tôi cảm thấy đau đớn !!!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.