Получение ошибки/предупреждений PHP при использовании CodeIgniter 2 для отправки электронной почты

Я использую Ion Auth и пытаюсь реализовать функцию забытого пароля, которая зависит от отправки электронного письма из CI. Мой сервер LAMP находится в общей учетной записи cPanel и использует sendmail. Однако у меня есть возможность переопределить любые настройки PHP с помощью моего собственного файла php.ini в каталоге public_html.

В соответствии с документацией CodeIgniter 2 для настройки отправки электронной почты я выполнил следующий...

1) создал файл с именем, расположенный по адресу application/config/email.php

2) email.php содержит этот код:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| EMAIL SENDING SETTINGS
| -------------------------------------------------------------------
*/

$config['protocol'] = 'sendmail';

/* End of file email.php */
/* Location: ./application/config/email.php */

3) В файле application/config/ion_auth.php я установил это значение на TRUE

$config['use_ci_email'] = TRUE;

Электронное письмо успешно отправлено, но я получаю различные предупреждения об ошибках PHP на всех страницах.

Они появляются на всех страницах, иногда два или три раза подряд:

Произошла ошибка PHP

Серьезность: предупреждение

Сообщение: date() [function.date]: небезопасно полагаться на системные настройки часового пояса. Вам обязательно использовать параметр date.timezone или функцию date_default_timezone_set(). Если вы использовали какой-либо из этих методов и все еще получаете это предупреждение, вы, скорее всего, ошиблись в идентификаторе часового пояса. Вместо этого мы выбрали «Америка/Нью-Йорк» для «EST/-5.0/без летнего времени».

Имя файла: библиотеки/Email.php

Номер строки: 704

Произошла ошибка PHP

Серьезность: предупреждение

Сообщение: date() [function.date]: небезопасно полагаться на системные настройки часового пояса. Вам обязательно использовать параметр date.timezone или функцию date_default_timezone_set(). Если вы использовали какой-либо из этих методов и все еще получаете это предупреждение, вы, скорее всего, ошиблись в идентификаторе часового пояса. Вместо этого мы выбрали «Америка/Нью-Йорк» для «EST/-5.0/без летнего времени».

Имя файла: библиотеки/Email.php

Номер строки: 709

В дополнение к вышеперечисленному, эти два также появляются после отправки формы забытого пароля:

Произошла ошибка PHP

Серьезность: предупреждение

Сообщение: Невозможно изменить информацию заголовка — заголовки уже отправлены (вывод начался в /home/username/codeigniter/system/core/Exceptions.php:185)

Имя файла: библиотеки/Session.php

Номер строки: 675

Произошла ошибка PHP

Серьезность: предупреждение

Сообщение: Невозможно изменить информацию заголовка — заголовки уже отправлены (вывод начался в /home/username/codeigniter/system/core/Exceptions.php:185)

Имя файла: helpers/url_helper.php

Номер строки: 540

Я не уверен, почему я буду получать эти предупреждения об ошибках или как еще я должен настроить параметры отправки электронной почты. Я не вижу в документации никаких других параметров отправки электронной почты, связанных с этими конкретными предупреждающими сообщениями. Когда я удаляю свой файл config/email.php И устанавливаю для Ion Auth use_ci_email значение FALSE, предупреждения об ошибках исчезают.

Где я ошибся?


person Sparky    schedule 05.12.2012    source источник
comment
+1 Почему бы не опубликовать это сейчас как ответ? Это допустимый метод в SO.   -  person Tivie    schedule 06.12.2012
comment
@Тиви, я знаю. Две причины: 1. то, как я это исправил, может быть необычным, и 2. я хочу сначала посмотреть, как это сделают другие.   -  person Sparky    schedule 06.12.2012
comment
проверьте мой отредактированный пост и посмотрите, поможет ли это   -  person Tivie    schedule 06.12.2012


Ответы (3)


К КИ это отношения не имеет. PHP требует, чтобы вы установили параметр date.timezone.

См. http://php.net/manual/en/datetime.configuration.php#ini.date.timezone

person Greg Bair    schedule 05.12.2012
comment
Грег прав, также заголовки, уже отправленные ошибки, вызваны тем, что ошибка date.timezone выводится в браузер, исправьте директиву PHP date.timezone, и она исправит все ошибки. - person cryptic ツ; 06.12.2012
comment
Согласно моей странице phpinfo.php, значения local и master для date.timezone установлены на America/New_York. Это значение действительно, насколько я знаю. Кроме того, как насчет других ошибок/предупреждений, которые у меня есть? - person Sparky; 06.12.2012
comment
Это не имеет ничего общего с CI ~ это может быть правдой, а может и нет, но я вижу эти ошибки только тогда, когда CI содержит config/email.php или когда Ion Auth настроен на использование функции электронной почты CI. - person Sparky; 06.12.2012
comment
@Sparky672 Sparky672 Еще раз проверьте часовой пояс по умолчанию в файле php.ini. Или, может быть, какой-то сторонний скрипт сбрасывает часовой пояс. Перед запуском почтового скрипта проверьте часовой пояс с помощью date_default_timezone_get(). - person Tivie; 06.12.2012
comment
@Tivie, в public_html/php.ini нет настроек часового пояса, и, поскольку это виртуальный хостинг, у меня нет доступа к php.ini для всего сервера. phpinfo.php также показывает Default timezone как America/New_York. - person Sparky; 06.12.2012
comment
@Sparky672Sparky672 как насчет .htaccess? Если скрипт жалуется на часовой пояс, а часовой пояс правильно установлен в php_info(), тогда что-то должно отличаться в этих двух местах. - person Tivie; 06.12.2012
comment
@Tivie, в .htaccess ничего не настраивается в отношении PHP или часового пояса. Я думаю, что мне нужно опубликовать фактическое решение раньше, чем позже. Потому что я тоже очень хотел бы знать, как то, что я сделал, вызвало ошибки часового пояса. - person Sparky; 06.12.2012
comment
@Tivie, я опубликовал свой ответ ... извините за задержку. - person Sparky; 06.12.2012

