设置:
- cURL 7.32.0
- Apache 2.2.25
- PHP 5.5.4
每当我尝试:
$ch = curl_init('www.google.com');
curl_exec($ch);
var_dump(curl_error($ch));
在 PHP 中,我得到:
无法解析主机:www.google.com
如果我更改为curl_init('80.233.168.207')
(已解析 google.com),则脚本将执行。
虽然curl www.google.com
在 CLI 中运行时,我得到了一个302 Moved
HTML 页面,因为重定向到本地化站点 (*.lv),但这仍然意味着 cURL 已成功执行。
我见过多个类似的问题(但不在 SE 上),其中大多数都说 Apache 是在 Network Manager 之前或同时启动的,因此没有收到 DNS 信息。大多数问题的答案都解释说,可以通过明确停止然后启动 Apache 守护程序(而不是重新启动/优雅重启)来暂时解决/调试该问题。
fsockopen
,file_get_contents
但运行却十分顺畅。
我的 Apache 虚拟主机:
<VirtualHost *.777>
ServerAdmin [email protected]
ServerName localhost
DocumentRoot "/srv/stone/public"
ErrorLog "/srv/stone/app/storage/logs/apache-errors.log"
CustomLog "/srv/stone/app/storage/logs/apache-custom.log" common
<Directory /srv/stone/public>
php_admin_value open_basedir /
# Pretty URL rewrites, better not to rely on .htaccess
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
# Prevent further overrides
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
并且全局配置仅仅有一个特定的条目Listen 777
。
这和这,都导致 DNS 问题,所以,我想我可能也遇到了问题,而且,它看起来很像。
我尝试过将虚拟主机条目更改为0.0.0.0:777
和其他配置,但无济于事。
我该如何修复此问题?
答案1
看来问题出在我的身上/etc/resolv.conf
。
我设置了一个自定义网络连接管理器,它执行外部命令来从特定配置文件设置名称服务器。设置将简单地删除 的内容/etc/resolv.conf
,添加新信息,然后启动网络接口,设置其参数(IP、掩码、Cast、Gate),然后就好了。
显然这搞砸了。我想我必须寻找不同的 Before/After 目标并编写自定义resolv.conf
更新程序。
我现在确实留下了resolv.conf
静态,这似乎解决了这个问题。
最后,很明显这是 DNS 问题。谢天谢地,问题已经修复。
答案2
您是否尝试过 CURL_IPRESOLVE_V4 选项?
$ch = curl_init('www.google.com');
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_exec($ch);
var_dump(curl_error($ch));
如果使用 CURLOPT_HEADER 选项,标题的输出是什么?