Для тех, кто находит это в будущем, я бы не рекомендовал использовать mail
. Есть несколько ответов, которые касаются этого, но не из-за этого.
Функция PHP mail
не только непрозрачна, но и полностью зависит от того, какой MTA вы используете (то есть Sendmail) для выполнения этой работы. mail
ТОЛЬКО скажет вам, не удалось ли MTA принять его (т. е. Sendmail не был отправлен, когда вы пытались отправить). Он не может сказать вам, была ли почта успешной, потому что она была передана. Как таковой (как детали ответов Джона Конде), вы теперь можете возиться с журналами MTA и надеяться, что он расскажет вам об отсутствии возможности исправить его. Если вы находитесь на общем хосте или не имеете доступа к журналам MTA, вам не повезло. К сожалению, по умолчанию для большинства ванильных инсталляций для Linux обрабатывается так.
Почтовая библиотека ( PHPMailer , Zend Framework 2+ и т. д.) делает что-то очень отличное от mail
. То, что они делают, это открыть сокет непосредственно на принимающем почтовом сервере, а затем отправить SMTP-почтовые команды непосредственно через этот сокет. Другими словами, класс действует как собственный MTA (обратите внимание, что вы можете сказать библиотекам использовать mail
, чтобы в конечном итоге отправить почту, но я настоятельно рекомендую вам не делать этого).
Что это означает, что вы можете непосредственно видеть ответы с принимающего сервера (например, в PHPMailer вы можете включить вывод отладки ). Больше не гадать, если почта не была отправлена или почему.
Если вы используете SMTP (то есть вы вызываете
isSMTP()
), вы можете получить подробную расшифровку протокола SMTP, используя свойствоSMTPDebug
.Установите этот параметр, включив в свой скрипт такую строку:
$mail->SMTPDebug = 2;
Вы также получаете преимущество лучшего интерфейса. С помощью
Оказывается, мое понимание сообщения об ошибке было неправильным. Я бы сказал, что у него очень плохой выбор слов. Googling around показал мне, что кто-то еще неправильно понял сообщение точно так же, как и я, - см. PHP-ошибку # 66763 .
После совершенно бесполезного «Это то, как хотели это RM». ответ на эту ошибку Майка, Тайраэль объясняет, что установка этого параметра на «-1» не означает, что предупреждение просто исчезнет. Он делает правильную вещь , т. Е. Полностью отключает заполнение переменной преступника. Оказывается, при установке значения 0 STILL заполняет данные при некоторых обстоятельствах. Расскажите о плохом дизайне! Чтобы указать PHP RFC :
Изменить always_populate_raw_post_data INI, чтобы принять три значения вместо двух.
- -1: Поведение мастер; никогда не заселяйте $ GLOBALS [HTTP_RAW_POST_DATA]
- 0 / off / whatever: поведение BC (заполняется, если тип содержимого не зарегистрирован или метод запроса отличен от POST)
- 1 / on / yes / true: поведение BC (всегда заполняет $ GLOBALS [HTTP_RAW_POST_DATA])
Так что, устанавливая его на -1, вы не только избегаете предупреждения, как сообщение но он также , наконец, отключает , заполняя эту переменную, что я и хотел.
Некоторое время, пока я не наткнулся на эту ошибку. Отправьте мой ответ всем, кто может наткнуться на эту проблему.
Ошибка означает только то, что вы отправляете пустой запрос POST. Эта ошибка обычно встречается в HTTPRequests без переданных параметров. Чтобы избежать этой ошибки, вы всегда можете добавить параметр к POST без изменения php.ini.
Нравится:
$.post(URL_HERE
,{addedvar : 'anycontent'}
,function(d){
doAnyHere(d);
}
,'json' //or 'html','text'
);
Для тех, кто все еще борется с этой проблемой после изменения php.init, как предполагает принятый ответ. Поскольку ошибка возникает, когда петиция ajax выполняется через POST
без какого-либо параметра, все, что вам нужно сделать, это изменить метод отправки на GET
.
var xhr = $.ajax({
url: url,
type: "GET",
dataType: "html",
timeout: 500,
});
Еще один вариант, если вы хотите сохранить метод POST
по какой-либо причине - добавить пустой объект JSON в ajax petititon.
var xhr = $.ajax({
url: url,
type: "POST",
data: {name:'emtpy_petition_data', value: 'empty'}
dataType: "html",
timeout: 500,
});
Если файл .htaccess
не avilable, создайте его в корневой папке и пропустите эту строку кода.
Поместите это в файл .htaccess
(проверено работоспособно для API)
<IfModule mod_php5.c>
php_value always_populate_raw_post_data -1
</IfModule>
Раскомментирование
always_populate_raw_post_data = -1
в php.ini (строка # 703) и перезапуск служб APACHE помогают мне избавиться от сообщения в любом случае
; Always populate the $HTTP_RAW_POST_DATA variable. PHP's default behavior is
; to disable this feature and it will be removed in a future version.
; If post reading is disabled through enable_post_data_reading,
; $HTTP_RAW_POST_DATA is *NOT* populated.
; http://php.net/always-populate-raw-post-data
; always_populate_raw_post_data = -1
Если вы используете WAMP ...
blockquote>, вы должны добавить или раскомментировать свойство
always_populate_raw_post_data
вphp.ini
и установить его значение в-1
. В моем случаеphp.ini
находится в:
C:\wamp64\bin\php\php5.6.25\php.ini
.. но если вы все еще получаете предупреждение (как и я)
Вы также должны установить
always_populate_raw_post_data = -1
вphpForApache.ini
:
C:\wamp64\bin\php\php5.6.25\phpForApache.ini
Если вы не можете найти этот файл, откройте окно браузера и перейдите к:
http://localhost/?phpinfo=1
и найдите значение файла Loaded Configuration File. В моем случае
php.ini
, используемый WAMP, находится в:blockquote>
C:\wamp64\bin\apache\apache2.4.23\bin\php.ini
(символическая ссылка на C: \ wamp64 \ bin \ php \ php5.6.25 \ phpForApache.ini)Наконец, перезапустите WAMP (или нажмите «перезапустить все службы»)
Я столкнулся с той же проблемой на сервере nginx (DigitalOcean) - мне нужно было войти в систему как root
и изменить файл /etc/php5/fpm/php.ini
.
Чтобы найти строку с always_populate_raw_post_data
Сначала я запускаю grep
:
grep -n 'always_populate_raw_post_data' php.ini
Это вернуло строку 704
704:;always_populate_raw_post_data = -1
. Затем просто откройте php.ini
в этой строке с помощью редактора vi
:
vi +704 php.ini
Удалите двоеточие, чтобы раскомментировать его и сохранить файл :wq
. Наконец, перезагрузите сервер, и ошибка исчезла.
php.ini
, вы, вероятно, используете конфигурацию разработки php.ini.
– BadHorsie
1 December 2015 в 14:23
Я получил это сообщение об ошибке при отправке данных из html-формы (метод Post). Все, что мне нужно было сделать, это изменить кодировку в форме от «text / plain» до «application / x-www-form-urlencoded» или «multipart / form-data». Сообщение об ошибке было очень ошибочным.
always_populate_raw_post_data = -1
. все еще теперь предупреждение о том, что и развращение ответа json – itsazzad 28 July 2015 в 12:01php.ini
и установить (или раскомментировать)always_populate_raw_post_data = -1
. – John 15 April 2016 в 21:20To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead.
– Andreas 15 May 2016 в 18:50