群里一位大佬上午说了一句箴言:「 世界上没有什么故障是重启解决不了的,如果有,再重启一次。」,结果下午群里就有一位朋友遇到了一个诡异的老版本 PHP 问题:当使用 file_get_contents 抓取网页内容的时候,总是返回空字符串,奇怪的是换用 curl 扩展后又一切正常。不过,重启没有解决他的问题,再重启一次也不行。
既然 curl 能够正常工作,至少可以证明网络本身没问题。
首先值得怀疑的是 allow_url_fopen 配置。如果没有开启它的话,
file_get_contents 是不能访问远程地址的。(排除!)
接着还怀疑过是不是和 ignore_errors 配置有关。(排除!)
然后尝试着用 strace、ltrace 跟踪了一下代码,发现目标服务器已经接收到了请求,并且成功返回了数据,可是 file_get_contents 就是返回空。
问题到了这里似乎没招儿了。试着查看了一下 PHP 的编译参数,发现了一个少见的选项:with-curl-wrappers,相对应的搜索到了 PHP RFC 里一篇介绍文章:Request for Comments: Removal of curl-wrappers,大概看了看,感觉这东西就是一个坑啊,基本锁定问题就是出在它身上。
试着去掉 with-curl-wrappers 重新编译一下 PHP,尼玛问题依旧!不过想到刚刚重新编译 PHP 的时间非常短,猜想是不是有什么残留数据干扰了结果,于是在「make」前加了一步「make clean」,终于一切都正常了!
记得小学写作文的时候,老师教我们要首尾呼应,那好吧,请允许我调皮一下:「 世界上没有什么故障是重启解决不了的,如果有,再重启一次。」
评论前必须登录!
注册