Одна вещь странная, это расположение php.ini. Я имею в виду, что в папке public_html php.ini может быть доступен для чтения всем, что может быть не самой лучшей идеей.

В любом случае, один из способов решить эту проблему — создать файл test.php в папке public_html только с phpinfo(INFO_CONFIGURATION); и проверить настройки (например, include_path или allow_url_fopen). Затем создайте php.ini в той же папке (с некоторыми настройками, такими как allow_url_fopen) и посмотрите, изменилось ли что-нибудь в phpinfo(INFO_CONFIGURATION).

Я предполагаю, что либо:

  • Файл public_html/.htaccess указывает Apache прочитать настройки php из файла php.ini, расположенного в папке public_html.
  • У вашего хостинг-провайдера есть cpanel с mod_suphp (очень часто). suPHP по умолчанию позволяет каждому пользователю устанавливать свой собственный php.ini по своему усмотрению. Он переопределяет файл php.ini системы.

См. эту ссылку и этот


В любом случае вы можете настроить параметры php.ini, не переопределяя их полностью, одним из следующих способов:

  • Установите настройки в корне аккаунта .htaccess.
  • создать скрипт, который считывает и применяет настройки

Имейте в виду, что таким образом можно переопределить только параметры среды выполнения, помеченные как PHP_INI_ALL. Перейдите по этой ссылке для получения дополнительной информации о режиме настроек и это полный список изменяемых настроек php.ini


Первый способ очень прост:

.htaccess файл

<IfModule mod_php5.c>
  php_value date.timezone "Europe/Lisbon"
  php_admin_flag engine on
</IfModule>

Второй использует пользовательский phpini.file

  1. Создайте файл с именем myphpini.ini (или что-то подобное) и поместите туда свои пользовательские настройки.
  2. Затем создайте файл с именем configphp.php (или что-то подобное), который читается как myphpini.ini.
  3. Включите configphp.php вверху ваших скриптов (или в файле начальной загрузки CI2)

configphp.php

$config = parse_ini_file('myphpini.ini);
foreach ($config as $key => $val) {
    print 'before->' . ini_get($key) . '<br/>';
    ini_set($key, $val);
    print 'after->' . ini_get($key) . '<br/>';
}

держите нас в курсе как все получилось

person Tivie    schedule 06.12.2012
comment
Я должен проверить, проверить, проверить, прежде чем я открою свой большой рот. Рефакторинг моего опубликованного ответа. - person Sparky; 06.12.2012
comment
Я сделал предположение, которое, по-видимому, было неверным. Я предположил, что удаление всего моего файла php.ini, содержащего только одну вещь, allow_url_fopen = off эквивалентно простому удалению строки... видимо, это не так. - person Sparky; 06.12.2012
comment
А, это имеет смысл. Итак, что происходило, так это то, что public_html/php.ini переопределял системный php.ini. Это на самом деле очень интересно, хотя, вероятно, это что-то специфичное для вашего сервера веб-хостинга. - person Tivie; 06.12.2012
comment
Смотрите изменения в моем ответе. Я до сих пор не совсем понимаю, что здесь произошло. Я думал, что если бы у меня был пользовательский php.ini, то только эти элементы были бы перезаписаны... вместо этого, значение по умолчанию, такое как date.timezone, отменяется, если оно специально не переопределено. Заставляет меня не хотеть иметь пользовательский php.ini. - person Sparky; 06.12.2012
comment
Расположение моего пользовательского php.ini было моей идеей, экспериментом и сделанным по полному невежеству. Мне нравятся ваши предложения, и я попробую их завтра. - person Sparky; 06.12.2012
comment
Как ни странно, изменения часового пояса, которые я поместил в свой файл .htaccess, похоже, не работают в соответствии со страницей phpinfo.php. - person Sparky; 06.12.2012

Я никогда не должен был создавать свой собственный php.ini файл. Я построил его неправильно, и я разместил его в неправильном месте. Несмотря на то, что я думал, что знал проблему, когда задавал вопрос, я этого не знал. Мой плохой файл php.ini был основным источником этой проблемы.

person Sparky    schedule 21.12.2012