Я хочу автоматически создать файл миграции в Codeigniter 3. Проблема в том, что когда я генерирую имя файла с отметкой времени, я использую date_default_timezone_set
, как этот код ниже, но он не работает. Я пробовал использовать аналогичную конструкцию в других контроллерах, и они работают очень хорошо. Я пробовал другие способы, такие как установка часового пояса в index.php или файле конфигурации, но они тоже не работали. Что мне не хватает?
<?php defined('BASEPATH') OR exit('No direct script access allowed');
class Migrate extends CI_Controller {
function __construct()
{
parent::__construct();
date_default_timezone_set('Asia/Ho_Chi_Minh');
if ( !$this->input->is_cli_request() ) {
show_error('You don\'t have permission for this action', 403);
return;
}
$this->load->library('migration');
}
public function generate($name = false)
{
if ($name === false) {
echo 'Please define migration name' . PHP_EOL;
return;
}
if ( !preg_match('/^[a-z_]+$/i', $name) ) {
echo 'File name must contain only a-z characters' . PHP_EOL;
return;
}
var_dump(ini_get('date.timezone')); // see set timezone here
$fileName = sprintf('%d_%s.php', date('YmdHis'), $name);
try {
$folderPath = APPPATH . 'migrations/';
if ( !is_dir($folderPath) ) {
try {
mkdir($folderPath);
} catch (Exception $e) {
echo 'Error on create folder: ' . $e->getMessage() . PHP_EOL;
}
}
$filePath = $folderPath . $fileName;
if (file_exists($filePath)) {
echo 'File already exists' . PHP_EOL;
return;
}
$data['className'] = $name;
$data = '<?php ' . $this->load->view('migrations/migration-template', $data, true);
try {
if (file_put_contents($filePath, $data) !== false)
echo 'Migration file was created successfully' . PHP_EOL;
} catch (Exception $e) {
echo $e->getMessage() . PHP_EOL;
}
} catch (Exception $e) {
echo $e->getMessage() . PHP_EOL;
}
}
}
Извините за нечеткое описание. Я использовал var_dump(ini_get('date.timezone')); // see set timezone here
, чтобы узнать, какой часовой пояс установлен: «Европа / Берлин», а не Asia / Ho_Chi_Minh, как я ожидал.
Проблема в том, что используемая вами команда set работает только для этого сценария и не изменяет ini. Итак, получив значение ini, у вас теперь есть несовпадающие часовые пояса.
Вместо этого используйте date_default_timezone_get()
http://be2.php.net/manual/en/function.date-default-timezone-get.php
Или используйте как ini_set()
, так и ini_get()
.
Код ниже взят из установленной страницы руководства http://be2.php.net/manual/en/function.date-default-timezone-set.php:
<?php
date_default_timezone_set('America/Los_Angeles');
$script_tz = date_default_timezone_get();
if (strcmp($script_tz, ini_get('date.timezone'))){
echo 'Script timezone differs from ini-set timezone.';
} else {
echo 'Script timezone and ini-set timezone match.';
}
Итак, чтобы подвести итог, не смешивайте две функции вместе!
Спасибо! Я использую date_default_timezone_get
и он работает
Рад, что смог помочь, можете ли вы отметить это как правильный ответ?
Да, я сделал это. ;)
Загрузите часовой пояс в файл config / autoload.php вверху страницы.
date_default_timezone_set ('Америка / Лос-Анджелес');
"но это не работает". Это бесполезно. Какой ввод? Какой ожидаемый результат? Какой реальный выход? Какие есть ошибки или уведомления error_log?