ubuntu下file_get_contents返回空字符串

  • |
  • 浏览:302
  • |
  • 更新:2014-03-30 10:11

本文起初面临的问题是PHP中SoapClient不好使,最后file_get_contents返回空字符串,通过解决这个问题,来解决SoapClient不好使的问题

工具/原料

  • php安装扩展Soap

方法/步骤

    1. 1

      最近PHP代码中在执行到

      $soapclient = new SoapClient('http://sdk.entinfo.cn:8060/webservice.asmx?WSDL');

      这条语句会抛出异常:

      Fatal error:  Uncaught SoapFault exception: [WSDL] SOAP-ERROR:
      Parsing WSDL: Couldn't load from
      'http://sdk.entinfo.cn:8060/webservice.asmx?WSDL' : Start tag expected,
      '<' not found
      in /ROOT/www/test.php:2
      Stack trace

    2. 2

      首先查看PHP是否安装了Soap扩展。查看phpinfo,可知安装了Soap扩展

    3. 3

      根据异常的情况 判断,意思大概是连文档的Start tag没有读到,

      1) 在浏览器中直接访问,发现是可以的,

      2) curl也是可以的

    4. 4

      1)于是用 file_get_contents(),获取内容,发现返回的是个空字符串。

      2) 于是检查 php.ini 中的 allow_url_open, 发现也是开这的

      3)遂进行如下测试:

      $file = fopen('http://www.example.com/', 'rb');     
      var_dump(stream_get_meta_data($file));

    5. 5

      /*
      输出结果:
      array(10) {

      ["wrapper_data"]=>
       array(2) {

      ["headers"]=>
         array(0) {
         }

      ["readbuf"]=>
         resource(38) of type (stream)

      }

      ["wrapper_type"]=>
       string(4) "cURL"

      ["stream_type"]=>
       string(4) "cURL"

      ["mode"]=>
       string(2) "rb"

      ["unread_bytes"]=>
       int(0)

      ["seekable"]=>
       bool(false)

      ["uri"]=>
       string(23) "http://www.example.com/"

      ["timed_out"]=>
       bool(false)

      ["blocked"]=>
       bool(true)

      ["eof"]=>
       bool(false)

      }

      */

    6. 6

      输出的结果中,

      wrapper_type为cURL,而且wrapper_data为空,这是不正常的,

      正常情况下wrapper_type应为
      http,wrapper_data数组中应该包含响应头信息。

      发现这个现象与--with-curlwrappers这个编译选项有
      关,遂查看PHP编译参数:

      $ php -i | grep configure

    7. 7

      Configure Command =>  './configure' '--prefix=/usr/local/php'
      '--with-config-file-path=/usr/local/php/etc'
      '--with-mysql=/usr/local/mysql'
      '--with-mysqli=/usr/local/mysql/bin/mysql_config'
      '--with-iconv-dir=/usr/local' '--with-zlib' '--with-libxml-dir=/usr'
      '--enable-xml' '--enable-bcmath' '--enable-shmop' '--enable-sysvsem'
      '--enable-inline-optimization' '--with-curl' '--with-curlwrappers'
      '--enable-mbregex' '--enable-fpm' '--enable-mbstring' '--with-mcrypt'
      '--with-openssl' '--with-mhash' '--enable-pcntl' '--enable-sockets'
      '--with-xmlrpc' '--enable-zip' '--enable-soap' '--enable-bcmath'

    8. 8

      --with-curlwrappers被启用了,问题应该出在这里,查看一下这个编译选项的用处:

      $ ./configure --help | grep curlwrappers

      --with-curlwrappers     EXPERIMENTAL: Use cURL for url streams

      看来--with-curlwrappers这个编译选项是用来处理url stream的,不过前面有个硕大的EXPERIMENTAL字样,还在试验中。 现有的解决方法是重新编译PHP,去掉「--with-curlwrappers」:

    9. 9

      1) $ cd /path/to/php-5.3.6  (切换到php安装目录)

      2) $ make clean (一定要make clean)

      3) $ ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql \
      --with-mysqli=/usr/local/mysql/bin/mysql_config --with-iconv-dir=/usr/local --with-zlib \
      --with-libxml-dir=/usr --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem \
      --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm  --enable-mbstring --with-mcrypt \
      --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip \
      --enable-soap --enable-bcmath -with-gd --with-jpeg-dir=/usr --with-png-dir=/usr --enable-gd-native-ttf

      4) $ make && make install

      5) $ cd /usr/local/php/bin
      # 删除旧的PHP binary文件,并用新的进行替换,Mac下重新编译后会产生php.dSYM文件,其他Linux系统请自行处理
      $ rm php && mv php.dSYM php

      6) 重启 php

    10. 10

      完成后,再做个测试:

      $file = fopen('http://www.example.com/', 'rb');
      var_dump(stream_get_meta_data($file));

      /*
      结果如下:

      array(10) {

      ["wrapper_data"]=>
       array(12) {

      [0]=>
         string(18) "HTTP/1.0 302 Found"

      [1]=>
         string(46) "Location: http://www.iana.org/domains/example/"

      [2]=>
         string(13) "Server: BigIP"

      [3]=>
         string(17) "Connection: close"

      [4]=>
         string(17) "Content-Length: 0"

      [5]=>
         string(15) "HTTP/1.1 200 OK"

      [6]=>
         string(35) "Date: Sun, 18 Mar 2012 06:12:27 GMT"

      [7]=>
         string(29) "Server: Apache/2.2.3 (CentOS)"

      [8]=>
         string(44) "Last-Modified: Wed, 09 Feb 2011 17:13:15 GMT"

      [9]=>
         string(21) "Vary: Accept-Encoding"

      [10]=>
         string(17) "Connection: close"

      [11]=>
         string(38) "Content-Type: text/html; charset=UTF-8"

      }

      ["wrapper_type"]=>
       string(4) "http"

      ["stream_type"]=>
       string(14) "tcp_socket/ssl"

      ["mode"]=>
       string(2) "rb"

      ["unread_bytes"]=>
       int(1225)

      ["seekable"]=>
       bool(false)

      ["uri"]=>
       string(23) "http://www.example.com/"

      ["timed_out"]=>
       bool(false)

      ["blocked"]=>
       bool(true)

      ["eof"]=>
       bool(false)
      }
      */

    11. 11

      wrapper_type变成了http,wrapper_data也被填充了,一切恢复正常。

      所以一条结论:慎用--with-curlwrappers

 

