Приложение Codeigniter SaaS - Динамический выбор базы данных по заданию клиента - PullRequest
0 голосов
/ 30 мая 2018

Я разработал мультитенантное приложение в Codeigniter, как указано в http://anantgarg.com/2013/06/10/build-a-php-saas-app-from-scratch, и все работает отлично.Теперь я хочу добавить в свое приложение функциональность cron.во время поиска в Интернете я нашел несколько ссылок https://www.heatware.net/programming-php/manage-cron-jobs-database-codeigniter https://glennstovall.com/writing-cron-job-in-codeigniter, а также создал библиотеку Codeigniter

class CronRunner {
var $ci;
var $ci_cron_db;
var $ci_cron_table;
public function __construct() {

    $this->ci = & get_instance();

    $this->ci->load->helper('url');
    $this->ci->load->library('user_agent');
    $this->ci->load->library('session');
    $this->ci->load->database();

    $this->ci_cron_db = $this->ci->db;
    $this->ci_cron_table = 'crn_crons';

}

private function calculateNextRun($obj) {
    return (time() + $obj->interval_sec);
}

public function run() {
    $query = $this->ci_cron_db->where('is_active', 1)->where('now() >= next_run_at OR next_run_at IS NULL', '', false)->from($this->ci_cron_table)->get();
    if ($query->num_rows() > 0) {

        $env = getenv('CI_ENV');

        foreach ($query->result() as $row) {
            $cmd = "export CI_ENV={$env} && {$row->command}";
            $this->ci_cron_db->set('next_run_at', 'FROM_UNIXTIME(' . $this->calculateNextRun($row) . ')', false)->where('id', $row->id)->update($this->ci_cron_table);
          $output = shell_exec($cmd);
            $this->ci_cron_db->set('last_run_at', 'now()', false)->where('id', $row->id)->update($this->ci_cron_table);
        }
    }
}
}

, и я добился динамического выбора БД с помощью пользовательского файла конфигурации, такого какниже

$host = $ci->input->server('HTTP_HOST');

с использованием $ host я пройду мою основную базу данных и загрузу клиентскую базу данных.

//Database Config
$config['app_host'] = $app_db_host;
$config['app_database'] = $app_db_database;
$config['app_username'] = $app_db_username;
$config['app_password'] = $app_db_password;

в моей database.php

$ci = get_instance();

$db['default'] = array(
    'dsn' => '',
    'hostname' => $ci->config->item('app_host'),
    'username' => $ci->config->item('app_username'),
    'password' => $ci->config->item('app_password'),
    'database' => $ci->config->item('app_database'),

до этого все работало нормально.

теперь мне нужно добиться того же из командной строки для моей функциональности cron.Поскольку я пытаюсь вызвать скрипт из командной строки, а не с веб-сервера, я не смог получить значение HTTP_HOST.к сожалению, до сих пор мое приложение полностью зависит от HTTP_HOST для выбора клиента.

любые идеи или подходы для достижения этого как в командной строке, так и в веб-сервере?

Заранее спасибо ..

1 Ответ

0 голосов
/ 29 июня 2018

Для инструмента SaaS, которым я управляю, в crontab у меня есть одна строка на клиента

1 * * * *        php /home/www/cron.php <customer-token1>
1 * * * *        php /home/www/cron.php <customer-token2>
1 * * * *        php /home/www/cron.php <customer-token3>

Таким образом, каждый раз, когда у меня появляется новый клиент, он добавляет новую строку в crontab с токеном клиента или клиентомимя, как хочешь ...

...