Предупреждение PHP: не удалось открыть поток: сбой HTTP-запроса

У меня два веб-сервера:

http://www.example.com.ar и eventos.example.com.ar

Я получаю такие ошибки, как:

[Ср, 16 сентября, 12:11:30.872792 2020] [php7:warn] [pid 17125] [client xx.yy.226.234:48896] Предупреждение PHP: file_get_contents ( https://eventos.example.com.ar/eventos/api/events?month=9&year = 1999): не удалось открыть поток: HTTP-запрос не прошел! HTTP/1.1 400 Bad Request\r\n в /var/www/www_example_com_ar/wp-content/plugins/example-plugin/mlc-plugin.php в строке 340

В строке 340-й есть:

$rest = file_get_contents('https://eventos.example.com.ar/eventos/api/events?month='.$month.'&year='.$year, true);

Я тестировал curl на том же хосте, на котором запущен http://www.example.com.ar, и не получаю такой ошибки:

curl -I "https://eventos.example.com.ar/eventos/api/events?month=9&year=1999"
HTTP/1.1 200 OK
Date: Wed, 16 Sep 2020 19:26:05 GMT
Server: Apache/2.4.39 () OpenSSL/1.0.2k-fips
X-DNS-Prefetch-Control: off
X-Frame-Options: SAMEORIGIN
Strict-Transport-Security: max-age=15552000; includeSubDomains
X-Download-Options: noopen
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Access-Control-Allow-Origin: *
Content-Type: application/json; charset=utf-8
Content-Length: 37027
ETag: W/"90a3-gzipB01lW17JrEb0GD0k0g2zFow"

Я установил:

  • Apache: httpd-2.4.6-90.el7.centos.x86_64
  • PHP: php73-php-7.3.15-1.el7.remi.x86_64

Кстати, у меня есть:

php73 -i | grep allow_url_fopen
allow_url_fopen => On => On

В CentOS 7.7

Итак, вопрос: что вызывает эту ошибку?

1 ответ

Можете добавить ignore_errors => true на ваш file_get_contentsпозвоните, чтобы получить полное сообщение. Это проигнорирует сообщение об ошибке, но вы сможете получить дополнительную информацию о том, что происходит. Дополнительная информация здесь (и не забудьте удалить его после, если вы хотите, чтобы он сломался, если возникнет другая ошибка.):

https://stackoverflow.com/questions/11475657/ignoring-errors-in-file-get-contents-http-wrapper/11479968#11479968

По моему опыту, эта ошибка, вероятно, связана с тем, что у вашего php нет корневого сертификата CA для проверки вызовов HTTPS. Добавление cacert.pem файл в свой экземпляр с конфигурацией в php.ini исправит эту проблему.

https://stackoverflow.com/questions/41772340/how-do-i-add-a-certificate-authority-to-php-so-the-file-function-trusts-certif

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

Другие вопросы по тегам