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一下!

  • 相关阅读:
    Chrome
    给Xshell增加快速命令集
    Integer对象大小比较问题
    maven的mirror和repository加载顺序
    maven的settings.xml详解
    OAuth2.0 RFC 6749 中文
    Linux下netstat命令简单操作
    Linux里的几种不同的压缩命令小记
    [ASIS 2019]Unicorn shop
    Metasploit魔鬼训练营第一章作业
  • 原文地址:https://www.cnblogs.com/hujichen/p/7283739.html
Copyright © 2011-2022 走看看