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. POJ-1860.CurrencyExchange(Spfa判断负环模版题)

    本题思路:每完成一次交换之后交换余额多于原钱数则存在正环,输出YES即可. 参考代码: #include <cstdio> #include <cstring> #includ ...

  2. 【转】Cisco交换机策略路由

    [转自]https://blog.csdn.net/kkfloat/article/details/39940623 1.概念 1)策略路由(PBR)是一种比基于目标网络进行路由更加灵活的数据包路由转 ...

  3. project2

    [概念] 要好好理解并且背下来记住 Java基础,呵呵呵.自己查吧. local host搞错了,整个跑不出来.真尴尬.不理解啊. static原来是全局的意思啊,好吧.以前都忘了,这次该记住了.st ...

  4. jquery点击回到顶部

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. mysql启动服务

    mysql.server start 启动mysql服务mysql.server stop 停止mysql服务 mysql密码:123456Az_

  6. Failed to create agent because it is not close enough to the NavMesh

    主要原因是:两个相同对象navmesh点太近造成. 解决方案:通过NavMesh.SamplePosition 获得可以行走点 ;i<;i++) { , mRadius); , 3.14f); ...

  7. 使用串口安装centos操作系统

    https://linuxconfig.org/how-to-force-text-mode-installation-of-redhat-linux https://www.centos.org/f ...

  8. cpptest测试总结

    项目继续,持续新增中-- 桩函数设置 桩 (函参指针赋值) √:fun(*p) { for(int i = 0; i<6; i++) p[i] = 10; } ×:fun(*p) { for(i ...

  9. 2019-1-24 Spark 学习 --总体架构

    2019-1-24 Spark 学习 --总体架构 新建 模板 小书匠 1548339392539.jpg 1548339357270.jpg 1548339372461.jpg 1548339345 ...

  10. Scrum冲刺阶段6

    成员今日完成的任务 人员 任务 何承华 学习后端设计 陈宇 后端设计 丁培辉 学习后端设计 温志铭 信息界面设计 杨宇潇 信息界面界面设计 张主强 服务器构建学习 成员遇到的问题 人员 问题 何承华 ...