ubuntu下file_get_contents返回空字符串的更多相关文章

  1. vue 之 后端返回空字符串用 null 和 “”以及 undefind 判断不到的问题

    原文: <!-- <span v-if="scope.row.buyer_credit_score != '' || scope.row.buyer_credit_score ! ...

  2. 面试题:编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。(c++实现)

    实例说明 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: 输入: ...

  3. 唯一区别是不会去取emptyText 的值,没有选选择选项的时候返回是空字符串

    combox取值以及赋值的方法 function getValue() { //注意:以下这两种取值方法都会存在一个问题: 当combox设置成能输入并有只能提示的时候,当输入的不是备选项时,或到的v ...

  4. ASP.NET Core WebApi 返回统一格式参数(Json 中 Null 替换为空字符串)

    相关博文:ASP.NET Core WebApi 返回统一格式参数 业务场景: 统一返回格式参数中,如果包含 Null 值,调用方会不太好处理,需要替换为空字符串,示例: { "respon ...

  5. ubuntu下执行ulimit返回“不允许的操作”,问题解决思路

    在ubuntu下执行ulimit,希望修改允许的最大打开文件数,但返回“不允许的操作”. 使用ulimit -a查看当前配置 core file size (blocks, -c) 0 data se ...

  6. ubuntu下仅仅获取网卡一的ip地址 && shell中字符串拼接

    问题描述: ubuntu下仅仅获取网卡一的ip地址 问题背景: eth0,eth1,eth2……代表网卡一,网卡二,网卡三…… lo代表127.0.0.1,即localhost | 问题描述: 已知字 ...

  7. 如果不空null并且不是空字符串才去修改这个值,但这样写只能针对字符串(String)类型,如果是Integer类型的话就会有问题了。 int i = 0; i!=''。 mybatis中会返回tr

    mybatis 参数为Integer型数据并赋值0时,有这样一个问题: mybatis.xml中有if判断条件判断参数不为空时,赋值为0的Integer参数被mybatis判断为空,因此不执行< ...

  8. mysql 查询结果为null 或 空字符串时,返回指定字符串

    直接上代码, 亲测可用: SELECT IF ( ifnull( 字段, '' ) = '', '返回的字符串', 字段) AS 别名(或者不要也可以) FROM table

  9. springboot中返回值json中null转换空字符串

    在实际项目中,我们难免会遇到一些无值.当我们转JSON时,不希望这些null出现,比如我们期望所有的null在转JSON时都变成“”“”这种空字符串,那怎么做呢? Jackson中对null的处理 @ ...

随机推荐

  1. Python学习笔记6函数和代码复用

    1.函数 (1)定义: (2)函数调用 (3)函数的参数传递 参数传递的两种方式:函数调用时,参数可以按照位置或名称的方式传递 (4)函数的返回值 (5)局部变量和全局变量 (6)lambda函数 2 ...

  2. 转*SqlSever查询某个表的列名称、说明、备注、注释,类型等

    @原文地址 关键部分如下: ------sqlserver 查询某个表的列名称.说明.备注.类型等 SELECT 表名 then d.name else '' end, 表说明 then isnull ...

  3. 记录Queue插入的时候报错

    Queue 队列  特性  先进先出     和栈 Stack  非常相似 不过 栈 遵循 后进先出 Queue 和Stack 都存在数据并发的 问题 public static Queue<P ...

  4. K3精益版给物料添加属性,并在BOM中新增字段引用该属性

    1.给物料新增属性 打开“系统--基础资料--公共资料--核算项目管理”,然后双击物料,弹出核算项目类别-修改对话框.再点新增按钮: 输入你想新增字段的类型,长度,想要放置的位置. 相关属性里面选的是 ...

  5. spring与disruptor集成的简单示例[z]

    [z]https://www.jb51.net/article/135475.htm disruptor不过多介绍了,描述下当前的业务场景,两个应用A,B,应用 A 向应用 B 传递数据 . 数据传送 ...

  6. H5基础

    <html> <head lang="en"> <meta charset="utf_8">                 ...

  7. [DP][NOIP2013]花匠

    花匠 问题描述: 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致. ...

  8. paxos made more simple

    paxos算法是进入分布式领域的一块基石,有关paxos的讨论有很多精彩的详细论述,很多牛人不惜宝贵时间以大幅详尽段落叙述.感谢他们,paxos more simple 理解paxos前,我建议以面到 ...

  9. 文件操作命令(del)

    del 命令: // 描述: 删除一个或多个文件.同等于 erase 命令. 相比较 rd 命令来说,del 命令只能删除文件,不能删除文件夹. // 语法: del [/p] [/f] [/s] [ ...

  10. TwinStickShooter的一些问题

    TwinStickShooter模板应该是比较好的了解UE基本Pawn和Projectile的一个C++例子.以下是一些问题. 一.这个模板以纯C++编写,没有蓝图,所以第一步,我想测试下如何引用蓝图 ...