2

我的本地 mac 主机无法以任何形式使用 PHP 的文件流包装器来处理 HTTP 请求(这是使用 composer 等所必需的)。

如果我使用 curl 驱动程序请求完全相同的资源,一切都很好。这是我直接从 PHP 文档中复制的两个程序:

这个是卷曲的,它每次都可以正常工作。

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1)
$output = curl_exec($ch);
curl_close($ch);
echo $output;

这个使用 fopen,并且在php.ini. 此失败与 file_get_contents 或任何其他基于文件流的方法相同。

<?php
$opts = [ 'http'=> [ 'method' => "GET" ]];

$context = stream_context_create($opts);
$fp = fopen('http://www.example.com', 'r', false, $context);
fpassthru($fp);
fclose($fp);

这导致:

Warning: fopen(http://www.example.com): 
failed to open stream: 
    Operation timed out in ...php on line ...

我试过 PHP 7.1 和 PHP 7.3。

这是我的 ini 文件的示例,其中设置减少:

allow_url_fopen = On
allow_url_include = Off
auto_append_file =
auto_globals_jit = On
auto_prepend_file =
default_charset = "UTF-8"
default_mimetype = "text/html"
default_socket_timeout = 60
display_errors = On
display_startup_errors = On
enable_dl = Off
engine = On
error_reporting = E_ALL
extension_dir = "/usr/local/lib/php/pecl/20180731"
file_uploads = On
html_errors = On
implicit_flush = Off
output_buffering = 4096

对于流在php --info

$ php --info  | grep -i stream
Registered PHP Streams => https, ftps, compress.zlib, compress.bzip2, php, file, glob, data, http, ftp, phar, zip
Registered Stream Socket Transports => tcp, udp, unix, udg, ssl, tls, tlsv1.0, tlsv1.1, tlsv1.2
Registered Stream Filters => zlib.*, bzip2.*, convert.iconv.*, string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*, consumed, dechunk
Stream Wrapper support => compress.bzip2://
Stream Filter support => bzip2.decompress, bzip2.compress
libXML streams => enabled
mbstring extension makes use of "streamable kanji code filter and converter", which is distributed under the GNU Lesser General Public License version 2.1.
Stream Wrapper => compress.zlib://
Stream Filter => zlib.inflate, zlib.deflate

一些事实:

  1. 我用brew.
  2. 所有 URL 都存在此问题
  3. 我们知道它不是防火墙(curl 有效)
  4. allow_url_fopenOn
  5. 仅在打开流时发生
  6. 多次安装 PHP 有这个问题。
  7. 即使使用 fstreamopen 连接$fp = fsockopen("1.1.1.1", 80, $errno, $errstr, 30);也有相同的延迟。
  8. 如果去掉域名直接使用1.1.1.1之类的IP,问题就没有了。但是,当我请求php -r "copy('http://54.36.53.46', 'composer-setup.php');"相同的超时失败时返回。
4

0 回答 0