PHP微信后台开发,报错FastCGI sent in stderr:

新手上路,请多包涵

微信公众号后台PHP开发,用api上传临时素材,因为使用PHP7.1,所以使用了CURLFile的方式上传,但一直报错,错误代码为13001,描述为 http get api error.
服务器nginx的error log中如下:

2017/09/06 21:26:52 [error] 11636#0: 24 FastCGI sent in stderr: "PHP message: {"ToUserName":"g0d5","FromUserName":"oMzDEwXXXXXXXwM4Lnog","CreateTime":"1504704409","MsgType":"image","PicUrl":"http://mmbiz.qpic.cn/mmbiz_jpg/JGPb7l14faUTFq22LmkBBSOXIAXXXXXLsZ0icnBQ/0","MsgId":"6462656227226399272","MediaId":"S-P1j9nuD0mh4hnF5ZJXXXXXXXh481CL5Nh"}
PHP message: <xml><ToUserName><![CDATA[oMzDEwQXXXXXXXXpkwM4Lnog]]></ToUserName><FromUserName><![CDATA[gh_XXXXXXXXe0d5]]></FromUserName><CreateTime>1504704412</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[http get api error.]]></Content></xml>" while reading response header from upstream, client: 103.7.30.104, server: wechat.XXXXXXX.site, request: "POST /main.php?signature=a2b6983c8e781f738cddfb54dd6b1a0416a6cf13&timestamp=1504704409&nonce=1401047094&openid=oMzDEwQF*wM4Lnog HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-71-cgi.sock:", host: "funwitXXXXXXXc"

php代码如下:

public function upload_media($type, $path)
    {
        $url = self::API_DOMAIN . 'cgi-bin/media/upload?access_token=' . $this->get_access_token() . '&type=' . $type;
        //$res = HttpCurl::post($url, array('media' => '@'.$path), 'json');
        $res = HttpCurl::post($url, array('media' => new \CURLFile(realpath($path))), 'json');
        // 异常处理: 获取时网络错误
        if ($res === false) {
            return Error::code('ERR_GET');
        }        
        // 判断是否调用成功
        if (isset($res->media_id)) {
            return array(null, $res);
        } else {
            return array($res, null);
        }
    }

其中post方法:

static public function post($url, $fields, $data_type='text')
    {
        $cl = curl_init();
        if (version_compare(phpversion(), '5.6') >= 0 && version_compare(phpversion(),'7.0')<0) {  // for php verseion >=5.6 && <7.0 ,2017/9/6
            curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);  
        }   
        if(stripos($url, 'https://') !== FALSE) {
            curl_setopt($cl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($cl, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($cl, CURLOPT_SSLVERSION, 1);
        }
        curl_setopt($cl, CURLOPT_URL, $url);
        curl_setopt($cl, CURLOPT_RETURNTRANSFER, 1 );
        curl_setopt($cl, CURLOPT_POST, true);

        curl_setopt($cl, CURLOPT_POSTFIELDS, $fields);
        $content = curl_exec($cl);
        $status = curl_getinfo($cl);
        curl_close($cl);

        if (isset($status['http_code']) && $status['http_code'] == 200) {
            if ($data_type == 'json') {
                $content = json_decode($content);
            }
            return $content;
        } else {
            return FALSE;
        }
    }

调用(当用户发送相关消息时候调用,如果直接回复文本没问题):

list($err, $res) = $api->upload_media('image', $filename);
return $err->{'errmsg'};
//return $res->{'media_id'};

$filename 的格式大概是"./image/XXXX.jpg"

access token的获取后台可以看到成功记录,应该没问题。

感觉应该是服务器的问题,求助!

阅读 4.5k
1 个回答

图片路径采用绝对路径 $param ['media'] = new CURLFile(dirname(__FILE__)."/a.jpg");

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题