zoukankan      html  css  js  c++  java
  • CURL不可以读写文件

      最近在学ES(elastic search),参考http://www.learnes.net/里面翻译的官方权威指南(后面发现官网已经推出了中文版文档了)。里面有的例子把访问ES的命令做了简化如下:

    curl -XGET 'localhost:9200/_count?pretty' -d '
    {
        "query": {
            "match_all": {}
        }
    }'
    
    //简化为
    GET /_count
    {
        "query": {
            "match_all": {}
        }
    }
    

      而且命令行不能回车,所以想了个办法,写个脚本,读一个命令文件,文件里面就是简化后的命令,转化为完整的命令后执行。本来有可以选择Python或者Shell,但毕竟是搞PHP的,所以还是决定用PHP写。PHP执行外部命令的方式有好几种,以前用过popen,这次就接着用。然后执行命令的时候提示:writing body failed。

      一开始我以为是ES报的错,进ES的日志,发现没有日志。然后觉得是不是发送命令的时候把json数据转化为字符串的时候出了问题,确认发现不是,后面就知道了CURL的说明文档。这个是curl命令的一种标准错误,原因是curl无法写本地文件。那curl写了什么文件?自然就是pipe文件,换了一种方式调用curl命令,改用PHP的system方法,问题果然解决。

      关于curl的这个错误,stackoverflow上也有人问,虽然我还没找到真正的原因,但是找到了报同样错误的一个例子:https://stackoverflow.com/questions/16703647/why-curl-return-and-error-23-failed-writing-body。

      虽然说有时候使用pipe会让curl失败,但是冰美人说清楚为什么会失败。但是里面提到了一种肯定失败的情况:pipe下有命令在curl写完成之前退出,比如grep -qs foo。grep找到foo之后就退出并关闭管道。

    curl -X GET 'http://php.net/manual/zh/function.uniqid.php' | grep  -qs 'html'
    

      这里需要选择一个内容多一点的页面,如果选择像'www.baidu.com'这样的简单页面的话,写pipe可能就一次性写完退出了,就不会报错。

      CURL文档可以参考http://aiezu.com/article/linux_curl_command.html。

      Mark一下!

  • 相关阅读:
    HA 高可用集群概述及其原理解析
    iOS 平台上常见的安装包有三种,deb、ipa 和 pxl
    爪洼人的第五天
    Java基础数组篇
    猛男学Java的第四天
    猛男学习JAVA的第三个日子
    猛男学习Java的第二天
    【笔记】ubuntu12.04 添加启动器图标的办法(解决启动器图标消失的问题)
    【笔记】Ubuntu12.04键盘图标(输入法图标)不见后重新显示方法
    【笔记】ubuntu下手动更新firefox浏览器
  • 原文地址:https://www.cnblogs.com/hujichen/p/7283739.html
Copyright © 2011-2022 走看看