Codeigniter "require (./ vendor / autoload. php): не удалось открыть поток" ошибка, только если она запускается cronjob - не проблема composer, по-видимому - PullRequest
0 голосов
/ 12 января 2020

Это очередной вопрос, который можно найти по адресу Не работает cPanel cronjob на виртуальном хостинге под Codeigniter , и его стоит задать отдельно. Это контекст:

  1. используется структура codeigniter * Планировщик 1006 *
  2. определяется как контроллер и вызывается cronjob
  3. веб-сервер является общим хостингом, управляемым с помощью cPanel
  4. cronjobs работают должным образом, если определены как чистые PHP единицы вне codeigniter
  5. контроллер расписания, если вызывается браузером, работает нормально: https://pharmacomparison.com/adminPanel/Hello/message/federico
  6. тот же планировщик, если он запускается cronjobs с правильной строкой cli, завершается неудачно
    • бегущая строка в cronjob: / usr / local / bin / php public_html / adminPanel / index. php Hello сообщение "federico"
    • возникающая ошибка: Предупреждение: требуется (./ vendor / autoload. php): не удалось открыть поток: нет такого файла или каталога в / home / phar263d / public_html / adminPanel / index. php в строке 66

Обратите внимание: ссылка на требуемый файл "./vendor/autoload.php" работает правильно, когда планировщик вызывается прямым URL, но то же самое не удается, когда элемент управления r называется cronjob. Тот же контроллер, тот же индекс. php, тот же проект. Любые идеи? Спасибо.

PS просто в качестве ссылки здесь просто тестируемый код

<?php

if (!defined('BASEPATH')) exit('No direct script access allowed');
require 'DashboardBase.php';

class Hello extends CI_Controller {

        public function message($to = 'World')
        {
                echo "Hello {$to}!".PHP_EOL;
                print "Hello {$to}!".PHP_EOL;
                log_message('error',"Hello {$to}!".PHP_EOL);
        }
}

?>

ОБНОВЛЕНИЕ

Я пытался заставить абсолютный путь и на самом деле эта проблема исчезает; и многие другие пути в системе CI и файлы поставщиков выглядят следующим образом:

Notice: Undefined index: log_path in /home/phar263d/public_html/adminPanel/system/core/Log.php on line 127

Notice: Undefined index: log_path in /home/phar263d/public_html/adminPanel/system/core/Log.php on line 127

Warning: mkdir(): Invalid path in /home/phar263d/public_html/adminPanel/system/core/Log.php on line 131

Notice: Undefined index: log_threshold in /home/phar263d/public_html/adminPanel/system/core/Log.php on line 138

Notice: Undefined index: log_threshold in /home/phar263d/public_html/adminPanel/system/core/Log.php on line 142

A PHP Error was encountered

Severity:    Notice
Message:     Undefined index: HTTP_HOST
Filename:    /home/phar263d/public_html/adminPanel/application/config/config.php
Line Number: 41

Backtrace:
        File: /home/phar263d/public_html/adminPanel/application/config/config.php
        Line: 41
        Function: _error_handler

        File: /home/phar263d/public_html/adminPanel/index.php
        Line: 318
        Function: require_once


Hello federico!
real path /home/phar263d/public_html/adminPanel/vendor/autoload.phpHello federico!

Это означает, что когда сценарий планировщика php, вызываемый CLI / cronjobs, имеет совершенно другую среду и ссылки на базовые папки с уважением когда он запущен веб-сервером. Любая идея, как запустить планировщик PHP с помощью CLI, имеющего ту же справочную среду веб-сервера?

ВОЗМОЖНОЕ РЕШЕНИЕ

Я нашел обходной путь, но он имеет недостаток, так что это не решение проблемы. Обходной путь заключается в следующем: определите вызывающий скрипт вне пространства Codeigniter, которое вызывается cronjob. Затем скрипт запрашивает URL-адрес планировщика Codeigniter. Вот простой код скрипта, запускаемого cronjob:

<?php


  $payload = file_get_contents('https://pharmacomparison.com/adminPanel/Hello/message/federico');

  echo $payload;
  return $payload;
?>

Проблема заключается в том, что таким образом планировщик должен быть доступен извне, иначе скрипт cronjob не сможет получить к нему доступ; это, очевидно, нарушение безопасности. Итак, что нужно, это способ сохранить среду WEB и все переменные и константы при вызове из CLI; Я нахожу странным, что нет упоминаний об этом даже в руководстве по Codeigniter. Есть идеи?

...